@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
@@ -102,7 +102,7 @@ exports[`RCS utils getRCSContent renders RCS content with image and CTA suggesti
102
102
  style={Object {}}
103
103
  >
104
104
  <i
105
- className="cap-icon-v2 cap-icon-v2-open-in-new xs"
105
+ className="cap-icon-v2 cap-icon-v2-launch xs"
106
106
  onClick={[Function]}
107
107
  style={
108
108
  Object {
@@ -113,12 +113,40 @@ exports[`RCS utils getRCSContent renders RCS content with image and CTA suggesti
113
113
  <svg
114
114
  fill="currentColor"
115
115
  height="1em"
116
- viewBox="0 0 16 16"
116
+ viewBox="0 0 24 24"
117
117
  width="1em"
118
118
  >
119
- <path
120
- d="M12 12H4V4h2a1 1 0 1 0 0-2H4a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8c1.1 0 2-.9 2-2v-2a1 1 0 0 0-2 0v2zM8.142 2.976c0 .54.437.977.977.977h1.552L7.285 7.338a.973.973 0 1 0 1.377 1.377l3.385-3.386v1.552a.976.976 0 1 0 1.953 0V3a1 1 0 0 0-1-1H9.119a.976.976 0 0 0-.977.976z"
121
- />
119
+ <defs>
120
+ <path
121
+ d="M19 19H5V5h5a1 1 0 0 0 0-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2v-6a1 1 0 0 0-2 0v6zM14 4a1 1 0 0 0 1 1h2.59l-6.297 6.297a.997.997 0 0 0 1.41 1.41L19 6.41V9a1 1 0 0 0 2 0V4a1 1 0 0 0-1-1h-5a1 1 0 0 0-1 1z"
122
+ id="launch_svg__a"
123
+ />
124
+ </defs>
125
+ <g
126
+ fill="none"
127
+ fillRule="evenodd"
128
+ >
129
+ <mask
130
+ fill="currentColor"
131
+ id="launch_svg__b"
132
+ >
133
+ <use
134
+ xlinkHref="#launch_svg__a"
135
+ />
136
+ </mask>
137
+ <use
138
+ fill="currentColor"
139
+ xlinkHref="#launch_svg__a"
140
+ />
141
+ <g
142
+ fill="currentColor"
143
+ mask="url(#launch_svg__b)"
144
+ >
145
+ <path
146
+ d="M0 0h24v24H0z"
147
+ />
148
+ </g>
149
+ </g>
122
150
  </svg>
123
151
  </i>
124
152
  Shop
@@ -228,7 +256,7 @@ exports[`RCS utils getRCSContent renders RCS content with multiple suggestion ty
228
256
  style={Object {}}
229
257
  >
230
258
  <i
231
- className="cap-icon-v2 cap-icon-v2-open-in-new xs"
259
+ className="cap-icon-v2 cap-icon-v2-launch xs"
232
260
  onClick={[Function]}
233
261
  style={
234
262
  Object {
@@ -239,12 +267,40 @@ exports[`RCS utils getRCSContent renders RCS content with multiple suggestion ty
239
267
  <svg
240
268
  fill="currentColor"
241
269
  height="1em"
242
- viewBox="0 0 16 16"
270
+ viewBox="0 0 24 24"
243
271
  width="1em"
244
272
  >
245
- <path
246
- d="M12 12H4V4h2a1 1 0 1 0 0-2H4a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h8c1.1 0 2-.9 2-2v-2a1 1 0 0 0-2 0v2zM8.142 2.976c0 .54.437.977.977.977h1.552L7.285 7.338a.973.973 0 1 0 1.377 1.377l3.385-3.386v1.552a.976.976 0 1 0 1.953 0V3a1 1 0 0 0-1-1H9.119a.976.976 0 0 0-.977.976z"
247
- />
273
+ <defs>
274
+ <path
275
+ d="M19 19H5V5h5a1 1 0 0 0 0-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2v-6a1 1 0 0 0-2 0v6zM14 4a1 1 0 0 0 1 1h2.59l-6.297 6.297a.997.997 0 0 0 1.41 1.41L19 6.41V9a1 1 0 0 0 2 0V4a1 1 0 0 0-1-1h-5a1 1 0 0 0-1 1z"
276
+ id="launch_svg__a"
277
+ />
278
+ </defs>
279
+ <g
280
+ fill="none"
281
+ fillRule="evenodd"
282
+ >
283
+ <mask
284
+ fill="currentColor"
285
+ id="launch_svg__b"
286
+ >
287
+ <use
288
+ xlinkHref="#launch_svg__a"
289
+ />
290
+ </mask>
291
+ <use
292
+ fill="currentColor"
293
+ xlinkHref="#launch_svg__a"
294
+ />
295
+ <g
296
+ fill="currentColor"
297
+ mask="url(#launch_svg__b)"
298
+ >
299
+ <path
300
+ d="M0 0h24v24H0z"
301
+ />
302
+ </g>
303
+ </g>
248
304
  </svg>
249
305
  </i>
250
306
  URL Action
@@ -287,6 +343,14 @@ exports[`RCS utils getRCSContent renders RCS content with no media 1`] = `
287
343
  <div
288
344
  className="cap-rcs-creatives"
289
345
  >
346
+ <div
347
+ className="cap-label cap-label-div label19 rcs-listing-content title"
348
+ style={
349
+ Object {
350
+ "fontWeight": "bold",
351
+ }
352
+ }
353
+ />
290
354
  <div
291
355
  className="cap-label cap-label-div label19 rcs-listing-content desc"
292
356
  style={Object {}}
@@ -14,19 +14,6 @@ import TagList from '../../../v2Containers/TagList/index.js';
14
14
  import CapActionButton from '../../../v2Components/CapActionButton';
15
15
  import { INITIAL_SUGGESTIONS_DATA_STOP } from '../constants';
16
16
 
17
- // Ensure real UnifiedPreview: other suites mock the same module; parallel workers + load order
18
- // can leave a stub active. This factory wins for this file's resolution of UnifiedPreview.
19
- jest.mock('../../../v2Components/CommonTestAndPreview/UnifiedPreview', () =>
20
- jest.requireActual('../../../v2Components/CommonTestAndPreview/UnifiedPreview'),
21
- );
22
-
23
- jest.mock('react-redux', () => {
24
- const actual = jest.requireActual('react-redux');
25
- return {
26
- ...actual,
27
- useDispatch: jest.fn(() => jest.fn()),
28
- };
29
- });
30
17
 
31
18
  jest.mock('../../../v2Containers/TagList/index.js', () => ({
32
19
  __esModule: true,
@@ -155,7 +142,7 @@ const renderHelper = (args) => {
155
142
  isEditFlow={args.isEditFlow || false}
156
143
  loadingTags={false}
157
144
  metaEntities={[]}
158
- {...(args.omitGetDefaultTags ? {} : { getDefaultTags: true })}
145
+ getDefaultTags
159
146
  isDltEnabled={args.isDltEnabled || false}
160
147
  smsRegister={'DLT'}
161
148
  />
@@ -199,21 +186,21 @@ describe('Creatives rcs test/>', () => {
199
186
  renderedComponent.update();
200
187
  expect(renderedComponent).toMatchSnapshot();
201
188
 
202
- // Carousel option exists
189
+ // Carousel option exists but is disabled
203
190
  const options = radioGroup.props().options;
204
191
  expect(options).toHaveLength(3);
205
192
  expect(options[0].value).toBe('text_message');
206
193
  expect(options[1].value).toBe('rich_card');
207
- expect(options[2].value).toBe('CAROUSEL');
208
- expect(options[2].disabled).toBeFalsy();
194
+ expect(options[2].value).toBe('carousel');
195
+ expect(options[2].disabled).toBe(true);
209
196
 
210
- // Edit mode: radio group is replaced by a plain readonly value, not shown disabled
211
- renderHelper({
197
+ // Disabled state in edit mode
198
+ renderHelper({
212
199
  params,
213
200
  rcsData: { templateDetails: mockData.rcsRichCardTemplate }
214
201
  });
215
- expect(renderedComponent.find('CapRadioGroup#select-rcs-template-type')).toHaveLength(0);
216
- expect(renderedComponent.find('CapHeading.rcs-creative-name-value').length).toBeGreaterThan(0);
202
+ const editModeRadioGroup = renderedComponent.find('CapRadioGroup#select-rcs-template-type').at(0);
203
+ expect(editModeRadioGroup.props().disabled).toBe(true);
217
204
  expect(renderedComponent).toMatchSnapshot();
218
205
  });
219
206
 
@@ -458,8 +445,8 @@ describe('Creatives rcs test/>', () => {
458
445
  });
459
446
 
460
447
  it('should call fetchSchemaForEntity when TagList context changes (non-full mode)', () => {
461
- // omitGetDefaultTags: when getDefaultTags is true it overwrites query.context and blocks context switches
462
- renderHelper({ isFullMode: false, omitGetDefaultTags: true });
448
+ // Re-render in non-full mode so TagList is visible
449
+ renderHelper({ isFullMode: false });
463
450
  const tagList = renderedComponent.find('.tag-mock').at(0);
464
451
  expect(tagList.exists()).toBe(true);
465
452
  const before = fetchSchemaForEntity.mock.calls.length;
@@ -467,126 +454,13 @@ describe('Creatives rcs test/>', () => {
467
454
  tagList.prop('onContextChange')('ALL');
468
455
  });
469
456
  const after = fetchSchemaForEntity.mock.calls.length;
470
- expect(after).toBeGreaterThan(before);
457
+ expect(after).toBe(before + 1);
471
458
  const lastArg = fetchSchemaForEntity.mock.calls[after - 1][0];
472
459
  expect(lastArg).toEqual(expect.objectContaining({ layout: 'SMS', type: 'TAG', context: 'default' }));
473
460
  });
474
461
  });
475
462
  });
476
463
 
477
- describe('RCS carousel label resolution in non-full mode', () => {
478
- it('should resolve shared variables across multiple carousel cards in both inline preview and Test&Preview slidebox', async () => {
479
- const templateData = {
480
- name: 'CarouselVarsTemplate',
481
- versions: {
482
- base: {
483
- content: {
484
- RCS: {
485
- rcsContent: {
486
- cardType: 'CAROUSEL',
487
- cardSettings: { cardOrientation: 'VERTICAL', cardWidth: 'SMALL' },
488
- cardContent: [
489
- {
490
- title: 'Hi {{name}}',
491
- description: 'Welcome {{name}}',
492
- mediaType: 'IMAGE',
493
- media: { mediaUrl: 'https://cdn.example.com/c1.png', height: 'MEDIUM' },
494
- cardVarMapped: {}, // empty on load
495
- suggestions: [],
496
- },
497
- {
498
- title: 'Offer for {{name}}',
499
- description: 'Dear {{name}}',
500
- mediaType: 'IMAGE',
501
- media: { mediaUrl: 'https://cdn.example.com/c2.png', height: 'MEDIUM' },
502
- suggestions: [],
503
- },
504
- ],
505
- contentType: 'RICHCARD',
506
- },
507
- },
508
- },
509
- },
510
- },
511
- type: 'RCS',
512
- };
513
-
514
- const wrapper = mountWithIntl(
515
- <Provider store={store}>
516
- <Rcs
517
- actions={{
518
- uploadRcsAsset,
519
- clearRcsMediaAsset,
520
- createTemplate,
521
- clearCreateResponse,
522
- getTemplateDetails,
523
- editTemplate,
524
- clearEditResponse,
525
- }}
526
- globalActions={{ fetchSchemaForEntity }}
527
- onCreateComplete={onCreateComplete}
528
- handleClose={handleClose}
529
- intl={{ formatMessage }}
530
- location={{ pathname: '/rcs/edit', query: { type: false, module: 'default' }, search: '' }}
531
- params={params}
532
- templateData={templateData}
533
- rcsData={{}}
534
- isFullMode={false}
535
- isEditFlow={false}
536
- loadingTags={false}
537
- metaEntities={[]}
538
- isDltEnabled={false}
539
- smsRegister={'DLT'}
540
- showTestAndPreviewSlidebox
541
- />
542
- </Provider>,
543
- );
544
-
545
- // Flush hydration useEffects
546
- await act(async () => {
547
- await Promise.resolve();
548
- });
549
- wrapper.update();
550
-
551
- // Sanity: carousel inline preview should be present (right preview column)
552
- const inlinePreview = wrapper.find('UnifiedPreview').filterWhere((n) => n.prop('content')?.carouselData).at(0);
553
- expect(inlinePreview.exists()).toBe(true);
554
- expect(inlinePreview.props().content?.carouselData?.length).toBeGreaterThanOrEqual(2);
555
-
556
- // Variable slot id may live on `id` or React `key` depending on CapInput/TextArea wiring.
557
- const nameVarAreas = wrapper.find('CapInputTextArea').filterWhere((n) => {
558
- const id = String(n.prop('id') || '');
559
- const key = String(n.key() || '');
560
- return id.includes('{{name}}_') || key.includes('{{name}}_');
561
- });
562
- expect(nameVarAreas.length).toBeGreaterThanOrEqual(1);
563
-
564
- act(() => {
565
- const slotId = nameVarAreas.at(0).prop('id') || nameVarAreas.at(0).key();
566
- nameVarAreas.at(0).props().onChange({ target: { id: slotId, value: 'madhavi' } });
567
- });
568
- wrapper.update();
569
-
570
- // Inline preview should now show resolved values across BOTH cards
571
- const updatedInlinePreview = wrapper.find('UnifiedPreview').filterWhere((n) => n.prop('content')?.carouselData).at(0);
572
- const inlineCards = updatedInlinePreview.props().content.carouselData;
573
- expect(inlineCards[0].title).toBe('Hi madhavi');
574
- expect(inlineCards[0].bodyText).toBe('Welcome madhavi');
575
- expect(inlineCards[1].title).toBe('Offer for madhavi');
576
- expect(inlineCards[1].bodyText).toBe('Dear madhavi');
577
-
578
- // Slidebox content should also be resolved (same underlying mapping)
579
- const slidebox = wrapper.find('TestAndPreviewSlidebox').at(0);
580
- expect(slidebox.exists()).toBe(true);
581
- const slideboxContent = slidebox.props().content;
582
- expect(slideboxContent?.carouselData?.length).toBeGreaterThanOrEqual(2);
583
- expect(slideboxContent.carouselData[0].title).toBe('Hi madhavi');
584
- expect(slideboxContent.carouselData[0].bodyText).toBe('Welcome madhavi');
585
- expect(slideboxContent.carouselData[1].title).toBe('Offer for madhavi');
586
- expect(slideboxContent.carouselData[1].bodyText).toBe('Dear madhavi');
587
- });
588
- });
589
-
590
464
  describe('RCS orientation tests', () => {
591
465
  it('should default to MEDIUM_HEIGHT (vertical) orientation', () => {
592
466
  renderHelper({ isEditFlow: false }); // force CapSelect to render
@@ -673,7 +547,7 @@ describe('RCS orientation tests', () => {
673
547
  });
674
548
 
675
549
  describe('RCS createPayload', () => {
676
- it('should build expected payload in full mode (IMAGE)', async () => {
550
+ it('should build expected payload in full mode (IMAGE, horizontal-left)', async () => {
677
551
  const createRcsTemplate = jest.fn();
678
552
  const getTemplateDetails = jest.fn();
679
553
  const getFormData = jest.fn();
@@ -756,10 +630,15 @@ describe('RCS createPayload', () => {
756
630
  expect(payloadArg.versions.base.content.RCS.rcsContent.accessToken).toBe('secret-token');
757
631
  expect(payloadArg.versions.base.content.RCS.rcsContent.hostName).toBe('rcs.host.example.com');
758
632
  expect(payloadArg.versions.base.content.RCS.rcsContent.accountName).toBe('Brand RCS Account');
759
- expect(payloadArg.versions.base.content.RCS.rcsContent.cardSettings).toBeDefined();
760
- // SMS fallback is only included when smsFallbackData is set (SmsFallback), not an empty stub
761
- expect(payloadArg.versions.base.content.RCS.smsFallBackContent).toBeUndefined();
762
- }, 30000);
633
+ expect(payloadArg.versions.base.content.RCS.rcsContent.cardSettings).toEqual(
634
+ expect.objectContaining({ cardOrientation: 'HORIZONTAL', mediaAlignment: 'LEFT', cardWidth: 'SMALL' }),
635
+ );
636
+ expect(card.mediaType).toBe('IMAGE');
637
+ expect(card.media).toEqual(expect.objectContaining({ mediaUrl: 'https://cdn.example.com/img.png' }));
638
+ expect(payloadArg.versions.base.content.RCS.smsFallBackContent).toEqual(
639
+ expect.objectContaining({ message: '' }),
640
+ );
641
+ });
763
642
 
764
643
  it('should include empty account metadata when no account is selected', async () => {
765
644
  const createRcsTemplate = jest.fn();
@@ -825,7 +704,7 @@ describe('RCS createPayload', () => {
825
704
  expect(rcsContent.accountName).toBe('');
826
705
  });
827
706
 
828
- it('does not add smsFallBackContent until SmsFallback data is set (isDltEnabled is not wired on Rcs)', async () => {
707
+ it('should attach DLT template configs when enabled', async () => {
829
708
  const createRcsTemplate = jest.fn();
830
709
  const getFormData = jest.fn();
831
710
  const { createPayloadFullMode } = mockData;
@@ -878,7 +757,16 @@ describe('RCS createPayload', () => {
878
757
  createRcsTemplate.mock.calls[0]?.[0] ||
879
758
  getFormData.mock.calls[0]?.[0]?.value;
880
759
  expect(payloadArg).toBeDefined();
881
- expect(payloadArg.versions.base.content.RCS.smsFallBackContent).toBeUndefined();
760
+ expect(payloadArg.versions.base.content.RCS.smsFallBackContent).toEqual(
761
+ expect.objectContaining({
762
+ templateConfigs: expect.objectContaining({
763
+ templateId: '',
764
+ templateName: '',
765
+ template: '',
766
+ registeredSenderIds: [],
767
+ }),
768
+ }),
769
+ );
882
770
  });
883
771
 
884
772
  it('should build expected payload in non-full mode (VIDEO, vertical medium)', () => {
@@ -955,9 +843,8 @@ describe('RCS createPayload', () => {
955
843
  // same placeholder appears twice
956
844
  title: 'Hello {{user_name}} and {{user_name}}',
957
845
  description: 'Hi {{user_name}}',
958
- // Rich card so title VarSegment row mounts (NONE → text_message hides title slots)
959
846
  mediaType: 'IMAGE',
960
- media: { mediaUrl: 'https://cdn.example.com/card.png' },
847
+ media: { mediaUrl: '', thumbnailUrl: '' },
961
848
  cardVarMapped: {}, // empty on load
962
849
  suggestions: [],
963
850
  },
@@ -1176,11 +1063,13 @@ describe('RCS createPayload', () => {
1176
1063
 
1177
1064
  wrapper.update();
1178
1065
 
1179
- // At least one variable slot is rendered (ids like `{{token}}_0`)
1180
- const varSlotAreas = wrapper.find('CapInputTextArea').filterWhere((n) =>
1181
- /\{\{[^}]+\}}_\d+/.test(String(n.prop('id') || '')),
1182
- );
1183
- expect(varSlotAreas.length).toBeGreaterThan(0);
1066
+ // The placeholder {{service_type}} should exist as a variable textarea id, and its value should be the mixed string.
1067
+ const serviceTypeAreas = wrapper.find('CapInputTextArea').filterWhere((n) => {
1068
+ const id = n.prop('id') || '';
1069
+ return id.includes('{{service_type}}_');
1070
+ });
1071
+ expect(serviceTypeAreas.length).toBeGreaterThanOrEqual(1);
1072
+ expect(serviceTypeAreas.at(0).prop('value')).toBe('{{first_name}}{{adv}}freeText');
1184
1073
 
1185
1074
  // Ensure freetext does NOT leak into static text blocks.
1186
1075
  const staticAreas = wrapper.find('CapInputTextArea').filterWhere((n) => !!n.prop('disabled'));
@@ -148,7 +148,6 @@ export const mockData = {
148
148
  },
149
149
  accountData: {
150
150
  selectedRcsAccount: {
151
- id: 'we-crm-account-id-42',
152
151
  sourceAccountIdentifier: 'rcs-account-123',
153
152
  configs: { accessToken: 'secret-token' },
154
153
  hostName: 'rcs.host.example.com',
@@ -286,41 +285,4 @@ export const mockData = {
286
285
  },
287
286
  },
288
287
  },
289
- // RCS template with SMS fallback for edit-flow tests
290
- rcsTemplateWithSmsFallback: {
291
- templateDetails: {
292
- _id: 'rcs_with_fallback_1',
293
- name: 'RCSWithFallback',
294
- type: 'RCS',
295
- versions: {
296
- base: {
297
- content: {
298
- RCS: {
299
- rcsContent: {
300
- cardSettings: { cardOrientation: 'VERTICAL' },
301
- cardContent: [
302
- {
303
- description: 'RCS description',
304
- mediaType: 'TEXT',
305
- suggestions: [],
306
- },
307
- ],
308
- contentType: 'text_message',
309
- },
310
- smsFallBackContent: {
311
- smsTemplateId: 'sms_fb_001',
312
- smsTemplateName: 'Fallback Template',
313
- smsContent: 'SMS fallback message',
314
- message: 'SMS fallback message',
315
- smsTemplateContent: 'SMS fallback message',
316
- smsVariables: [],
317
- smsVarMapped: {},
318
- smsUnicodeValidity: true,
319
- },
320
- },
321
- },
322
- },
323
- },
324
- },
325
- },
326
288
  };