@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.2

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 (216) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -1
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/sagas/__tests__/assetPolling.test.js +74 -3
  7. package/sagas/assetPolling.js +8 -1
  8. package/services/api.js +10 -5
  9. package/services/tests/api.test.js +18 -0
  10. package/translations/en.json +0 -1
  11. package/utils/common.js +5 -0
  12. package/utils/commonUtils.js +14 -1
  13. package/utils/tests/commonUtil.test.js +224 -0
  14. package/utils/transformTemplateConfig.js +0 -10
  15. package/utils/transformerUtils.js +0 -42
  16. package/v2Components/CapDeviceContent/index.js +61 -56
  17. package/v2Components/CapImageUpload/constants.js +0 -2
  18. package/v2Components/CapImageUpload/index.js +14 -54
  19. package/v2Components/CapImageUpload/index.scss +1 -4
  20. package/v2Components/CapImageUpload/messages.js +0 -4
  21. package/v2Components/CapTagList/index.js +6 -1
  22. package/v2Components/CapTagListWithInput/index.js +5 -1
  23. package/v2Components/CapTagListWithInput/messages.js +1 -1
  24. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  25. package/v2Components/ErrorInfoNote/index.js +412 -72
  26. package/v2Components/ErrorInfoNote/messages.js +22 -0
  27. package/v2Components/ErrorInfoNote/style.scss +279 -2
  28. package/v2Components/HtmlEditor/HTMLEditor.js +217 -90
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +15 -23
  32. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
  35. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  36. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  37. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -0
  38. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  39. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  45. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  46. package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
  47. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
  49. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  50. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
  51. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
  52. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  53. package/v2Components/HtmlEditor/constants.js +29 -20
  54. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  55. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  56. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  57. package/v2Components/HtmlEditor/index.js +1 -1
  58. package/v2Components/HtmlEditor/messages.js +95 -85
  59. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
  60. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  61. package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
  62. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  63. package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
  64. package/v2Components/TemplatePreview/index.js +47 -32
  65. package/v2Components/TemplatePreview/messages.js +4 -0
  66. package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
  67. package/v2Containers/App/constants.js +0 -5
  68. package/v2Containers/BeeEditor/index.js +82 -80
  69. package/v2Containers/BeePopupEditor/constants.js +10 -0
  70. package/v2Containers/BeePopupEditor/index.js +193 -0
  71. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  72. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
  73. package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
  74. package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
  75. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  76. package/v2Containers/CreativesContainer/constants.js +1 -2
  77. package/v2Containers/CreativesContainer/index.js +173 -193
  78. package/v2Containers/CreativesContainer/messages.js +4 -4
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
  80. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
  81. package/v2Containers/Email/actions.js +7 -0
  82. package/v2Containers/Email/constants.js +5 -1
  83. package/v2Containers/Email/index.js +13 -0
  84. package/v2Containers/Email/messages.js +32 -0
  85. package/v2Containers/Email/reducer.js +12 -1
  86. package/v2Containers/Email/sagas.js +41 -6
  87. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  88. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
  89. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
  90. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  91. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  92. package/v2Containers/EmailWrapper/constants.js +2 -0
  93. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
  94. package/v2Containers/EmailWrapper/index.js +99 -23
  95. package/v2Containers/EmailWrapper/messages.js +61 -1
  96. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
  97. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
  98. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  99. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  100. package/v2Containers/InApp/actions.js +7 -0
  101. package/v2Containers/InApp/constants.js +20 -4
  102. package/v2Containers/InApp/index.js +800 -357
  103. package/v2Containers/InApp/index.scss +4 -3
  104. package/v2Containers/InApp/messages.js +7 -3
  105. package/v2Containers/InApp/reducer.js +21 -3
  106. package/v2Containers/InApp/sagas.js +29 -9
  107. package/v2Containers/InApp/selectors.js +25 -5
  108. package/v2Containers/InApp/tests/index.test.js +154 -50
  109. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  110. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  111. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  112. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
  113. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  114. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
  115. package/v2Containers/InAppWrapper/constants.js +16 -0
  116. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  117. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  118. package/v2Containers/InAppWrapper/index.js +148 -0
  119. package/v2Containers/InAppWrapper/messages.js +49 -0
  120. package/v2Containers/InappAdvance/index.js +1099 -0
  121. package/v2Containers/InappAdvance/index.scss +10 -0
  122. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  123. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
  124. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
  125. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
  126. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
  127. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
  128. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
  129. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
  130. package/v2Containers/TagList/index.js +67 -1
  131. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  132. package/v2Containers/Templates/_templates.scss +56 -200
  133. package/v2Containers/Templates/actions.js +1 -2
  134. package/v2Containers/Templates/constants.js +0 -1
  135. package/v2Containers/Templates/index.js +124 -277
  136. package/v2Containers/Templates/messages.js +4 -24
  137. package/v2Containers/Templates/reducer.js +0 -2
  138. package/v2Containers/Templates/tests/index.test.js +0 -10
  139. package/v2Containers/TemplatesV2/index.js +2 -3
  140. package/v2Containers/TemplatesV2/messages.js +0 -4
  141. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
  142. package/v2Components/CapImageUrlUpload/constants.js +0 -19
  143. package/v2Components/CapImageUrlUpload/index.js +0 -455
  144. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  145. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  146. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
  147. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  148. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
  149. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  150. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  151. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  152. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  153. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  154. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  155. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
  156. package/v2Containers/WebPush/Create/index.js +0 -1755
  157. package/v2Containers/WebPush/Create/index.scss +0 -123
  158. package/v2Containers/WebPush/Create/messages.js +0 -199
  159. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
  160. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
  161. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
  162. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
  163. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  164. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
  165. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  166. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  167. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  168. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  169. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  170. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  171. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  172. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  173. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
  174. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
  175. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  176. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
  177. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
  178. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
  179. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
  180. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
  181. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
  182. package/v2Containers/WebPush/Create/preview/constants.js +0 -162
  183. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
  184. package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
  185. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
  186. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  187. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  188. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  189. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
  190. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  191. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  192. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  193. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
  194. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
  195. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  196. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
  197. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
  198. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  199. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
  200. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  201. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
  202. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
  203. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
  204. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  205. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
  206. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
  207. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  208. package/v2Containers/WebPush/actions.js +0 -60
  209. package/v2Containers/WebPush/constants.js +0 -108
  210. package/v2Containers/WebPush/index.js +0 -2
  211. package/v2Containers/WebPush/reducer.js +0 -104
  212. package/v2Containers/WebPush/sagas.js +0 -119
  213. package/v2Containers/WebPush/selectors.js +0 -65
  214. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  215. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  216. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
