@capillarytech/creatives-library 8.0.264 → 8.0.266-alpha.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 (292) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -2
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/services/api.js +10 -5
  7. package/services/tests/api.test.js +34 -0
  8. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +17 -35
  9. package/tests/integration/TemplateCreation/api-response.js +31 -1
  10. package/tests/integration/TemplateCreation/msw-handler.js +2 -0
  11. package/utils/common.js +5 -6
  12. package/utils/commonUtils.js +28 -5
  13. package/utils/tagValidations.js +1 -2
  14. package/utils/tests/commonUtil.test.js +224 -0
  15. package/utils/tests/transformerUtils.test.js +0 -297
  16. package/utils/transformTemplateConfig.js +0 -10
  17. package/utils/transformerUtils.js +0 -40
  18. package/v2Components/CapDeviceContent/index.js +61 -56
  19. package/v2Components/CapImageUpload/constants.js +0 -2
  20. package/v2Components/CapImageUpload/index.js +16 -65
  21. package/v2Components/CapImageUpload/index.scss +1 -4
  22. package/v2Components/CapImageUpload/messages.js +1 -5
  23. package/v2Components/CapTagList/index.js +6 -1
  24. package/v2Components/CapTagListWithInput/index.js +5 -1
  25. package/v2Components/CapTagListWithInput/messages.js +1 -1
  26. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  27. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +2 -2
  28. package/v2Components/ErrorInfoNote/constants.js +1 -0
  29. package/v2Components/ErrorInfoNote/index.js +402 -72
  30. package/v2Components/ErrorInfoNote/messages.js +32 -6
  31. package/v2Components/ErrorInfoNote/style.scss +278 -6
  32. package/v2Components/FormBuilder/index.js +8 -8
  33. package/v2Components/FormBuilder/tests/index.test.js +13 -4
  34. package/v2Components/HtmlEditor/HTMLEditor.js +418 -99
  35. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +870 -0
  36. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1882 -133
  37. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +27 -16
  38. package/v2Components/HtmlEditor/_htmlEditor.scss +108 -45
  39. package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
  40. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +23 -102
  41. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -140
  42. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  43. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  44. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +9 -1
  45. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +31 -6
  46. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
  47. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  48. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  49. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  50. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  51. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  52. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +7 -10
  53. package/v2Components/HtmlEditor/components/PreviewPane/index.js +22 -43
  54. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  55. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +18 -0
  56. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +36 -31
  57. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +46 -34
  58. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +6 -0
  59. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +52 -46
  60. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +277 -0
  61. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +295 -0
  62. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  63. package/v2Components/HtmlEditor/constants.js +45 -20
  64. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  65. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +351 -16
  66. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  67. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  68. package/v2Components/HtmlEditor/hooks/useValidation.js +213 -56
  69. package/v2Components/HtmlEditor/index.js +1 -1
  70. package/v2Components/HtmlEditor/messages.js +102 -94
  71. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +214 -45
  72. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +134 -0
  73. package/v2Components/HtmlEditor/utils/contentSanitizer.js +40 -41
  74. package/v2Components/HtmlEditor/utils/htmlValidator.js +71 -72
  75. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +158 -124
  76. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  77. package/v2Components/HtmlEditor/utils/validationAdapter.js +66 -41
  78. package/v2Components/HtmlEditor/utils/validationConstants.js +38 -0
  79. package/v2Components/MobilePushPreviewV2/constants.js +6 -0
  80. package/v2Components/MobilePushPreviewV2/index.js +33 -7
  81. package/v2Components/TemplatePreview/_templatePreview.scss +55 -24
  82. package/v2Components/TemplatePreview/index.js +47 -32
  83. package/v2Components/TemplatePreview/messages.js +4 -0
  84. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +1 -0
  85. package/v2Containers/App/constants.js +0 -5
  86. package/v2Containers/BeeEditor/index.js +172 -90
  87. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +14 -0
  88. package/v2Containers/BeePopupEditor/constants.js +10 -0
  89. package/v2Containers/BeePopupEditor/index.js +194 -0
  90. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  91. package/v2Containers/CreativesContainer/SlideBoxContent.js +129 -108
  92. package/v2Containers/CreativesContainer/SlideBoxFooter.js +163 -13
  93. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  94. package/v2Containers/CreativesContainer/constants.js +1 -3
  95. package/v2Containers/CreativesContainer/index.js +240 -214
  96. package/v2Containers/CreativesContainer/messages.js +8 -4
  97. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  98. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
  99. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -354
  100. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +103 -0
  101. package/v2Containers/Email/actions.js +7 -0
  102. package/v2Containers/Email/constants.js +5 -1
  103. package/v2Containers/Email/index.js +241 -32
  104. package/v2Containers/Email/messages.js +32 -0
  105. package/v2Containers/Email/reducer.js +12 -1
  106. package/v2Containers/Email/sagas.js +61 -7
  107. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  108. package/v2Containers/Email/tests/reducer.test.js +46 -0
  109. package/v2Containers/Email/tests/sagas.test.js +320 -29
  110. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1246 -0
  111. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +211 -21
  112. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  113. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +2472 -0
  114. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +520 -0
  115. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  116. package/v2Containers/EmailWrapper/constants.js +2 -0
  117. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +629 -77
  118. package/v2Containers/EmailWrapper/index.js +103 -23
  119. package/v2Containers/EmailWrapper/messages.js +65 -1
  120. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +956 -0
  121. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +594 -77
  122. package/v2Containers/FTP/index.js +1 -1
  123. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  124. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  125. package/v2Containers/InApp/actions.js +7 -0
  126. package/v2Containers/InApp/constants.js +20 -4
  127. package/v2Containers/InApp/index.js +802 -360
  128. package/v2Containers/InApp/index.scss +4 -3
  129. package/v2Containers/InApp/messages.js +7 -3
  130. package/v2Containers/InApp/reducer.js +21 -3
  131. package/v2Containers/InApp/sagas.js +29 -9
  132. package/v2Containers/InApp/selectors.js +25 -5
  133. package/v2Containers/InApp/tests/index.test.js +154 -50
  134. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  135. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  136. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  137. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +151 -0
  138. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  139. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +23 -0
  140. package/v2Containers/InAppWrapper/constants.js +16 -0
  141. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  142. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  143. package/v2Containers/InAppWrapper/index.js +148 -0
  144. package/v2Containers/InAppWrapper/messages.js +49 -0
  145. package/v2Containers/InappAdvance/index.js +1099 -0
  146. package/v2Containers/InappAdvance/index.scss +10 -0
  147. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  148. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
  149. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
  150. package/v2Containers/Line/Container/Text/index.js +0 -1
  151. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
  152. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
  153. package/v2Containers/MobilePushNew/index.js +0 -1
  154. package/v2Containers/Rcs/index.js +0 -3
  155. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -0
  156. package/v2Containers/SmsTrai/Edit/index.js +0 -1
  157. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
  158. package/v2Containers/TagList/index.js +62 -19
  159. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  160. package/v2Containers/Templates/_templates.scss +56 -202
  161. package/v2Containers/Templates/actions.js +1 -2
  162. package/v2Containers/Templates/constants.js +0 -1
  163. package/v2Containers/Templates/index.js +123 -278
  164. package/v2Containers/Templates/messages.js +4 -24
  165. package/v2Containers/Templates/reducer.js +0 -2
  166. package/v2Containers/Templates/tests/index.test.js +0 -10
  167. package/v2Containers/TemplatesV2/TemplatesV2.style.js +4 -2
  168. package/v2Containers/TemplatesV2/index.js +7 -15
  169. package/v2Containers/TemplatesV2/messages.js +0 -4
  170. package/v2Containers/Viber/index.js +0 -1
  171. package/v2Containers/Whatsapp/index.js +0 -1
  172. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -0
  173. package/v2Containers/Zalo/index.js +0 -1
  174. package/v2Containers/Zalo/tests/index.test.js +5 -1
  175. package/utils/imageUrlUpload.js +0 -141
  176. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  177. package/v2Components/CapImageUrlUpload/index.js +0 -365
  178. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  179. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  180. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
  181. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
  182. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  183. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  184. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  185. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  186. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  187. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  188. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  189. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  190. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  191. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  192. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  193. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  194. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  195. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  196. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  197. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  198. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  199. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  200. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  201. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  202. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  203. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  204. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  205. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  206. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  207. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  208. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  209. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  210. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  211. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  212. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  213. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  214. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  215. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  216. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  217. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  218. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  219. package/v2Containers/WebPush/Create/index.js +0 -1148
  220. package/v2Containers/WebPush/Create/index.scss +0 -134
  221. package/v2Containers/WebPush/Create/messages.js +0 -211
  222. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  223. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  224. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  225. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  226. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
  227. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  228. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  229. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  230. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  231. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  232. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  233. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  234. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  235. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  236. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  237. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  238. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  239. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  240. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  241. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  242. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
  243. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
  244. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  245. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  246. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  247. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  248. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  249. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  250. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
  251. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  252. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  253. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  254. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  255. package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
  256. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  257. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  258. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  259. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  260. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  261. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  262. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  263. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  264. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  265. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  266. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  267. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  268. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  269. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  270. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  271. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  272. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  273. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  274. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  275. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  276. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  277. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  278. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  279. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  280. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  281. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  282. package/v2Containers/WebPush/Create/utils/validation.js +0 -76
  283. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  284. package/v2Containers/WebPush/actions.js +0 -60
  285. package/v2Containers/WebPush/constants.js +0 -132
  286. package/v2Containers/WebPush/index.js +0 -2
  287. package/v2Containers/WebPush/reducer.js +0 -104
  288. package/v2Containers/WebPush/sagas.js +0 -119
  289. package/v2Containers/WebPush/selectors.js +0 -65
  290. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  291. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  292. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
