@capillarytech/creatives-library 8.0.353-alpha.6 → 8.0.354
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants/unified.js +0 -29
- package/index.html +1 -0
- package/package.json +1 -1
- package/services/tests/api.test.js +20 -35
- package/utils/cdnTransformation.js +63 -3
- package/utils/commonUtils.js +1 -19
- package/utils/tests/cdnTransformation.test.js +111 -0
- package/v2Components/CapActionButton/constants.js +0 -7
- package/v2Components/CapActionButton/index.js +108 -166
- package/v2Components/CapActionButton/index.scss +6 -157
- package/v2Components/CapActionButton/messages.js +3 -19
- package/v2Components/CapActionButton/tests/index.test.js +17 -41
- package/v2Components/CapTagList/index.js +0 -10
- package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +49 -72
- package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -213
- package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
- package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +10 -85
- package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
- package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -79
- package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
- package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +15 -157
- package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +76 -346
- package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +4 -133
- package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
- package/v2Components/CommonTestAndPreview/constants.js +2 -38
- package/v2Components/CommonTestAndPreview/index.js +186 -691
- package/v2Components/CommonTestAndPreview/messages.js +3 -45
- package/v2Components/CommonTestAndPreview/sagas.js +6 -25
- package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -308
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
- package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
- package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
- package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -132
- package/v2Components/CommonTestAndPreview/tests/sagas.test.js +26 -36
- package/v2Components/FormBuilder/index.js +6 -11
- package/v2Components/TemplatePreview/_templatePreview.scss +23 -38
- package/v2Components/TemplatePreview/index.js +31 -143
- package/v2Components/TemplatePreview/tests/index.test.js +0 -142
- package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
- package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
- package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
- package/v2Containers/CreativesContainer/SlideBoxContent.js +4 -36
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +1 -10
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -29
- package/v2Containers/CreativesContainer/constants.js +0 -9
- package/v2Containers/CreativesContainer/index.js +103 -322
- package/v2Containers/CreativesContainer/index.scss +1 -51
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -78
- package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -357
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
- package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
- package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
- package/v2Containers/Rcs/constants.js +10 -119
- package/v2Containers/Rcs/index.js +818 -2450
- package/v2Containers/Rcs/index.scss +8 -280
- package/v2Containers/Rcs/messages.js +3 -34
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +70073 -98018
- package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +5 -0
- package/v2Containers/Rcs/tests/index.test.js +121 -152
- package/v2Containers/Rcs/tests/mockData.js +0 -38
- package/v2Containers/Rcs/tests/utils.test.js +30 -646
- package/v2Containers/Rcs/utils.js +11 -478
- package/v2Containers/Sms/Create/index.js +40 -106
- package/v2Containers/SmsTrai/Create/index.js +4 -9
- package/v2Containers/SmsTrai/Edit/constants.js +0 -2
- package/v2Containers/SmsTrai/Edit/index.js +130 -640
- package/v2Containers/SmsTrai/Edit/messages.js +4 -14
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2296 -4249
- package/v2Containers/SmsWrapper/index.js +8 -37
- package/v2Containers/TagList/index.js +0 -6
- package/v2Containers/Templates/_templates.scss +9 -166
- package/v2Containers/Templates/actions.js +0 -11
- package/v2Containers/Templates/constants.js +0 -2
- package/v2Containers/Templates/index.js +52 -120
- package/v2Containers/Templates/sagas.js +18 -57
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1017 -1062
- package/v2Containers/Templates/tests/sagas.test.js +39 -205
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
- package/v2Containers/TemplatesV2/index.js +23 -86
- package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
- package/v2Containers/Whatsapp/index.js +20 -3
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
- package/utils/rcsPayloadUtils.js +0 -92
- package/utils/templateVarUtils.js +0 -201
- package/utils/tests/rcsPayloadUtils.test.js +0 -226
- package/utils/tests/templateVarUtils.test.js +0 -204
- package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
- package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
- package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
- package/v2Components/SmsFallback/constants.js +0 -73
- package/v2Components/SmsFallback/index.js +0 -956
- package/v2Components/SmsFallback/index.scss +0 -265
- package/v2Components/SmsFallback/messages.js +0 -78
- package/v2Components/SmsFallback/smsFallbackUtils.js +0 -119
- package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
- package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
- package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
- package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -223
- package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
- package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
- package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
- package/v2Components/TemplatePreview/constants.js +0 -2
- package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
- package/v2Components/VarSegmentMessageEditor/index.js +0 -125
- package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
- package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -43
- package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
- package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
- package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
- package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -225
- package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
- package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
- package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
- package/v2Containers/SmsTrai/Edit/index.scss +0 -121
- package/v2Containers/Templates/TemplatesActionBar.js +0 -101
- package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
- package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
- package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
- package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Styled wrapper for CapSlideBox used by CreativesContainer and RCS SMS fallback
|
|
3
|
-
* so header/content/footer margins match.
|
|
4
|
-
*/
|
|
5
|
-
import styled from 'styled-components';
|
|
6
|
-
import { CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
|
|
7
|
-
|
|
8
|
-
const CreativesSlideBoxWrapper = styled.div`
|
|
9
|
-
.cap-slide-box-v2-container {
|
|
10
|
-
/*
|
|
11
|
-
* Liquid-error spacing must stay *inside* the content column. margin-bottom on
|
|
12
|
-
* .slidebox-content-container added to the in-flow height past 100vh, so the outer
|
|
13
|
-
* .cap-slide-box-v2-container (overflow-y: auto in cap-ui) gained a second scrollbar.
|
|
14
|
-
*/
|
|
15
|
-
.slidebox-header {
|
|
16
|
-
margin-bottom: ${({ slideBoxWrapperMargin }) => `${slideBoxWrapperMargin}`};
|
|
17
|
-
padding: 0 rem;
|
|
18
|
-
&.has-footer {
|
|
19
|
-
overflow-x: hidden;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
.slidebox-content-container {
|
|
23
|
-
margin-bottom: 0;
|
|
24
|
-
padding: 0 rem;
|
|
25
|
-
padding-bottom: ${({ slideBoxWrapperMargin }) => `${slideBoxWrapperMargin}`};
|
|
26
|
-
box-sizing: border-box;
|
|
27
|
-
&.has-footer {
|
|
28
|
-
overflow-x: hidden;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
.slidebox-footer {
|
|
32
|
-
/* Only apply margin-bottom to footer when ErrorInfoNote is shown in footer (BEE editor) */
|
|
33
|
-
/* For HTML Editor, errors are shown in ValidationErrorDisplay (inside content area), so no footer margin needed */
|
|
34
|
-
margin-bottom: ${({ shouldApplyFooterMargin }) => (shouldApplyFooterMargin ? `${CAP_SPACE_16}` : '0')};
|
|
35
|
-
padding: 0 rem;
|
|
36
|
-
&.has-footer {
|
|
37
|
-
overflow-x: hidden;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
`;
|
|
42
|
-
|
|
43
|
-
export default CreativesSlideBoxWrapper;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared logic for CreativesContainer slidebox + embedded flows (e.g. RCS SMS fallback)
|
|
3
|
-
* that mirror the same footer liquid errors and layout margins.
|
|
4
|
-
*/
|
|
5
|
-
import get from 'lodash/get';
|
|
6
|
-
import {
|
|
7
|
-
CAP_SPACE_32,
|
|
8
|
-
CAP_SPACE_56,
|
|
9
|
-
CAP_SPACE_64,
|
|
10
|
-
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
11
|
-
import * as constants from './constants';
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Returns true if value is "deep empty": no errors present.
|
|
15
|
-
* Same rules as CreativesContainer (used for liquid / standard error payloads).
|
|
16
|
-
*/
|
|
17
|
-
export function isDeepEmpty(value) {
|
|
18
|
-
if (value == null) return true;
|
|
19
|
-
if (typeof value === 'string') return value.length === 0;
|
|
20
|
-
if (Array.isArray(value)) return value.every(isDeepEmpty);
|
|
21
|
-
if (typeof value === 'object') {
|
|
22
|
-
return Object.values(value).every(isDeepEmpty);
|
|
23
|
-
}
|
|
24
|
-
return false;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Header/content margin below slidebox chrome when ErrorInfoNote stacks errors — same formula as CreativesContainer#render.
|
|
29
|
-
*/
|
|
30
|
-
export function getSlideBoxWrapperMarginFromLiquidErrors(liquidErrorMessage) {
|
|
31
|
-
return (get(liquidErrorMessage, 'STANDARD_ERROR_MSG.length', 0) > 0
|
|
32
|
-
&& get(liquidErrorMessage, 'LIQUID_ERROR_MSG.length', 0) > 0)
|
|
33
|
-
? CAP_SPACE_64
|
|
34
|
-
: get(liquidErrorMessage, 'LIQUID_ERROR_MSG.length', 0) > 0
|
|
35
|
-
? CAP_SPACE_56
|
|
36
|
-
: get(liquidErrorMessage, 'STANDARD_ERROR_MSG.length', 0) > 0
|
|
37
|
-
? CAP_SPACE_32
|
|
38
|
-
: 0;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Maps FormBuilder `showLiquidErrorInFooter` args to slidebox footer state.
|
|
43
|
-
* Returns `null` when CreativesContainer intentionally skips updating (Mobile Push OLD empty clear).
|
|
44
|
-
*/
|
|
45
|
-
export function computeLiquidFooterUpdateFromFormBuilder(
|
|
46
|
-
errorMessagesFromFormBuilder,
|
|
47
|
-
existingLiquidErrorMessageOrCurrentFormBuilderTab,
|
|
48
|
-
currentFormBuilderTabOrOptions,
|
|
49
|
-
maybeOptions,
|
|
50
|
-
) {
|
|
51
|
-
// Backward compatible signature handling:
|
|
52
|
-
// old: (errors, currentFormBuilderTab, options)
|
|
53
|
-
// new: (errors, existingLiquidErrorMessage, currentFormBuilderTab, options)
|
|
54
|
-
const hasExistingErrorMessageObject = existingLiquidErrorMessageOrCurrentFormBuilderTab
|
|
55
|
-
&& typeof existingLiquidErrorMessageOrCurrentFormBuilderTab === 'object'
|
|
56
|
-
&& !Array.isArray(existingLiquidErrorMessageOrCurrentFormBuilderTab);
|
|
57
|
-
const currentFormBuilderTab = hasExistingErrorMessageObject
|
|
58
|
-
? currentFormBuilderTabOrOptions
|
|
59
|
-
: existingLiquidErrorMessageOrCurrentFormBuilderTab;
|
|
60
|
-
const options = hasExistingErrorMessageObject ? maybeOptions : currentFormBuilderTabOrOptions;
|
|
61
|
-
const { previousIsLiquidValidationError, currentChannelUpper } = options || {};
|
|
62
|
-
const liquidMsgs = get(errorMessagesFromFormBuilder, constants.LIQUID_ERROR_MSG, []);
|
|
63
|
-
const standardMsgs = get(errorMessagesFromFormBuilder, constants.STANDARD_ERROR_MSG, []);
|
|
64
|
-
const hasLiquid = !isDeepEmpty(liquidMsgs);
|
|
65
|
-
const hasStandard = !isDeepEmpty(standardMsgs);
|
|
66
|
-
const isLiquidValidationError = hasLiquid || hasStandard;
|
|
67
|
-
const isMobilePush = currentChannelUpper === constants.MOBILE_PUSH;
|
|
68
|
-
if (!hasLiquid && !hasStandard && previousIsLiquidValidationError && isMobilePush) {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
isLiquidValidationError,
|
|
73
|
-
liquidErrorMessage: errorMessagesFromFormBuilder,
|
|
74
|
-
activeFormBuilderTab:
|
|
75
|
-
currentFormBuilderTab === 1
|
|
76
|
-
? constants.ANDROID
|
|
77
|
-
: (currentFormBuilderTab === 2 ? constants.IOS : null),
|
|
78
|
-
};
|
|
79
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Covers `localTemplatesConfig` / `useLocalTemplates` branch in SlideBoxContent → TemplatesV2
|
|
3
|
-
* (embedded SMS template list / RCS SMS fallback).
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { mountWithIntl, shallowWithIntl } from '../../../helpers/intl-enzym-test-helpers';
|
|
7
|
-
import { SlideBoxContent } from '../SlideBoxContent';
|
|
8
|
-
|
|
9
|
-
const mockTemplatesV2 = jest.fn(() => <div data-testid="templates-v2-mock" />);
|
|
10
|
-
jest.mock('../../TemplatesV2', () => ({
|
|
11
|
-
__esModule: true,
|
|
12
|
-
default: (props) => mockTemplatesV2(props),
|
|
13
|
-
}));
|
|
14
|
-
|
|
15
|
-
const baseProps = {
|
|
16
|
-
slidBoxContent: 'templates',
|
|
17
|
-
currentChannel: 'SMS',
|
|
18
|
-
onSelectTemplate: jest.fn(),
|
|
19
|
-
onPreviewTemplate: jest.fn(),
|
|
20
|
-
onCreateNew: jest.fn(),
|
|
21
|
-
onChannelChange: jest.fn(),
|
|
22
|
-
location: { pathname: '/sms', query: {}, search: '' },
|
|
23
|
-
cap: {},
|
|
24
|
-
channelsToHide: [],
|
|
25
|
-
channelsToDisable: [],
|
|
26
|
-
handleClose: jest.fn(),
|
|
27
|
-
messageDetails: {},
|
|
28
|
-
onCreateComplete: jest.fn(),
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
describe('SlideBoxContent local templates (TemplatesV2)', () => {
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
mockTemplatesV2.mockClear();
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
// Use mount when asserting TemplatesV2 mock calls: shallow does not invoke children under styled CreativesWrapper.
|
|
37
|
-
it('renders TemplatesV2 in full mode when useLocalTemplates is true', () => {
|
|
38
|
-
mountWithIntl(
|
|
39
|
-
<SlideBoxContent
|
|
40
|
-
{...baseProps}
|
|
41
|
-
isFullMode
|
|
42
|
-
localTemplatesConfig={{
|
|
43
|
-
useLocalTemplates: true,
|
|
44
|
-
localTemplates: [],
|
|
45
|
-
localTemplatesLoading: false,
|
|
46
|
-
}}
|
|
47
|
-
/>,
|
|
48
|
-
);
|
|
49
|
-
expect(mockTemplatesV2).toHaveBeenCalled();
|
|
50
|
-
const passed = mockTemplatesV2.mock.calls[mockTemplatesV2.mock.calls.length - 1][0];
|
|
51
|
-
expect(passed.localTemplatesConfig.useLocalTemplates).toBe(true);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('does not render TemplatesV2 in full mode when useLocalTemplates is false', () => {
|
|
55
|
-
shallowWithIntl(
|
|
56
|
-
<SlideBoxContent
|
|
57
|
-
{...baseProps}
|
|
58
|
-
isFullMode
|
|
59
|
-
localTemplatesConfig={{ useLocalTemplates: false }}
|
|
60
|
-
/>,
|
|
61
|
-
);
|
|
62
|
-
expect(mockTemplatesV2).not.toHaveBeenCalled();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('renders TemplatesV2 in library mode without localTemplates flag', () => {
|
|
66
|
-
mountWithIntl(
|
|
67
|
-
<SlideBoxContent
|
|
68
|
-
{...baseProps}
|
|
69
|
-
isFullMode={false}
|
|
70
|
-
/>,
|
|
71
|
-
);
|
|
72
|
-
expect(mockTemplatesV2).toHaveBeenCalled();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('merges top-level local template props via pick when localTemplatesConfig is omitted', () => {
|
|
76
|
-
mountWithIntl(
|
|
77
|
-
<SlideBoxContent
|
|
78
|
-
{...baseProps}
|
|
79
|
-
isFullMode
|
|
80
|
-
useLocalTemplates
|
|
81
|
-
localTemplates={[{ _id: '1' }]}
|
|
82
|
-
localTemplatesLoading={false}
|
|
83
|
-
/>,
|
|
84
|
-
);
|
|
85
|
-
expect(mockTemplatesV2).toHaveBeenCalled();
|
|
86
|
-
const passed = mockTemplatesV2.mock.calls[mockTemplatesV2.mock.calls.length - 1][0];
|
|
87
|
-
expect(passed.localTemplatesConfig.useLocalTemplates).toBe(true);
|
|
88
|
-
expect(passed.localTemplatesConfig.localTemplates).toEqual([{ _id: '1' }]);
|
|
89
|
-
});
|
|
90
|
-
});
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CAP_SPACE_32,
|
|
3
|
-
CAP_SPACE_56,
|
|
4
|
-
CAP_SPACE_64,
|
|
5
|
-
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
6
|
-
import {
|
|
7
|
-
isDeepEmpty,
|
|
8
|
-
getSlideBoxWrapperMarginFromLiquidErrors,
|
|
9
|
-
computeLiquidFooterUpdateFromFormBuilder,
|
|
10
|
-
} from '../embeddedSlideboxUtils';
|
|
11
|
-
import { ANDROID, IOS, MOBILE_PUSH, LIQUID_ERROR_MSG, STANDARD_ERROR_MSG } from '../constants';
|
|
12
|
-
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
// isDeepEmpty
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
|
|
17
|
-
describe('isDeepEmpty', () => {
|
|
18
|
-
it('returns true for null', () => {
|
|
19
|
-
expect(isDeepEmpty(null)).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('returns true for undefined', () => {
|
|
23
|
-
expect(isDeepEmpty(undefined)).toBe(true);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('returns true for empty string', () => {
|
|
27
|
-
expect(isDeepEmpty('')).toBe(true);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('returns false for non-empty string', () => {
|
|
31
|
-
expect(isDeepEmpty('hello')).toBe(false);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('returns true for empty array', () => {
|
|
35
|
-
expect(isDeepEmpty([])).toBe(true);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('returns false for non-empty array', () => {
|
|
39
|
-
expect(isDeepEmpty(['item'])).toBe(false);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('returns true for empty object', () => {
|
|
43
|
-
expect(isDeepEmpty({})).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('returns true for object where all values are deep-empty', () => {
|
|
47
|
-
expect(isDeepEmpty({ a: null, b: '', c: [] })).toBe(true);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('returns false for object with at least one non-empty value', () => {
|
|
51
|
-
expect(isDeepEmpty({ a: null, b: 'something' })).toBe(false);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('returns true for nested all-empty object', () => {
|
|
55
|
-
expect(isDeepEmpty({ a: { b: null, c: [] } })).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('returns false for nested object with a non-empty leaf', () => {
|
|
59
|
-
expect(isDeepEmpty({ a: { b: 'value' } })).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('returns false for a number (non-null, non-string, non-array, non-object)', () => {
|
|
63
|
-
expect(isDeepEmpty(0)).toBe(false);
|
|
64
|
-
expect(isDeepEmpty(42)).toBe(false);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('returns false for a boolean false', () => {
|
|
68
|
-
expect(isDeepEmpty(false)).toBe(false);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
// ---------------------------------------------------------------------------
|
|
73
|
-
// getSlideBoxWrapperMarginFromLiquidErrors
|
|
74
|
-
// ---------------------------------------------------------------------------
|
|
75
|
-
|
|
76
|
-
describe('getSlideBoxWrapperMarginFromLiquidErrors', () => {
|
|
77
|
-
it('returns 0 when liquidErrorMessage is null', () => {
|
|
78
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors(null)).toBe(0);
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('returns 0 when liquidErrorMessage is undefined', () => {
|
|
82
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors(undefined)).toBe(0);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('returns 0 when both error arrays are empty', () => {
|
|
86
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
87
|
-
STANDARD_ERROR_MSG: [],
|
|
88
|
-
LIQUID_ERROR_MSG: [],
|
|
89
|
-
})).toBe(0);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('returns 0 when neither error array is present', () => {
|
|
93
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({})).toBe(0);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
it('returns CAP_SPACE_64 when both STANDARD and LIQUID errors are present', () => {
|
|
97
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
98
|
-
STANDARD_ERROR_MSG: ['std error'],
|
|
99
|
-
LIQUID_ERROR_MSG: ['liquid error'],
|
|
100
|
-
})).toBe(CAP_SPACE_64);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('returns CAP_SPACE_56 when only LIQUID errors are present', () => {
|
|
104
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
105
|
-
STANDARD_ERROR_MSG: [],
|
|
106
|
-
LIQUID_ERROR_MSG: ['liquid error'],
|
|
107
|
-
})).toBe(CAP_SPACE_56);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('returns CAP_SPACE_32 when only STANDARD errors are present', () => {
|
|
111
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
112
|
-
STANDARD_ERROR_MSG: ['std error'],
|
|
113
|
-
LIQUID_ERROR_MSG: [],
|
|
114
|
-
})).toBe(CAP_SPACE_32);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('returns CAP_SPACE_56 when LIQUID has multiple errors and STANDARD is absent', () => {
|
|
118
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
119
|
-
LIQUID_ERROR_MSG: ['err1', 'err2'],
|
|
120
|
-
})).toBe(CAP_SPACE_56);
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('returns CAP_SPACE_32 when STANDARD has multiple errors and LIQUID is absent', () => {
|
|
124
|
-
expect(getSlideBoxWrapperMarginFromLiquidErrors({
|
|
125
|
-
STANDARD_ERROR_MSG: ['err1', 'err2'],
|
|
126
|
-
})).toBe(CAP_SPACE_32);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// computeLiquidFooterUpdateFromFormBuilder
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
describe('computeLiquidFooterUpdateFromFormBuilder', () => {
|
|
135
|
-
const noErrors = { [LIQUID_ERROR_MSG]: [], [STANDARD_ERROR_MSG]: [] };
|
|
136
|
-
const liquidOnly = { [LIQUID_ERROR_MSG]: ['liquid err'], [STANDARD_ERROR_MSG]: [] };
|
|
137
|
-
const standardOnly = { [LIQUID_ERROR_MSG]: [], [STANDARD_ERROR_MSG]: ['std err'] };
|
|
138
|
-
const bothErrors = { [LIQUID_ERROR_MSG]: ['l'], [STANDARD_ERROR_MSG]: ['s'] };
|
|
139
|
-
|
|
140
|
-
describe('normal (non-null) returns', () => {
|
|
141
|
-
it('returns isLiquidValidationError=false when no errors', () => {
|
|
142
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1, {
|
|
143
|
-
previousIsLiquidValidationError: false,
|
|
144
|
-
currentChannelUpper: 'SMS',
|
|
145
|
-
});
|
|
146
|
-
expect(result).not.toBeNull();
|
|
147
|
-
expect(result.isLiquidValidationError).toBe(false);
|
|
148
|
-
expect(result.liquidErrorMessage).toEqual(noErrors);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('sets isLiquidValidationError=true when liquid errors present', () => {
|
|
152
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(liquidOnly, 1, {
|
|
153
|
-
previousIsLiquidValidationError: false,
|
|
154
|
-
currentChannelUpper: 'SMS',
|
|
155
|
-
});
|
|
156
|
-
expect(result.isLiquidValidationError).toBe(true);
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('sets isLiquidValidationError=true when standard errors present', () => {
|
|
160
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(standardOnly, 1, {
|
|
161
|
-
previousIsLiquidValidationError: false,
|
|
162
|
-
currentChannelUpper: 'SMS',
|
|
163
|
-
});
|
|
164
|
-
expect(result.isLiquidValidationError).toBe(true);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('sets isLiquidValidationError=true when both errors present', () => {
|
|
168
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(bothErrors, 1, {
|
|
169
|
-
previousIsLiquidValidationError: false,
|
|
170
|
-
currentChannelUpper: 'SMS',
|
|
171
|
-
});
|
|
172
|
-
expect(result.isLiquidValidationError).toBe(true);
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('maps tab 1 to ANDROID', () => {
|
|
176
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1, {
|
|
177
|
-
previousIsLiquidValidationError: false,
|
|
178
|
-
currentChannelUpper: 'SMS',
|
|
179
|
-
});
|
|
180
|
-
expect(result.activeFormBuilderTab).toBe(ANDROID);
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('maps tab 2 to IOS', () => {
|
|
184
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 2, {
|
|
185
|
-
previousIsLiquidValidationError: false,
|
|
186
|
-
currentChannelUpper: 'SMS',
|
|
187
|
-
});
|
|
188
|
-
expect(result.activeFormBuilderTab).toBe(IOS);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('maps tab 3 (or any other tab) to null', () => {
|
|
192
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 3, {
|
|
193
|
-
previousIsLiquidValidationError: false,
|
|
194
|
-
currentChannelUpper: 'SMS',
|
|
195
|
-
});
|
|
196
|
-
expect(result.activeFormBuilderTab).toBeNull();
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('maps undefined tab to null for activeFormBuilderTab', () => {
|
|
200
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, undefined, {
|
|
201
|
-
previousIsLiquidValidationError: false,
|
|
202
|
-
currentChannelUpper: 'SMS',
|
|
203
|
-
});
|
|
204
|
-
expect(result.activeFormBuilderTab).toBeNull();
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it('does NOT return null for Mobile Push when errors ARE present', () => {
|
|
208
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(liquidOnly, 1, {
|
|
209
|
-
previousIsLiquidValidationError: true,
|
|
210
|
-
currentChannelUpper: MOBILE_PUSH,
|
|
211
|
-
});
|
|
212
|
-
expect(result).not.toBeNull();
|
|
213
|
-
expect(result.isLiquidValidationError).toBe(true);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('does NOT return null for non-Mobile Push channel even with previousIsLiquidValidationError', () => {
|
|
217
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1, {
|
|
218
|
-
previousIsLiquidValidationError: true,
|
|
219
|
-
currentChannelUpper: 'SMS',
|
|
220
|
-
});
|
|
221
|
-
expect(result).not.toBeNull();
|
|
222
|
-
expect(result.isLiquidValidationError).toBe(false);
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
it('works without options argument (uses defaults)', () => {
|
|
226
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1);
|
|
227
|
-
expect(result).not.toBeNull();
|
|
228
|
-
expect(result.isLiquidValidationError).toBe(false);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
describe('Mobile Push OLD clear (returns null)', () => {
|
|
233
|
-
it('returns null when no errors and previousIsLiquidValidationError is true for MOBILEPUSH', () => {
|
|
234
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1, {
|
|
235
|
-
previousIsLiquidValidationError: true,
|
|
236
|
-
currentChannelUpper: MOBILE_PUSH,
|
|
237
|
-
});
|
|
238
|
-
expect(result).toBeNull();
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it('does NOT return null when previousIsLiquidValidationError is false for MOBILEPUSH', () => {
|
|
242
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(noErrors, 1, {
|
|
243
|
-
previousIsLiquidValidationError: false,
|
|
244
|
-
currentChannelUpper: MOBILE_PUSH,
|
|
245
|
-
});
|
|
246
|
-
expect(result).not.toBeNull();
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
it('does NOT return null when only standard errors cleared but liquid error remains for MOBILEPUSH', () => {
|
|
250
|
-
const result = computeLiquidFooterUpdateFromFormBuilder(liquidOnly, 1, {
|
|
251
|
-
previousIsLiquidValidationError: true,
|
|
252
|
-
currentChannelUpper: MOBILE_PUSH,
|
|
253
|
-
});
|
|
254
|
-
// hasLiquid = true → condition !hasLiquid is false → does not return null
|
|
255
|
-
expect(result).not.toBeNull();
|
|
256
|
-
});
|
|
257
|
-
});
|
|
258
|
-
});
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Covers local-templates flag resolution: nested `localTemplatesConfig.useLocalTemplates`
|
|
3
|
-
* vs top-level `useLocalTemplates` (embedded consumers / SlideBoxContent).
|
|
4
|
-
*/
|
|
5
|
-
import React from 'react';
|
|
6
|
-
import { shallowWithIntl } from '../../../helpers/intl-enzym-test-helpers';
|
|
7
|
-
import { Creatives } from '../index';
|
|
8
|
-
import mockdata from '../../mockdata';
|
|
9
|
-
|
|
10
|
-
const { smsTemplates, loyaltyMetaData } = mockdata;
|
|
11
|
-
|
|
12
|
-
jest.mock('../../../v2Components/FormBuilder', () => ({
|
|
13
|
-
__esModule: true,
|
|
14
|
-
default: (props) => (
|
|
15
|
-
<div className="FormBuilder-mock" {...props}>
|
|
16
|
-
FormBuilder
|
|
17
|
-
</div>
|
|
18
|
-
),
|
|
19
|
-
}));
|
|
20
|
-
|
|
21
|
-
const baseProps = {
|
|
22
|
-
loyaltyMetaData,
|
|
23
|
-
Templates: smsTemplates,
|
|
24
|
-
channel: 'SMS',
|
|
25
|
-
creativesMode: 'create',
|
|
26
|
-
templateData: null,
|
|
27
|
-
isFullMode: true,
|
|
28
|
-
handleCloseCreatives: jest.fn(),
|
|
29
|
-
getCreativesData: jest.fn(),
|
|
30
|
-
templateActions: {
|
|
31
|
-
getCdnTransformationConfig: jest.fn(),
|
|
32
|
-
resetTemplateStoreData: jest.fn(),
|
|
33
|
-
},
|
|
34
|
-
globalActions: {
|
|
35
|
-
clearMetaEntities: jest.fn(),
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
describe('CreativesContainer useLocalTemplates prop resolution', () => {
|
|
40
|
-
beforeEach(() => {
|
|
41
|
-
jest.clearAllMocks();
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it('initial slidebox is templates when only top-level useLocalTemplates is true', () => {
|
|
45
|
-
const wrapper = shallowWithIntl(
|
|
46
|
-
<Creatives
|
|
47
|
-
{...baseProps}
|
|
48
|
-
useLocalTemplates
|
|
49
|
-
/>,
|
|
50
|
-
);
|
|
51
|
-
expect(wrapper.instance().state.slidBoxContent).toBe('templates');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('initial slidebox is templates when localTemplatesConfig.useLocalTemplates is true', () => {
|
|
55
|
-
const wrapper = shallowWithIntl(
|
|
56
|
-
<Creatives
|
|
57
|
-
{...baseProps}
|
|
58
|
-
localTemplatesConfig={{ useLocalTemplates: true }}
|
|
59
|
-
/>,
|
|
60
|
-
);
|
|
61
|
-
expect(wrapper.instance().state.slidBoxContent).toBe('templates');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('does not reset template store on unmount when embedded and top-level useLocalTemplates is true', () => {
|
|
65
|
-
const wrapper = shallowWithIntl(
|
|
66
|
-
<Creatives
|
|
67
|
-
{...baseProps}
|
|
68
|
-
location={{ query: { type: 'embedded' } }}
|
|
69
|
-
useLocalTemplates
|
|
70
|
-
/>,
|
|
71
|
-
);
|
|
72
|
-
wrapper.unmount();
|
|
73
|
-
expect(baseProps.templateActions.resetTemplateStoreData).not.toHaveBeenCalled();
|
|
74
|
-
expect(baseProps.globalActions.clearMetaEntities).toHaveBeenCalled();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('resets template store on unmount when embedded and local templates are not used', () => {
|
|
78
|
-
const wrapper = shallowWithIntl(
|
|
79
|
-
<Creatives
|
|
80
|
-
{...baseProps}
|
|
81
|
-
location={{ query: { type: 'embedded' } }}
|
|
82
|
-
useLocalTemplates={false}
|
|
83
|
-
/>,
|
|
84
|
-
);
|
|
85
|
-
wrapper.unmount();
|
|
86
|
-
expect(baseProps.templateActions.resetTemplateStoreData).toHaveBeenCalled();
|
|
87
|
-
expect(baseProps.globalActions.clearMetaEntities).toHaveBeenCalled();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('prefers nested localTemplatesConfig.useLocalTemplates=false over top-level true (not local list mode)', () => {
|
|
91
|
-
const wrapper = shallowWithIntl(
|
|
92
|
-
<Creatives
|
|
93
|
-
{...baseProps}
|
|
94
|
-
localTemplatesConfig={{ useLocalTemplates: false }}
|
|
95
|
-
useLocalTemplates
|
|
96
|
-
/>,
|
|
97
|
-
);
|
|
98
|
-
expect(wrapper.instance().state.slidBoxContent).toBe('createTemplate');
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
it('uses top-level useLocalTemplates when localTemplatesConfig omits the flag', () => {
|
|
102
|
-
const wrapper = shallowWithIntl(
|
|
103
|
-
<Creatives
|
|
104
|
-
{...baseProps}
|
|
105
|
-
localTemplatesConfig={{}}
|
|
106
|
-
useLocalTemplates
|
|
107
|
-
/>,
|
|
108
|
-
);
|
|
109
|
-
expect(wrapper.instance().state.slidBoxContent).toBe('templates');
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
it('resets template store when nested useLocalTemplates is false even if top-level is true', () => {
|
|
113
|
-
const wrapper = shallowWithIntl(
|
|
114
|
-
<Creatives
|
|
115
|
-
{...baseProps}
|
|
116
|
-
location={{ query: { type: 'embedded' } }}
|
|
117
|
-
localTemplatesConfig={{ useLocalTemplates: false }}
|
|
118
|
-
useLocalTemplates
|
|
119
|
-
/>,
|
|
120
|
-
);
|
|
121
|
-
wrapper.unmount();
|
|
122
|
-
expect(baseProps.templateActions.resetTemplateStoreData).toHaveBeenCalled();
|
|
123
|
-
expect(baseProps.globalActions.clearMetaEntities).toHaveBeenCalled();
|
|
124
|
-
});
|
|
125
|
-
});
|