Binary file
package/assets/iOS.png CHANGED
Binary file
@@ -45,6 +45,7 @@ export const GIFT_CARDS = 'GIFT_CARDS';
45
45
  export const PROMO_ENGINE = 'PROMO_ENGINE';
46
46
  export const LIQUID_SUPPORT = 'ENABLE_LIQUID_SUPPORT';
47
47
  export const ENABLE_NEW_MPUSH = 'ENABLE_NEW_MPUSH';
48
+ export const SUPPORT_CK_EDITOR = 'SUPPORT_CK_EDITOR';
48
49
  export const CUSTOM_TAG = 'CustomTagMessage';
49
50
  export const CUSTOMER_EXTENDED_FIELD = 'Customer extended fields';
50
51
  export const EXTENDED_TAG = 'ExtendedTagMessage';
@@ -168,7 +169,7 @@ export const JAPANESE_HIDE_DATE_TAGS = [
168
169
  "dd.mm.yy",
169
170
  "dd Mon",
170
171
  "dd/m/yyyy",
171
- ];
172
+ ];
172
173
 
173
174
  export const LIQUID_SUPPORTED_CHANNELS = [EMAIL, SMS, MOBILE_PUSH, INAPP];
174
175
 
package/initialReducer.js CHANGED
@@ -15,6 +15,7 @@ import galleryReducer from './v2Containers/Assets/Gallery/reducer';
15
15
  import CapCollapsibleLeftNavigationReducer from '@capillarytech/cap-ui-library/CapCollapsibleLeftNavigation/reducer';
16
16
  import { AIRA_REDUCER_DOMAIN, askAiraReducer } from '@capillarytech/cap-ui-library/CapAskAira';
17
17
  import previewAndTestReducer from './v2Components/TestAndPreviewSlidebox/reducer';