Binary file
package/assets/iOS.png CHANGED
Binary file
@@ -45,13 +45,13 @@ 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';
51
52
  export const BADGES_UI_ENABLED = 'BADGES_UI_ENABLED';
52
53
  export const JP_LOCALE_HIDE_FEATURE = 'JP_LOCALE_HIDE_FEATURE';
53
54
  export const ENABLE_WECHAT = 'ENABLE_WECHAT';
54
- export const ENABLE_WEBPUSH = 'ENABLE_WEBPUSH';
55
55
  export const ENABLE_CUSTOMER_BARCODE_TAG = 'ENABLE_CUSTOMER_BARCODE_TAG';
56
56
  export const EMAIL_UNSUBSCRIBE_TAG_MANDATORY = 'EMAIL_UNSUBSCRIBE_TAG_MANDATORY';
57
57
  export const ENABLE_AI_SUGGESTIONS = 'ENABLE_AI_SUGGESTIONS';
@@ -169,7 +169,7 @@ export const JAPANESE_HIDE_DATE_TAGS = [
169
169
  "dd.mm.yy",
170
170
  "dd Mon",
171
171
  "dd/m/yyyy",
172
- ];
172
+ ];
173
173
 
174
174
  export const LIQUID_SUPPORTED_CHANNELS = [EMAIL, SMS, MOBILE_PUSH, INAPP];
