@capillarytech/creatives-library 9.0.15-alpha.1 → 9.0.16

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 (132) hide show
  1. package/constants/unified.js +0 -29
  2. package/global-styles.js +1 -1
  3. package/package.json +1 -1
  4. package/services/tests/api.test.js +20 -35
  5. package/utils/commonUtils.js +1 -19
  6. package/v2Components/CapActionButton/constants.js +0 -7
  7. package/v2Components/CapActionButton/index.js +109 -168
  8. package/v2Components/CapActionButton/index.scss +5 -156
  9. package/v2Components/CapActionButton/messages.js +3 -19
  10. package/v2Components/CapActionButton/tests/index.test.js +18 -42
  11. package/v2Components/CapImageUpload/index.js +2 -2
  12. package/v2Components/CapTagList/index.js +0 -10
  13. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +48 -70
  14. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  15. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -214
  16. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  17. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +9 -83
  18. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -60
  20. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  21. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +23 -201
  22. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +76 -355
  23. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +8 -155
  24. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  25. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  26. package/v2Components/CommonTestAndPreview/index.js +222 -761
  27. package/v2Components/CommonTestAndPreview/messages.js +3 -45
  28. package/v2Components/CommonTestAndPreview/sagas.js +6 -25
  29. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +0 -1
  30. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +267 -284
  31. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  32. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  33. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  34. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
  35. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  36. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
  37. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  38. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -133
  39. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +24 -31
  40. package/v2Components/TemplatePreview/_templatePreview.scss +22 -41
  41. package/v2Components/TemplatePreview/index.js +31 -143
  42. package/v2Components/TemplatePreview/tests/index.test.js +0 -142
  43. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +6 -6
  44. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  45. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  46. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  47. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +1 -4
  48. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +0 -4
  49. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  50. package/v2Containers/CreativesContainer/SlideBoxContent.js +7 -36
  51. package/v2Containers/CreativesContainer/SlideBoxFooter.js +5 -14
  52. package/v2Containers/CreativesContainer/SlideBoxHeader.js +5 -36
  53. package/v2Containers/CreativesContainer/constants.js +0 -11
  54. package/v2Containers/CreativesContainer/index.js +104 -323
  55. package/v2Containers/CreativesContainer/index.scss +1 -83
  56. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -79
  57. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  58. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  59. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +90 -333
  60. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
  61. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  62. package/v2Containers/Email/index.js +5 -2
  63. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  64. package/v2Containers/Rcs/constants.js +11 -131
  65. package/v2Containers/Rcs/index.js +810 -2605
  66. package/v2Containers/Rcs/index.scss +8 -289
  67. package/v2Containers/Rcs/messages.js +3 -34
  68. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +38537 -73535
  69. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +8 -0
  70. package/v2Containers/Rcs/tests/index.test.js +36 -147
  71. package/v2Containers/Rcs/tests/mockData.js +0 -38
  72. package/v2Containers/Rcs/tests/utils.test.js +30 -646
  73. package/v2Containers/Rcs/utils.js +11 -478
  74. package/v2Containers/Sms/Create/index.js +48 -115
  75. package/v2Containers/SmsTrai/Create/index.js +4 -9
  76. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  77. package/v2Containers/SmsTrai/Edit/index.js +169 -678
  78. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  79. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2854 -5455
  80. package/v2Containers/SmsWrapper/index.js +8 -37
  81. package/v2Containers/TagList/index.js +0 -6
  82. package/v2Containers/Templates/_templates.scss +12 -171
  83. package/v2Containers/Templates/actions.js +0 -11
  84. package/v2Containers/Templates/constants.js +0 -2
  85. package/v2Containers/Templates/index.js +55 -125
  86. package/v2Containers/Templates/sagas.js +13 -57
  87. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1015 -1060
  88. package/v2Containers/Templates/tests/sagas.test.js +16 -199
  89. package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
  90. package/v2Containers/TemplatesV2/index.js +23 -86
  91. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  92. package/v2Containers/Whatsapp/index.js +20 -3
  93. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  94. package/utils/rcsPayloadUtils.js +0 -92
  95. package/utils/templateVarUtils.js +0 -201
  96. package/utils/tests/rcsPayloadUtils.test.js +0 -226
  97. package/utils/tests/templateVarUtils.test.js +0 -204
  98. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  99. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  100. package/v2Components/CommonTestAndPreview/utils.js +0 -84
  101. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
  102. package/v2Components/SmsFallback/constants.js +0 -94
  103. package/v2Components/SmsFallback/index.js +0 -958
  104. package/v2Components/SmsFallback/index.scss +0 -266
  105. package/v2Components/SmsFallback/messages.js +0 -78
  106. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -120
  107. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  108. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  109. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  110. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -208
  111. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
  112. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  113. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  114. package/v2Components/TemplatePreview/constants.js +0 -2
  115. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  116. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  117. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  118. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -17
  119. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
  120. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  121. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  122. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  123. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -227
  124. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  125. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  126. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  127. package/v2Containers/SmsTrai/Edit/index.scss +0 -126
  128. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  129. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  130. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  131. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  132. 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
- });