18
+ import inAppReducer from './v2Containers/InApp/reducer';
18
19
 
19
20
  export const initialReducer = {
20
21
  language: languageProviderReducer,
@@ -33,4 +34,5 @@ export const initialReducer = {
33
34
  gallery: galleryReducer,
34
35
  navigationConfig: CapCollapsibleLeftNavigationReducer,
35
36
  previewAndTest: previewAndTestReducer,
37
+ inApp: inAppReducer,
36
38
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.242-alpha.0",
4
+ "version": "8.0.242-alpha.2",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -1,6 +1,6 @@
1
1
  import { expectSaga, testSaga } from 'redux-saga-test-plan';
2
2
  import * as matchers from 'redux-saga-test-plan/matchers';
3
- import { throwError } from 'redux-saga-test-plan/providers';
3
+ import { throwError, dynamic } from 'redux-saga-test-plan/providers';
4
4
  import { call, put } from 'redux-saga/effects';
5
5
  import { pollAssetStatus } from '../assetPolling';
6
6
  import { getAssetStatus } from '../../services/api';
@@ -299,15 +299,25 @@ describe('assetPolling saga', () => {
299
299
 
300
300
  it('should handle different asset types', () => {
301
301
  const videoConfig = createMockConfig({ type: 'video' });
302
+ const videoAsset = {
303
+ ...mockAsset,
304
+ type: 'VIDEO',
305
+ metaInfo: {
306
+ video_file_path_preview: 'https://example.com/video-preview.jpg',
307
+ },
308
+ };
302
309
 
303
310
  return expectSaga(pollAssetStatus, videoConfig)
311
+ .provide({
312
+ call: delayProvider,
313
+ })
304
314
  .provide([
305
315
  [
306
316
  matchers.call.fn(getAssetStatus),
307
317
  {
308
318
  response: {
309
319
  status: 'completed',
310
- asset: { ...mockAsset, type: 'VIDEO' },
320
+ asset: videoAsset,
311
321
  },
312
322
  },
313
323
  ],
@@ -316,13 +326,74 @@ describe('assetPolling saga', () => {
316
326
  type: 'ASSET_COMPLETED',
317
327
  payload: {
318
328
  assetId: mockAssetId,
319
- asset: { ...mockAsset, type: 'VIDEO' },
329
+ asset: videoAsset,
320
330
  duration: 0, // Date.now() - startTime = 0 when mocked
321
331
  },
322
332
  })
323
333
  .run({ timeout: 15000 });
324
334
  });
325
335
 
336
+ it('should continue polling for video assets without video_file_path_preview even when status is completed', () => {
337
+ const videoConfig = createMockConfig({
338
+ type: 'video',
339
+ maxDuration: 50000, // Longer timeout for multiple polls
340
+ });
341
+ const videoAssetWithoutPreview = {
342
+ ...mockAsset,
343
+ type: 'VIDEO',
344
+ metaInfo: {}, // No video_file_path_preview
345
+ };
346
+ const videoAssetWithPreview = {
347
+ ...mockAsset,
348
+ type: 'VIDEO',
349
+ metaInfo: {
350
+ video_file_path_preview: 'https://example.com/video-preview.jpg',
351
+ },
352
+ };
353
+
354
+ // Create responses array that will be consumed sequentially
355
+ const responses = [
356
+ {
357
+ response: {
358
+ status: 'completed',
359
+ asset: videoAssetWithoutPreview,
360
+ },
361
+ },
362
+ {
363
+ response: {
364
+ status: 'completed',
365
+ asset: videoAssetWithPreview,
366
+ },
367
+ },
368
+ ];
369
+
370
+ let callIndex = 0;
371
+
372
+ return expectSaga(pollAssetStatus, videoConfig)
373
+ .provide({
374
+ call: delayProvider,
375
+ })
376
+ .provide([
377
+ [
378
+ matchers.call.fn(getAssetStatus),
379
+ dynamic(() => {
380
+ const response = responses[callIndex] || responses[responses.length - 1];
381
+ callIndex++;
382
+ return response;
383
+ }),
384
+ ],
385
+ ])
386
+ .put({
387
+ type: 'ASSET_COMPLETED',
388
+ payload: {
389
+ assetId: mockAssetId,
390
+ asset: videoAssetWithPreview,
391
+ duration: 0, // Date.now() - startTime = 0 when mocked
392
+ },
393
+ })
394
+ .run({ timeout: 20000 });
395
+ });
396
+
326
397
  it('should handle API response with success: false', () => {
327
398
  const config = createMockConfig();
328
399
  const errorMessage = 'API request failed';
@@ -18,6 +18,7 @@
18
18
  import { call, put } from 'redux-saga/effects';
19
19
  import { getAssetStatus } from '../services/api';
20
20
  import { ASSET_STATUS } from '../utils/assetStatusConstants';
21
+ import { VIDEO } from '../constants/unified';
21
22
 
22
23
  /**
23
24
  * Delay utility function compatible with redux-saga 0.16.2
@@ -118,7 +119,13 @@ export function* pollAssetStatus(config) {
118
119
  }
119
120
 
120
121
  if (statusData.status === ASSET_STATUS.COMPLETED) {
121
- // Asset completed successfully
122
+ // For video assets, continue polling until video_file_path_preview is available
123
+ // Even though status is COMPLETED, video preview generation may still be in progress
124
+ if (statusData?.asset?.type === VIDEO.toUpperCase() &&
125
+ !statusData?.asset?.metaInfo?.video_file_path_preview) {
126
+ continue;
127
+ }
128
+
122
129
  if (onCompleted) {
123
130
  const completedAction = onCompleted({
124
131
  assetId,
package/services/api.js CHANGED
@@ -287,11 +287,6 @@ export const createMobilePushTemplateV2 = (template) => {
287
287
  return request(url, getAPICallObject('POST', template));
288
288
  };
289
289
 
290
- export const createWebPushTemplate = (template) => {
291
- const url = `${API_ENDPOINT}/templates/WEBPUSH`;
292
- return request(url, getAPICallObject('POST', template));
293
- };
294
-
295
290
  export const duplicateTemplate = ({id, channel}) => {
296
291
  const url = `${API_ENDPOINT}/templates/duplicate/${id}/${channel}`;
297
292
  return request(url, getAPICallObject('GET'));
@@ -470,6 +465,11 @@ export const getCmsTemplateSettingsV2 = (cmsType, projectId, cmsMode, langId, is
470
465
  return API.get(url);
471
466
  };
472
467
 
468
+ export const getCmsAccounts = (cmsType) => {
469
+ const url = `${API_ENDPOINT}/cms/accounts?type=${cmsType}`;
470
+ return API.get(url);
471
+ };
472
+
473
473
  export const getCmsTemplateData = (cmsType, projectId, langId) => {
474
474
  const url = `${API_ENDPOINT}/cms/getContent?type=${cmsType}&projectId=${projectId}&langId=${langId}`;
475
475
  return API.get(url);
@@ -725,4 +725,9 @@ export const getAssetStatus = (type, assetId) => {
725
725
  return request(url, getAPICallObject('GET'));
726
726
  };
727
727
 
728
+ export const getBeePopupBuilderToken = () => {
729
+ const url = `${API_ENDPOINT}/common/getInappTokenData`;
730
+ return request(url, getAPICallObject('GET'));
731
+ };
732
+
728
733
  export {request, getAPICallObject};
@@ -26,6 +26,7 @@ import {
26
26
  updateMetaConfig,
27
27
  getMediaDetails,
28
28
  getAssetStatus,
29
+ getBeePopupBuilderToken,
29
30
  } from '../api';
30
31
  import { mockData } from './mockData';
31
32
  import getSchema from '../getSchema';
@@ -973,3 +974,20 @@ describe('getAssetStatus', () => {
973
974
  expect(callArgs[0]).toContain('/assets/video/asset-456/status');
974
975
  });
975
976
  });
977
+
978
+ describe('getBeePopupBuilderToken', () => {
979
+ it('should return correct response', async () => {
980
+ global.fetch.mockReturnValue(Promise.resolve({
981
+ status: 200,
982
+ json: () => Promise.resolve({
983
+ status: 200,
984
+ response: 'test',
985
+ }),
986
+ }));
987
+ const result = await getBeePopupBuilderToken();
988
+ expect(result).toEqual({
989
+ status: 200,
990
+ response: 'test',
991
+ });
992
+ });
993
+ });
@@ -2022,7 +2022,6 @@
2022
2022
  "creatives.containersV2.Whatsapp.vietnamese": "Vietnamese",
2023
2023
  "creatives.containersV2.Whatsapp.whatsappCreateNotification": "{name} has been sent for approval",
2024
2024
  "creatives.containersV2.Whatsapp.zulu": "Zulu",
2025
- "creatives.containersV2.WebPush.addLabels": "Add labels",
2026
2025
  "creatives.containersV2.addLabels": "Add labels",
2027
2026
  "creatives.containersV2.appName": "App Name",
2028
2027
  "creatives.containersV2.applyNow": "Apply now",
package/utils/common.js CHANGED
@@ -22,6 +22,7 @@ import {
22
22
  BADGES_ISSUE,
23
23
  ENABLE_WECHAT,
24
24
  LIQUID_SUPPORT,
25
+ SUPPORT_CK_EDITOR,
25
26
  ENABLE_NEW_MPUSH
26
27
  } from '../constants/unified';
27
28
  import { apiMessageFormatHandler } from './commonUtils';
@@ -95,6 +96,10 @@ export const hasLiquidSupportFeature = Auth.hasFeatureAccess.bind(
95
96
  LIQUID_SUPPORT,
96
97
  );
97
98
 
99
+ export const hasSupportCKEditor = Auth.hasFeatureAccess.bind(
100
+ null,
101
+ SUPPORT_CK_EDITOR,
102
+ );
98
103
 
99
104
  export const hasGiftVoucherFeature = Auth.hasFeatureAccess.bind(
100
105
  null,
@@ -398,7 +398,20 @@ export const validateMobilePushContent = async (formData, options) => {
398
398
  // Helper function to extract content for a platform
399
399
  export const extractContent = (platformData) => {
400
400
  if (!platformData) return '';
401
- const { title, message, ctas } = platformData;
401
+ const { title, message, ctas, isBEEeditor, beeHtml } = platformData;
402
+
403
+ // For BEE editor, extract content from beeHtml
404
+ if (isBEEeditor && beeHtml) {
405
+ // beeHtml can be an object with value property or a string
406
+ const beeHtmlContent = typeof beeHtml === 'string' ? beeHtml : (beeHtml?.value || '');
407
+ return [
408
+ title,
409
+ beeHtmlContent,
410
+ ...((ctas?.map((cta) => cta?.text || cta?.actionLink)) || []),
411
+ ].filter(Boolean).join(' ');
412
+ }
413
+
414
+ // For regular content
402
415
  return [
403
416
  title,
404
417
  message,
@@ -1376,4 +1376,228 @@ describe("validateCarouselCards", () => {
1376
1376
  expect(result.isValid).toBe(true);
1377
1377
  });
1378
1378
  });
1379
+
1380
+ describe('extractContent BEE Editor Logic (L404-L412)', () => {
1381
+ it('extracts content from beeHtml as string', () => {
1382
+ const platformData = {
1383
+ title: 'Test Title',
1384
+ isBEEeditor: true,
1385
+ beeHtml: '<p>BEE HTML Content</p>',
1386
+ ctas: [
1387
+ { text: 'Click Here', actionLink: 'https://example.com' },
1388
+ ],
1389
+ };
1390
+
1391
+ const result = extractContent(platformData);
1392
+
1393
+ expect(result).toContain('Test Title');
1394
+ expect(result).toContain('<p>BEE HTML Content</p>');
1395
+ expect(result).toContain('Click Here');
1396
+ });
1397
+
1398
+ it('extracts content from beeHtml as object with value property', () => {
1399
+ const platformData = {
1400
+ title: 'Test Title',
1401
+ isBEEeditor: true,
1402
+ beeHtml: { value: '<p>BEE HTML from Object</p>' },
1403
+ ctas: [
1404
+ { text: 'Button Text' },
1405
+ ],
1406
+ };
1407
+
1408
+ const result = extractContent(platformData);
1409
+
1410
+ expect(result).toContain('Test Title');
1411
+ expect(result).toContain('<p>BEE HTML from Object</p>');
1412
+ expect(result).toContain('Button Text');
1413
+ });
1414
+
1415
+ it('handles beeHtml as object without value property', () => {
1416
+ const platformData = {
1417
+ title: 'Test Title',
1418
+ isBEEeditor: true,
1419
+ beeHtml: { someOtherProperty: 'data' },
1420
+ ctas: [],
1421
+ };
1422
+
1423
+ const result = extractContent(platformData);
1424
+
1425
+ // Should extract title and empty beeHtml (since value is undefined)
1426
+ expect(result).toContain('Test Title');
1427
+ expect(result).not.toContain('someOtherProperty');
1428
+ });
1429
+
1430
+ it('extracts ctas with text property', () => {
1431
+ const platformData = {
1432
+ title: 'Title',
1433
+ isBEEeditor: true,
1434
+ beeHtml: '<p>Content</p>',
1435
+ ctas: [
1436
+ { text: 'CTA Text 1' },
1437
+ { text: 'CTA Text 2' },
1438
+ ],
1439
+ };
1440
+
1441
+ const result = extractContent(platformData);
1442
+
1443
+ expect(result).toContain('CTA Text 1');
1444
+ expect(result).toContain('CTA Text 2');
1445
+ });
1446
+
1447
+ it('extracts ctas with actionLink when text is missing', () => {
1448
+ const platformData = {
1449
+ title: 'Title',
1450
+ isBEEeditor: true,
1451
+ beeHtml: '<p>Content</p>',
1452
+ ctas: [
1453
+ { actionLink: 'https://link1.com' },
1454
+ { actionLink: 'https://link2.com' },
1455
+ ],
1456
+ };
1457
+
1458
+ const result = extractContent(platformData);
1459
+
1460
+ expect(result).toContain('https://link1.com');
1461
+ expect(result).toContain('https://link2.com');
1462
+ });
1463
+
1464
+ it('filters out falsy values with filter(Boolean)', () => {
1465
+ const platformData = {
1466
+ title: '',
1467
+ isBEEeditor: true,
1468
+ beeHtml: null,
1469
+ ctas: [
1470
+ { text: null, actionLink: null },
1471
+ { text: 'Valid Text' },
1472
+ ],
1473
+ };
1474
+
1475
+ const result = extractContent(platformData);
1476
+
1477
+ // Should only contain 'Valid Text' after filtering
1478
+ expect(result).toBe('Valid Text');
1479
+ });
1480
+
1481
+ it('handles empty ctas array', () => {
1482
+ const platformData = {
1483
+ title: 'Title Only',
1484
+ isBEEeditor: true,
1485
+ beeHtml: '<p>BEE Content</p>',
1486
+ ctas: [],
1487
+ };
1488
+
1489
+ const result = extractContent(platformData);
1490
+
1491
+ expect(result).toContain('Title Only');
1492
+ expect(result).toContain('<p>BEE Content</p>');
1493
+ });
1494
+
1495
+ it('handles undefined ctas', () => {
1496
+ const platformData = {
1497
+ title: 'Title',
1498
+ isBEEeditor: true,
1499
+ beeHtml: '<p>Content</p>',
1500
+ ctas: undefined,
1501
+ };
1502
+
1503
+ const result = extractContent(platformData);
1504
+
1505
+ expect(result).toContain('Title');
1506
+ expect(result).toContain('<p>Content</p>');
1507
+ });
1508
+
1509
+ it('joins all content with spaces', () => {
1510
+ const platformData = {
1511
+ title: 'Title',
1512
+ isBEEeditor: true,
1513
+ beeHtml: 'HTML',
1514
+ ctas: [
1515
+ { text: 'CTA1' },
1516
+ { text: 'CTA2' },
1517
+ ],
1518
+ };
1519
+
1520
+ const result = extractContent(platformData);
1521
+
1522
+ expect(result).toBe('Title HTML CTA1 CTA2');
1523
+ });
1524
+
1525
+ it('falls back to regular content when not BEE editor', () => {
1526
+ const platformData = {
1527
+ title: 'Title',
1528
+ message: 'Message',
1529
+ isBEEeditor: false,
1530
+ beeHtml: '<p>Should be ignored</p>',
1531
+ ctas: [
1532
+ { text: 'CTA' },
1533
+ ],
1534
+ };
1535
+
1536
+ const result = extractContent(platformData);
1537
+
1538
+ expect(result).toContain('Title');
1539
+ expect(result).toContain('Message');
1540
+ expect(result).toContain('CTA');
1541
+ expect(result).not.toContain('<p>Should be ignored</p>');
1542
+ });
1543
+
1544
+ it('handles null beeHtml', () => {
1545
+ const platformData = {
1546
+ title: 'Title',
1547
+ isBEEeditor: true,
1548
+ beeHtml: null,
1549
+ ctas: [{ text: 'CTA' }],
1550
+ };
1551
+
1552
+ const result = extractContent(platformData);
1553
+
1554
+ expect(result).toContain('Title');
1555
+ expect(result).toContain('CTA');
1556
+ });
1557
+
1558
+ it('handles undefined beeHtml', () => {
1559
+ const platformData = {
1560
+ title: 'Title',
1561
+ isBEEeditor: true,
1562
+ beeHtml: undefined,
1563
+ ctas: [],
1564
+ };
1565
+
1566
+ const result = extractContent(platformData);
1567
+
1568
+ expect(result).toBe('Title');
1569
+ });
1570
+
1571
+ it('handles complex ctas with both text and actionLink', () => {
1572
+ const platformData = {
1573
+ title: 'Title',
1574
+ isBEEeditor: true,
1575
+ beeHtml: 'Content',
1576
+ ctas: [
1577
+ { text: 'CTA Text', actionLink: 'https://example.com' },
1578
+ ],
1579
+ };
1580
+
1581
+ const result = extractContent(platformData);
1582
+
1583
+ // Should prefer text over actionLink
1584
+ expect(result).toContain('CTA Text');
1585
+ expect(result).toContain('Title');
1586
+ expect(result).toContain('Content');
1587
+ });
1588
+
1589
+ it('handles empty string beeHtml', () => {
1590
+ const platformData = {
1591
+ title: 'Title',
1592
+ isBEEeditor: true,
1593
+ beeHtml: '',
1594
+ ctas: [{ text: 'CTA' }],
1595
+ };
1596
+
1597
+ const result = extractContent(platformData);
1598
+
1599
+ expect(result).toBe('Title CTA');
1600
+ });
1601
+ });
1379
1602
  });
1603
+
@@ -101,7 +101,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
101
101
  const contentType = detectMediaContentType(templateConfig);
102
102
 
103
103
  if (contentType === MEDIA_CONTENT_TYPE.NONE) {
104
- console.log('No media content detected, returning original config');
105
104
  return templateConfig;
106
105
  }
107
106
 
@@ -109,24 +108,19 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
109
108
  let transformDirection;
110
109
  if (forceDirection) {
111
110
  transformDirection = forceDirection;
112
- console.log(`Forced transformation direction: ${transformDirection}`);
113
111
  } else {
114
112
  // Auto-detect based on content
115
113
  if (contentType === MEDIA_CONTENT_TYPE.URLS) {
116
114
  transformDirection = TRANSFORM_DIRECTION.FORWARD; // URLs → tags
117
- console.log('Detected URLs, applying forward transformation (URLs → tags)');
118
115
  } else if (contentType === MEDIA_CONTENT_TYPE.TAGS) {
119
116
  transformDirection = TRANSFORM_DIRECTION.REVERSE; // tags → URLs
120
- console.log('Detected media_content tags, applying reverse transformation (tags → URLs)');
121
117
  } else if (contentType === MEDIA_CONTENT_TYPE.MIXED) {
122
118
  transformDirection = TRANSFORM_DIRECTION.SMART; // Handle mixed content intelligently
123
- console.log('Detected mixed content, applying smart transformation');
124
119
  }
125
120
  }
126
121
 
127
122
  const newConfig = cloneDeep(templateConfig);
128
123
  try {
129
- console.log(`Fetching media details for ${transformDirection} transformation, ID: ${mediaDetailsId}`);
130
124
 
131
125
  // Fetch media details mapping from API
132
126
  const response = await getMediaDetails({ id: mediaDetailsId })
@@ -145,7 +139,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
145
139
  idToUrlMapping[mediaId] = url;
146
140
  });
147
141
 
148
- console.log(`Processing ${Object.keys(urlToIdMapping).length} media mappings`);
149
142
 
150
143
  // Apply transformations based on direction
151
144
  newConfig?.cards?.forEach(card => {
@@ -157,7 +150,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
157
150
  // Forward transformation: URL → tag
158
151
  const mediaDetailId = urlToIdMapping[currentUrl];
159
152
  if (mediaDetailId) {
160
- console.log(`Forward: ${currentUrl} → {{media_content(${mediaDetailId})}}`);
161
153
  card.media.url = `{{media_content(${mediaDetailId})}}`;
162
154
  } else {
163
155
  console.warn(`No media detail ID found for URL: ${currentUrl}`);
@@ -169,7 +161,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
169
161
  if (mediaId) {
170
162
  const actualUrl = idToUrlMapping[mediaId];
171
163
  if (actualUrl) {
172
- console.log(`Reverse: {{media_content(${mediaId})}} → ${actualUrl}`);
173
164
  card.media.url = actualUrl;
174
165
  } else {
175
166
  console.warn(`No URL found for media ID: ${mediaId}`);
@@ -185,7 +176,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
185
176
  console.error('Failed to fetch media details for transformation:', error);
186
177
 
187
178
  // Fallback: try to extract/convert what we can without API
188
- console.log('Falling back to URL extraction method');
189
179
  newConfig.cards.forEach(card => {
190
180
  if (card.media && card.media.url) {
191
181
  if (transformDirection === TRANSFORM_DIRECTION.FORWARD) {
@@ -10,7 +10,6 @@ import {
10
10
  RCS,
11
11
  LINE,
12
12
  VIBER,
13
- WEBPUSH,
14
13
  EMF,
15
14
  VENENO,
16
15
  TEXT,
@@ -64,8 +63,6 @@ export const transformChannelPayload = (data, options = {}) => {
64
63
  return transformLinePayload(data, options);
65
64
  case VIBER:
66
65
  return transformViberPayload(data, options);
67
- case WEBPUSH:
68
- return transformWebpushPayload(data, options);
69
66
  default:
70
67
  return data; // Return unchanged for unsupported channels
71
68
  }
@@ -320,45 +317,6 @@ const transformViberPayload = (viberData, options = {}) => {
320
317
  return payload;
321
318
  };
322
319
 
323
- /**
324
- * Transforms WebPush data to the required payload format
325
- * @param {Object} webpushData - Current WebPush data
326
- * @param {Object} options - Additional options (ouId, sourceEntityId, etc.)
327
- * @returns {Object} - Transformed WebPush payload
328
- */
329
- const transformWebpushPayload = (webpushData, options = {}) => {
330
- const { loyaltyMetaData = {} } = options;
331
- const { transformedMessageDetails = {} } = loyaltyMetaData;
332
- const { webpushDeliverySettings = {} } = transformedMessageDetails || {};
333
-
334
- // Get base payload structure
335
- const payload = createBasePayload(WEBPUSH, loyaltyMetaData);
336
-
337
- // Extract webpush content from messageContent.content.content structure
338
- const webpushContent = webpushData?.messageContent?.content?.content || {};
339
- const accountId = webpushData?.messageContent?.content?.accountId || 0;
340
-
341
- // Add WebPush-specific properties
342
- payload.centralCommsPayload.webpushMessageContent = {
343
- channel: WEBPUSH,
344
- accountId,
345
- isDefault: webpushData?.messageContent?.content?.isDefault || false,
346
- storeType: webpushData?.messageContent?.content?.storeType || 'REGISTERED_STORE',
347
- content: {
348
- title: webpushContent?.title || '',
349
- message: webpushContent?.message || '',
350
- ...(webpushContent?.iconImageUrl && { iconImageUrl: webpushContent.iconImageUrl }),
351
- ...(webpushContent?.cta && { cta: webpushContent.cta }),
352
- ...(webpushContent?.expandableDetails && { expandableDetails: webpushContent.expandableDetails }),
353
- },
354
- messageSubject: webpushData?.messageSubject || "",
355
- offers: webpushData?.messageContent?.content?.offers || [],
356
- };
357
- payload.centralCommsPayload.webpushDeliverySettings = webpushDeliverySettings;
358
-
359
- return payload;
360
- };
361
-
362
320
  // Checks if the template has changed
363
321
  export const getTemplateDiffState = (channel, oldData, newData) => {
364
322
  switch (channel.toUpperCase()) {