175
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.264",
4
+ "version": "8.0.266-alpha.0",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
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,8 @@ import {
26
26
  updateMetaConfig,
27
27
  getMediaDetails,
28
28
  getAssetStatus,
29
+ getBeePopupBuilderToken,
30
+ getCmsAccounts,
29
31
  } from '../api';
30
32
  import { mockData } from './mockData';
31
33
  import getSchema from '../getSchema';
@@ -973,3 +975,35 @@ describe('getAssetStatus', () => {
973
975
  expect(callArgs[0]).toContain('/assets/video/asset-456/status');
974
976
  });
975
977
  });
978
+
979
+ describe('getBeePopupBuilderToken', () => {
980
+ it('should return correct response', async () => {
981
+ global.fetch.mockReturnValue(Promise.resolve({
982
+ status: 200,
983
+ json: () => Promise.resolve({
984
+ status: 200,
985
+ response: 'test',
986
+ }),
987
+ }));
988
+ const result = await getBeePopupBuilderToken();
989
+ expect(result).toEqual({
990
+ status: 200,
991
+ response: 'test',
992
+ });
993
+ });
994
+ });
995
+
996
+ describe('getCmsAccounts', () => {
997
+ it('should return a promise (line 473-476)', () => {
998
+ // Similar to other API tests, just verify it returns a Promise
999
+ const result = getCmsAccounts('bee');
1000
+ expect(result).toBeInstanceOf(Promise);
1001
+ });
1002
+
1003
+ it('should be callable with cmsType parameter', () => {
1004
+ // Verify function exists and can be called
1005
+ expect(typeof getCmsAccounts).toBe('function');
1006
+ const result = getCmsAccounts('bee');
1007
+ expect(result).toBeInstanceOf(Promise);
1008
+ });
1009
+ });
@@ -17,6 +17,7 @@ import { initialReducer } from '../../../initialReducer';
17
17
  import { mockInitialState } from './mocks/initialState';
