@capillarytech/creatives-library 9.0.15-alpha.3 → 9.0.16-beta.0

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.
Files changed (146) hide show
  1. package/AppRoot.js +80 -0
  2. package/app.js +5 -3
  3. package/constants/unified.js +0 -29
  4. package/entry.js +67 -1
  5. package/global-styles.js +1 -1
  6. package/mfe-exposed-components.js +2 -4
  7. package/package.json +2 -2
  8. package/services/api.js +1 -1
  9. package/services/tests/api.test.js +20 -35
  10. package/styles/containers/layout/_layoutPage.scss +8 -6
  11. package/utils/commonUtils.js +1 -19
  12. package/utils/getDataLayer.js +15 -0
  13. package/utils/gtmTrackers/gtmEvents/creativeDetails.js +2 -1
  14. package/utils/mfeDetect.js +1 -0
  15. package/v2Components/CapActionButton/constants.js +1 -8
  16. package/v2Components/CapActionButton/index.js +144 -202
  17. package/v2Components/CapActionButton/index.scss +14 -232
  18. package/v2Components/CapActionButton/messages.js +3 -19
  19. package/v2Components/CapActionButton/tests/index.test.js +18 -42
  20. package/v2Components/CapImageUpload/index.js +2 -2
  21. package/v2Components/CapTagList/index.js +0 -10
  22. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +48 -70
  23. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  24. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -214
  25. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  26. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +9 -83
  27. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  28. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -60
  29. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  30. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +22 -202
  31. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +80 -381
  32. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +8 -155
  33. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  34. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  35. package/v2Components/CommonTestAndPreview/index.js +222 -761
  36. package/v2Components/CommonTestAndPreview/messages.js +3 -45
  37. package/v2Components/CommonTestAndPreview/sagas.js +6 -25
  38. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +0 -1
  39. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +267 -284
  40. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  41. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  42. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  43. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
  44. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  45. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
  46. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  47. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -133
  48. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +24 -31
  49. package/v2Components/NavigationBar/index.js +9 -7
  50. package/v2Components/NavigationBar/mfeModuleHeader.config.js +16 -0
  51. package/v2Components/Pagination/_pagination.scss +2 -0
  52. package/v2Components/TemplatePreview/_templatePreview.scss +25 -45
  53. package/v2Components/TemplatePreview/index.js +32 -147
  54. package/v2Components/TemplatePreview/tests/index.test.js +0 -142
  55. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +6 -6
  56. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  57. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  58. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  59. package/v2Containers/Cap/constants.js +1 -0
  60. package/v2Containers/Cap/index.js +47 -21
  61. package/v2Containers/Cap/sagas.js +19 -0
  62. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +1 -4
  63. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +0 -4
  64. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  65. package/v2Containers/CreativesContainer/SlideBoxContent.js +7 -37
  66. package/v2Containers/CreativesContainer/SlideBoxFooter.js +5 -14
  67. package/v2Containers/CreativesContainer/SlideBoxHeader.js +5 -36
  68. package/v2Containers/CreativesContainer/constants.js +0 -11
  69. package/v2Containers/CreativesContainer/index.js +104 -323
  70. package/v2Containers/CreativesContainer/index.scss +1 -83
  71. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -79
  72. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  73. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  74. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +90 -333
  75. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
  76. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  77. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  78. package/v2Containers/Rcs/constants.js +11 -131
  79. package/v2Containers/Rcs/index.js +829 -2682
  80. package/v2Containers/Rcs/index.scss +8 -443
  81. package/v2Containers/Rcs/messages.js +6 -45
  82. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +39409 -74176
  83. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +74 -10
  84. package/v2Containers/Rcs/tests/index.test.js +40 -151
  85. package/v2Containers/Rcs/tests/mockData.js +0 -38
  86. package/v2Containers/Rcs/tests/utils.test.js +30 -643
  87. package/v2Containers/Rcs/utils.js +12 -466
  88. package/v2Containers/Sms/Create/index.js +48 -115
  89. package/v2Containers/SmsTrai/Create/index.js +4 -9
  90. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  91. package/v2Containers/SmsTrai/Edit/index.js +169 -678
  92. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  93. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2854 -5455
  94. package/v2Containers/SmsWrapper/index.js +8 -37
  95. package/v2Containers/TagList/index.js +0 -6
  96. package/v2Containers/Templates/_templates.scss +11 -196
  97. package/v2Containers/Templates/actions.js +0 -11
  98. package/v2Containers/Templates/constants.js +0 -2
  99. package/v2Containers/Templates/index.js +60 -131
  100. package/v2Containers/Templates/sagas.js +13 -57
  101. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1015 -1060
  102. package/v2Containers/Templates/tests/sagas.test.js +16 -199
  103. package/v2Containers/TemplatesV2/TemplatesV2.style.js +10 -75
  104. package/v2Containers/TemplatesV2/index.js +43 -86
  105. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  106. package/v2Containers/Whatsapp/index.js +25 -4
  107. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  108. package/utils/rcsPayloadUtils.js +0 -92
  109. package/utils/templateVarUtils.js +0 -201
  110. package/utils/tests/rcsPayloadUtils.test.js +0 -226
  111. package/utils/tests/templateVarUtils.test.js +0 -204
  112. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  113. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  114. package/v2Components/CommonTestAndPreview/utils.js +0 -84
  115. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
  116. package/v2Components/SmsFallback/constants.js +0 -94
  117. package/v2Components/SmsFallback/index.js +0 -958
  118. package/v2Components/SmsFallback/index.scss +0 -266
  119. package/v2Components/SmsFallback/messages.js +0 -78
  120. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -120
  121. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  122. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  123. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  124. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -208
  125. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
  126. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  127. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  128. package/v2Components/TemplatePreview/constants.js +0 -2
  129. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  130. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  131. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  132. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -17
  133. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
  134. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  135. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  136. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  137. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -227
  138. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  139. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  140. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  141. package/v2Containers/SmsTrai/Edit/index.scss +0 -126
  142. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  143. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  144. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  145. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  146. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
@@ -1,17 +0,0 @@
1
- import React from 'react';
2
- import { CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
3
-
4
- const CreativesSlideBoxWrapper = ({ slideBoxWrapperMargin, shouldApplyFooterMargin, children, className, ...rest }) => (
5
- <div
6
- className={`creatives-slide-box-wrapper${className ? ` ${className}` : ''}`}
7
- style={{
8
- '--slidebox-wrapper-margin': slideBoxWrapperMargin,
9
- '--slidebox-footer-margin': shouldApplyFooterMargin ? `${CAP_SPACE_16}` : '0',
10
- }}
11
- {...rest}
12
- >
13
- {children}
14
- </div>
15
- );
16
-
17
- 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
- });