18
18
  import TemplatesV2 from '../../../v2Containers/TemplatesV2';
19
19
  import globalMessages from '../../../v2Containers/Cap/messages';
20
+ import rcsMessages from '../../../v2Containers/Rcs/messages';
20
21
  import * as helper from './helper';
21
22
 
22
23
  jest.mock('@capillarytech/cap-ui-utils', () => ({
@@ -147,13 +148,16 @@ describe("Creatives testing template creation", () => {
147
148
  fireEvent.change(templateNameInput, {
148
149
  target: { value: 'rcs_test_template' },
149
150
  });
150
- const imageRadioBtn = creativesScreen.getByText(/image/i);
151
+ const richCardOption = await creativesScreen.findByText(/rich card/i);
152
+ fireEvent.click(richCardOption);
153
+ const imageRadioBtn = await creativesScreen.findByRole('radio', {
154
+ name: /image/i,
155
+ });
151
156
  fireEvent.click(imageRadioBtn);
152
- const imageUploader = await creativesScreen.findByText(/drag and drop image here/i);
157
+ const imageUploader = await creativesScreen.findByText(
158
+ /drag and drop image here/i,
159
+ );
153
160
  expect(imageUploader).toBeInTheDocument();
154
- const noneRadioBtn = await creativesScreen.findByText(/none/i);
155
- fireEvent.click(noneRadioBtn);
156
- expect(imageUploader).not.toBeInTheDocument();
157
161
 
158
162
  // Enter the template title
159
163
  const templateTitleInput = await creativesScreen.findByTestId(
@@ -175,7 +179,7 @@ describe("Creatives testing template creation", () => {
175
179
 
176
180
  // click on Done button
177
181
  const doneButton = creativesScreen.getByRole('button', {
178
- name: globalMessages.done.defaultMessage,
182
+ name: rcsMessages.sendForApprovalButtonLabel.defaultMessage,
179
183
  });
180
184
  await userEvent.click(doneButton);
181
185
  expect(createButton).toBeInTheDocument();
@@ -188,11 +192,13 @@ describe("Creatives testing template creation", () => {
188
192
  name: /rcs/i,
189
193
  });
190
194
  await userEvent.click(rcs);
191
- const createButton = creativesScreen.getByRole('button', {
195
+ const createButton = await creativesScreen.findByRole('button', {
192
196
  name: /create new/i,
193
197
  });
194
198
  await waitFor(() => expect(createButton).toBeEnabled(),{ timeout: 5000, interval: 100 });
195
199
  await userEvent.click(createButton);
200
+ const richCardOption = await creativesScreen.findByText(/rich card/i);
201
+ fireEvent.click(richCardOption);
196
202
  const templateNameInput = await creativesScreen.findByTestId(
197
203
  /template_name/,
198
204
  {},
@@ -217,38 +223,14 @@ describe("Creatives testing template creation", () => {
217
223
  fireEvent.change(templateTextInput, {
218
224
  target: { value: 'rcs_template_text' },
219
225
  });
220
- const ctaCheckBox = creativesScreen.getByText(/call to action/i);
221
- fireEvent.click(ctaCheckBox);
222
- const doneButton = creativesScreen.getByRole('button', {
223
- name: globalMessages.done.defaultMessage,
226
+ const addButton = creativesScreen.getByRole('button', {
227
+ name: /add button/i,
224
228
  });
225
- //done button will be disabled cta button is not configured
226
- expect(doneButton).toBeDisabled();
227
-
228
- //configuring cta button
229
- //accessing cta button textBox by char limit
230
- const textLimit = creativesScreen.getByText(/0 \/ 20/i);
231
- const ctaBtnText = textLimit.parentElement.previousSibling;
232
-
233
- //configuring CTA button text and URL
229
+ fireEvent.click(addButton);
230
+ const ctaBtnText = creativesScreen.getByPlaceholderText(/enter button text/i);
234
231
  fireEvent.change(ctaBtnText, {
235
232
  target: { value: 'cta_button' },
236
233
  });
237
- const ctaLink = await creativesScreen.findByTestId(
238
- /cta_btn_link/,
239
- {},
240
- );
241
- fireEvent.change(ctaLink, {
242
- target: { value: 'invalid url' },
243
- });
244
- const urlError = creativesScreen.getByText(/button url is not valid/i);
245
- expect(urlError).toBeInTheDocument();
246
- fireEvent.change(ctaLink, {
247
- target: { value: 'https://capillarytech.com/' },
248
- });
249
- expect(urlError).not.toBeInTheDocument();
250
- //saving the template
251
- fireEvent.click(doneButton);
252
234
  expect(createButton).toBeInTheDocument();
253
235
  });
254
236
 
@@ -1558,6 +1558,25 @@ export const whatsappAccount = {
1558
1558
  response: []
1559
1559
  };
1560
1560
 
1561
+ export const rcsAccount = {
1562
+ success: true,
1563
+ status: {
1564
+ isError: false,
1565
+ code: 200,
1566
+ message: "success",
1567
+ },
1568
+ message: "WeCRM Account details fetched",
1569
+ response: [
1570
+ {
1571
+ name: "RCS Account",
1572
+ sourceAccountIdentifier: "rcs_account",
1573
+ configs: {
1574
+ accessToken: "rcs_access_token",
1575
+ },
1576
+ },
1577
+ ],
1578
+ };
1579
+
1561
1580
  export const mpushAccount = {
1562
1581
  success: true,
1563
1582
  status: {
@@ -1716,7 +1735,18 @@ export const emailTemplates = {
1716
1735
 
1717
1736
  export const domainProperties = {
1718
1737
  entity:{
1719
- WHATSAPP:[]
1738
+ WHATSAPP:[],
1739
+ RCS: [
1740
+ {
1741
+ domainProperties: {
1742
+ hostName: "rcs-host",
1743
+ connectionProperties: {
1744
+ sourceAccountIdentifier: "rcs_account",
1745
+ account_sid: "rcs_account",
1746
+ },
1747
+ },
1748
+ },
1749
+ ],
1720
1750
  },
1721
1751
  warnings:[]
1722
1752
  };
@@ -36,6 +36,8 @@ export const server = setupServer(
36
36
  rest.get(`${API_ENDPOINT}/meta/wecrm`, (req, res, ctx) => {
37
37
  const sourceName = req.url.searchParams.get('source_name');
38
38
  switch (sourceName) {
39
+ case 'RCS':
40
+ return res(ctx.status(200), ctx.json(apiResponse.rcsAccount));
39
41
  case 'WHATSAPP':
40
42
  return res(ctx.status(200), ctx.json(apiResponse.whatsappAccount));
41
43
  case 'VIBER':
package/utils/common.js CHANGED
@@ -21,8 +21,8 @@ import {
21
21
  EMAIL_UNSUBSCRIBE_TAG_MANDATORY,
22
22
  BADGES_ISSUE,
23
23
  ENABLE_WECHAT,
24
- ENABLE_WEBPUSH,
25
24
  LIQUID_SUPPORT,
25
+ SUPPORT_CK_EDITOR,
26
26
  ENABLE_NEW_MPUSH
27
27
  } from '../constants/unified';
28
28
  import { apiMessageFormatHandler } from './commonUtils';
@@ -96,6 +96,10 @@ export const hasLiquidSupportFeature = Auth.hasFeatureAccess.bind(
96
96
  LIQUID_SUPPORT,
97
97
  );
98
98
 
99
+ export const hasSupportCKEditor = Auth.hasFeatureAccess.bind(
100
+ null,
101
+ SUPPORT_CK_EDITOR,
102
+ );
99
103
 
100
104
  export const hasGiftVoucherFeature = Auth.hasFeatureAccess.bind(
101
105
  null,
@@ -117,11 +121,6 @@ export const hasWechatFeatureEnabled = Auth.hasFeatureAccess.bind(
117
121
  ENABLE_WECHAT,
118
122
  );
119
123
 
120
- export const hasWebPushFeatureEnabled = Auth.hasFeatureAccess.bind(
121
- null,
122
- ENABLE_WEBPUSH,
123
- );
124
-
125
124
  export const hasCustomerBarcodeFeatureEnabled = Auth.hasFeatureAccess.bind(
126
125
  null,
127
126
  ENABLE_CUSTOMER_BARCODE_TAG,
@@ -173,20 +173,30 @@ export const validateLiquidTemplateContent = async (
173
173
  // Handle API errors or empty content
174
174
  if (result?.errors?.length > 0 || !validString || isError) {
175
175
  let standardErrors = [];
176
+ let liquidErrors = [];
177
+
178
+ // Empty content errors are NOT from liquid endpoints, so they go to standardErrors
176
179
  if (!validString) {
177
180
  standardErrors = [emptyBodyError];
178
181
  }
179
- let liquidErrors;
180
- if (result && Array.isArray(result?.errors)) {
181
- liquidErrors = result?.errors?.map((error) => {
182
+
183
+ // IMPORTANT: Errors from extractTags and liquidValidation endpoints should ALWAYS be categorized as liquidErrors
184
+ // These endpoints are: /extractTags and /ask-aira-service/creatives_ai/liquidValidation
185
+ // Only errors from these endpoints should appear in Liquid Issues tab
186
+ if (result && Array.isArray(result?.errors) && result.errors.length > 0) {
187
+ // Errors from extractTags or liquidValidation endpoints
188
+ liquidErrors = result.errors.map((error) => {
182
189
  const message = typeof error?.message === "string"
183
190
  ? error.message
184
191
  : somethingWrongMsg;
185
192
  return message;
186
193
  });
187
- } else {
194
+ } else if (isError) {
195
+ // If isError is true, it means the API call to extractTags/liquidValidation failed
196
+ // This is also a liquid endpoint error, so categorize as liquidErrors
188
197
  liquidErrors = [somethingWrongMsg];
189
198
  }
199
+
190
200
  onError({
191
201
  standardErrors,
192
202
  liquidErrors,
@@ -398,7 +408,20 @@ export const validateMobilePushContent = async (formData, options) => {
398
408
  // Helper function to extract content for a platform
399
409
  export const extractContent = (platformData) => {
400
410
  if (!platformData) return '';
401
- const { title, message, ctas } = platformData;
411
+ const { title, message, ctas, isBEEeditor, beeHtml } = platformData;
412
+
413
+ // For BEE editor, extract content from beeHtml
414
+ if (isBEEeditor && beeHtml) {
415
+ // beeHtml can be an object with value property or a string
416
+ const beeHtmlContent = typeof beeHtml === 'string' ? beeHtml : (beeHtml?.value || '');
417
+ return [
418
+ title,
419
+ beeHtmlContent,
420
+ ...((ctas?.map((cta) => cta?.text || cta?.actionLink)) || []),
421
+ ].filter(Boolean).join(' ');
422
+ }
423
+
424
+ // For regular content
402
425
  return [
403
426
  title,
404
427
  message,
@@ -187,7 +187,6 @@ export const validateTags = ({
187
187
  location,
188
188
  tagModule,
189
189
  eventContextTags,
190
- isFullMode,
191
190
  }) => {
192
191
  const tags = tagsParam;
193
192
  const injectedTags = transformInjectedTags(injectedTagsParams);
@@ -201,7 +200,7 @@ export const validateTags = ({
201
200
  unsupportedTags: [],
202
201
  isBraceError: false,
203
202
  };
204
- if (tags && tags.length && !isFullMode) {
203
+ if (tags && tags.length) {
205
204
  lodashForEach(tags, ({
206
205
  definition: {
207
206
  supportedModules,
@@ -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(platformData.title);
1394
+ expect(result).toContain(platformData.beeHtml);
1395
+ expect(result).toContain(platformData.ctas[0].text);
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(platformData.title);
1411
+ expect(result).toContain(platformData.beeHtml.value);
1412
+ expect(result).toContain(platformData.ctas[0].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
+