@capillarytech/creatives-library 8.0.257 → 8.0.258

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 (278) 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 +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +5 -10
  7. package/services/tests/api.test.js +0 -34
  8. package/translations/en.json +4 -3
  9. package/utils/common.js +6 -5
  10. package/utils/commonUtils.js +5 -28
  11. package/utils/imageUrlUpload.js +141 -0
  12. package/utils/tests/commonUtil.test.js +0 -224
  13. package/utils/tests/transformerUtils.test.js +297 -0
  14. package/utils/transformTemplateConfig.js +10 -0
  15. package/utils/transformerUtils.js +40 -0
  16. package/v2Components/CapDeviceContent/index.js +56 -61
  17. package/v2Components/CapImageUpload/constants.js +2 -0
  18. package/v2Components/CapImageUpload/index.js +65 -16
  19. package/v2Components/CapImageUpload/index.scss +4 -1
  20. package/v2Components/CapImageUpload/messages.js +5 -1
  21. package/v2Components/CapImageUrlUpload/constants.js +26 -0
  22. package/v2Components/CapImageUrlUpload/index.js +365 -0
  23. package/v2Components/CapImageUrlUpload/index.scss +35 -0
  24. package/v2Components/CapImageUrlUpload/messages.js +47 -0
  25. package/v2Components/CapTagList/index.js +1 -6
  26. package/v2Components/CapTagListWithInput/index.js +1 -5
  27. package/v2Components/CapTagListWithInput/messages.js +1 -1
  28. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  29. package/v2Components/ErrorInfoNote/index.js +72 -457
  30. package/v2Components/ErrorInfoNote/messages.js +6 -36
  31. package/v2Components/ErrorInfoNote/style.scss +6 -282
  32. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  33. package/v2Components/HtmlEditor/HTMLEditor.js +94 -547
  34. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1441
  35. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  36. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  37. package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
  38. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
  39. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
  40. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  41. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  42. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +0 -9
  43. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +4 -4
  44. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  47. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  48. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  49. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  50. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +6 -3
  51. package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
  52. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  53. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  54. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -1
  55. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -49
  56. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -50
  57. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +41 -70
  58. package/v2Components/HtmlEditor/constants.js +20 -42
  59. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  60. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +0 -103
  61. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  62. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  63. package/v2Components/HtmlEditor/hooks/useValidation.js +53 -189
  64. package/v2Components/HtmlEditor/index.js +1 -1
  65. package/v2Components/HtmlEditor/messages.js +94 -92
  66. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -94
  67. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  68. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  69. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  70. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +102 -134
  71. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  72. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  73. package/v2Components/MobilePushPreviewV2/index.js +7 -32
  74. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  75. package/v2Components/TemplatePreview/index.js +32 -47
  76. package/v2Components/TemplatePreview/messages.js +0 -4
  77. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  78. package/v2Containers/App/constants.js +5 -0
  79. package/v2Containers/BeeEditor/index.js +90 -172
  80. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +4 -3
  81. package/v2Containers/CreativesContainer/SlideBoxContent.js +107 -129
  82. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  83. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  84. package/v2Containers/CreativesContainer/constants.js +3 -1
  85. package/v2Containers/CreativesContainer/index.js +214 -239
  86. package/v2Containers/CreativesContainer/messages.js +4 -8
  87. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
  88. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  89. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
  90. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -106
  91. package/v2Containers/Email/actions.js +0 -7
  92. package/v2Containers/Email/constants.js +1 -5
  93. package/v2Containers/Email/index.js +29 -234
  94. package/v2Containers/Email/messages.js +0 -32
  95. package/v2Containers/Email/reducer.js +1 -12
  96. package/v2Containers/Email/sagas.js +7 -61
  97. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  98. package/v2Containers/Email/tests/reducer.test.js +0 -46
  99. package/v2Containers/Email/tests/sagas.test.js +29 -320
  100. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
  101. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  102. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  103. package/v2Containers/EmailWrapper/constants.js +0 -2
  104. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  105. package/v2Containers/EmailWrapper/index.js +23 -103
  106. package/v2Containers/EmailWrapper/messages.js +1 -65
  107. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  108. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
  109. package/v2Containers/InApp/actions.js +0 -7
  110. package/v2Containers/InApp/constants.js +4 -20
  111. package/v2Containers/InApp/index.js +359 -802
  112. package/v2Containers/InApp/index.scss +3 -4
  113. package/v2Containers/InApp/messages.js +3 -7
  114. package/v2Containers/InApp/reducer.js +3 -21
  115. package/v2Containers/InApp/sagas.js +9 -29
  116. package/v2Containers/InApp/selectors.js +5 -25
  117. package/v2Containers/InApp/tests/index.test.js +50 -154
  118. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  119. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  120. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +36 -15
  121. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  122. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +100 -77
  123. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +72 -63
  124. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +250 -190
  125. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +16 -12
  126. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +48 -40
  127. package/v2Containers/TagList/index.js +19 -62
  128. package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
  129. package/v2Containers/Templates/_templates.scss +202 -56
  130. package/v2Containers/Templates/actions.js +2 -1
  131. package/v2Containers/Templates/constants.js +1 -0
  132. package/v2Containers/Templates/index.js +278 -123
  133. package/v2Containers/Templates/messages.js +24 -4
  134. package/v2Containers/Templates/reducer.js +2 -0
  135. package/v2Containers/Templates/tests/index.test.js +10 -0
  136. package/v2Containers/TemplatesV2/index.js +15 -7
  137. package/v2Containers/TemplatesV2/messages.js +4 -0
  138. package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
  139. package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
  140. package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
  141. package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
  142. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
  143. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
  144. package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
  145. package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
  146. package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
  147. package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
  148. package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
  149. package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
  150. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
  151. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
  152. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
  153. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
  154. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
  155. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
  156. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
  157. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
  158. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
  159. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
  160. package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
  161. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
  162. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
  163. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
  164. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
  165. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
  166. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
  167. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
  168. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
  169. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
  170. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
  171. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
  172. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
  173. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
  174. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
  175. package/v2Containers/WebPush/Create/index.js +1148 -0
  176. package/v2Containers/WebPush/Create/index.scss +134 -0
  177. package/v2Containers/WebPush/Create/messages.js +203 -0
  178. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
  179. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
  180. package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
  181. package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
  182. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +23 -0
  183. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +155 -0
  184. package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
  185. package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
  186. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
  187. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
  188. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  189. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  190. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +106 -0
  191. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
  192. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
  193. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
  194. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
  195. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
  196. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
  197. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
  198. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +47 -0
  199. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +141 -0
  200. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
  201. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
  202. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
  203. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
  204. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
  205. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
  206. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +81 -0
  207. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
  208. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
  209. package/v2Containers/WebPush/Create/preview/constants.js +637 -0
  210. package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
  211. package/v2Containers/WebPush/Create/preview/preview.scss +351 -0
  212. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
  213. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
  214. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
  215. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
  216. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
  217. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
  218. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
  219. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
  220. package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
  221. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
  222. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
  223. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
  224. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
  225. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +909 -0
  226. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
  227. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
  228. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +1327 -0
  229. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
  230. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
  231. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
  232. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
  233. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +96 -0
  234. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +396 -0
  235. package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
  236. package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
  237. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
  238. package/v2Containers/WebPush/Create/utils/validation.js +75 -0
  239. package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
  240. package/v2Containers/WebPush/actions.js +60 -0
  241. package/v2Containers/WebPush/constants.js +132 -0
  242. package/v2Containers/WebPush/index.js +2 -0
  243. package/v2Containers/WebPush/reducer.js +104 -0
  244. package/v2Containers/WebPush/sagas.js +119 -0
  245. package/v2Containers/WebPush/selectors.js +65 -0
  246. package/v2Containers/WebPush/tests/reducer.test.js +863 -0
  247. package/v2Containers/WebPush/tests/sagas.test.js +566 -0
  248. package/v2Containers/WebPush/tests/selectors.test.js +960 -0
  249. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +1272 -768
  250. package/v2Components/ErrorInfoNote/constants.js +0 -1
  251. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -874
  252. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  253. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -255
  254. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -364
  255. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  256. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -40
  257. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  258. package/v2Containers/BeePopupEditor/constants.js +0 -10
  259. package/v2Containers/BeePopupEditor/index.js +0 -194
  260. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  261. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1285
  262. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -1880
  263. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  264. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -643
  265. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  266. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  267. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  268. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  269. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  270. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  271. package/v2Containers/InAppWrapper/constants.js +0 -16
  272. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  273. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  274. package/v2Containers/InAppWrapper/index.js +0 -148
  275. package/v2Containers/InAppWrapper/messages.js +0 -49
  276. package/v2Containers/InappAdvance/index.js +0 -1099
  277. package/v2Containers/InappAdvance/index.scss +0 -10
  278. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
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';
49
48
  export const CUSTOM_TAG = 'CustomTagMessage';
50
49
  export const CUSTOMER_EXTENDED_FIELD = 'Customer extended fields';
51
50
  export const EXTENDED_TAG = 'ExtendedTagMessage';
52
51
  export const BADGES_UI_ENABLED = 'BADGES_UI_ENABLED';
53
52
  export const JP_LOCALE_HIDE_FEATURE = 'JP_LOCALE_HIDE_FEATURE';
54
53
  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,7 +15,6 @@ 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';
19
18
 
20
19
  export const initialReducer = {
21
20
  language: languageProviderReducer,
@@ -34,5 +33,4 @@ export const initialReducer = {
34
33
  gallery: galleryReducer,
35
34
  navigationConfig: CapCollapsibleLeftNavigationReducer,
36
35
  previewAndTest: previewAndTestReducer,
37
- inApp: inAppReducer,
38
36
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.257",
4
+ "version": "8.0.258",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
package/services/api.js CHANGED
@@ -287,6 +287,11 @@ 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
+
290
295
  export const duplicateTemplate = ({id, channel}) => {
291
296
  const url = `${API_ENDPOINT}/templates/duplicate/${id}/${channel}`;
292
297
  return request(url, getAPICallObject('GET'));
@@ -465,11 +470,6 @@ export const getCmsTemplateSettingsV2 = (cmsType, projectId, cmsMode, langId, is
465
470
  return API.get(url);
466
471
  };
467
472
 
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,9 +725,4 @@ 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
-
733
728
  export {request, getAPICallObject};
@@ -26,8 +26,6 @@ import {
26
26
  updateMetaConfig,
27
27
  getMediaDetails,
28
28
  getAssetStatus,
29
- getBeePopupBuilderToken,
30
- getCmsAccounts,
31
29
  } from '../api';
32
30
  import { mockData } from './mockData';
33
31
  import getSchema from '../getSchema';
@@ -975,35 +973,3 @@ describe('getAssetStatus', () => {
975
973
  expect(callArgs[0]).toContain('/assets/video/asset-456/status');
976
974
  });
977
975
  });
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
- });
@@ -165,7 +165,7 @@
165
165
  "creatives.componentsV2.CapDocumentUpload.imageDimenstionDescription": "Dimensions upto: {width}px x {height}px",
166
166
  "creatives.componentsV2.CapDocumentUpload.or": "OR",
167
167
  "creatives.componentsV2.CapDocumentUpload.uploadComputer": "Select from computer",
168
- "creatives.componentsV2.CapDocumentUpload.whatsappDocSize": "Size upto: {size}",
168
+ "creatives.componentsV2.CapDocumentUpload.whatsappDocSize": "Size up to: {size}",
169
169
  "creatives.componentsV2.CapImageUpload.aspectRatio": "Aspect ratio: 1:1",
170
170
  "creatives.componentsV2.CapImageUpload.dragAndDrop": "Drag and drop image here",
171
171
  "creatives.componentsV2.CapImageUpload.format": "Format: JPEG, JPG, PNG",
@@ -173,13 +173,13 @@
173
173
  "creatives.componentsV2.CapImageUpload.imageErrorDesc": "Please upload the image with allowed file extension, size, dimension and aspect ratio",
174
174
  "creatives.componentsV2.CapImageUpload.imageGallery": "Gallery",
175
175
  "creatives.componentsV2.CapImageUpload.imageReUpload": "Reupload",
176
- "creatives.componentsV2.CapImageUpload.imageSize": "Size upto: 2MB",
176
+ "creatives.componentsV2.CapImageUpload.imageSize": "Size up to: 2MB",
177
177
  "creatives.componentsV2.CapImageUpload.or": "OR",
178
178
  "creatives.componentsV2.CapImageUpload.uploadComputer": "Select from computer",
179
179
  "creatives.componentsV2.CapImageUpload.uploadGallery": "Gallery",
180
180
  "creatives.componentsV2.CapImageUpload.uploadImageDescription": "The relevant image that complements the message context.",
181
181
  "creatives.componentsV2.CapImageUpload.whatsappAspectRatio": "Max aspect ratio: 1.91:1",
182
- "creatives.componentsV2.CapImageUpload.whatsappImageSize": "Size upto: 5MB",
182
+ "creatives.componentsV2.CapImageUpload.whatsappImageSize": "Size up to: 5MB",
183
183
  "creatives.componentsV2.CapTagList.Cancel": "Cancel",
184
184
  "creatives.componentsV2.CapTagList.Ok": "Ok",
185
185
  "creatives.componentsV2.CapTagList.all": "All",
@@ -2022,6 +2022,7 @@
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",
2025
2026
  "creatives.containersV2.addLabels": "Add labels",
2026
2027
  "creatives.containersV2.appName": "App Name",
2027
2028
  "creatives.containersV2.applyNow": "Apply now",
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,
24
25
  LIQUID_SUPPORT,
25
- SUPPORT_CK_EDITOR,
26
26
  ENABLE_NEW_MPUSH
27
27
  } from '../constants/unified';
28
28
  import { apiMessageFormatHandler } from './commonUtils';
@@ -96,10 +96,6 @@ 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
- );
103
99
 
104
100
  export const hasGiftVoucherFeature = Auth.hasFeatureAccess.bind(
105
101
  null,
@@ -121,6 +117,11 @@ export const hasWechatFeatureEnabled = Auth.hasFeatureAccess.bind(
121
117
  ENABLE_WECHAT,
122
118
  );
123
119
 
120
+ export const hasWebPushFeatureEnabled = Auth.hasFeatureAccess.bind(
121
+ null,
122
+ ENABLE_WEBPUSH,
123
+ );
124
+
124
125
  export const hasCustomerBarcodeFeatureEnabled = Auth.hasFeatureAccess.bind(
125
126
  null,
126
127
  ENABLE_CUSTOMER_BARCODE_TAG,
@@ -173,30 +173,20 @@ 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
179
176
  if (!validString) {
180
177
  standardErrors = [emptyBodyError];
181
178
  }
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) => {
179
+ let liquidErrors;
180
+ if (result && Array.isArray(result?.errors)) {
181
+ liquidErrors = result?.errors?.map((error) => {
189
182
  const message = typeof error?.message === "string"
190
183
  ? error.message
191
184
  : somethingWrongMsg;
192
185
  return message;
193
186
  });
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
187
+ } else {
197
188
  liquidErrors = [somethingWrongMsg];
198
189
  }
199
-
200
190
  onError({
201
191
  standardErrors,
202
192
  liquidErrors,
@@ -408,20 +398,7 @@ export const validateMobilePushContent = async (formData, options) => {
408
398
  // Helper function to extract content for a platform
409
399
  export const extractContent = (platformData) => {
410
400
  if (!platformData) return '';
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
401
+ const { title, message, ctas } = platformData;
425
402
  return [
426
403
  title,
427
404
  message,
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Utility functions for uploading images from URLs
3
+ *
4
+ * NOTE: CORS-limited; will be replaced with backend implementation.
5
+ * Flow currently hidden (not removed) from frontend.
6
+ */
7
+
8
+ import {
9
+ DEFAULT_ALLOWED_CONTENT_TYPES,
10
+ MIME_TYPE_TO_EXTENSION,
11
+ DEFAULT_IMAGE_EXTENSION,
12
+ } from '../v2Components/CapImageUrlUpload/constants';
13
+
14
+ /**
15
+ * Fetches an image from a URL
16
+ *
17
+ * @param {string} url - The image URL to fetch
18
+ * @returns {Promise<Response>} - The fetch response object
19
+ * @throws {Error} - If the fetch fails (network/CORS error)
20
+ */
21
+ export const fetchImageFromUrl = async (url) => {
22
+ const trimmedUrl = url?.trim() || '';
23
+
24
+ if (!trimmedUrl) {
25
+ throw new Error('URL is required');
26
+ }
27
+
28
+ // CORS-limited: fails for images without proper CORS headers
29
+ const response = await fetch(trimmedUrl, {
30
+ method: 'GET',
31
+ redirect: 'follow',
32
+ mode: 'cors',
33
+ });
34
+
35
+ if (!response.ok) {
36
+ throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`);
37
+ }
38
+
39
+ return response;
40
+ };
41
+
42
+ /**
43
+ * Helper function to upload image from URL
44
+ * Fetches image, validates content type and size, converts to File, and uploads via uploadAsset
45
+ *
46
+ * @param {string} url - The image URL to upload
47
+ * @param {Function} formatMessage - React Intl formatMessage function
48
+ * @param {Object} messages - React Intl messages object
49
+ * @param {Function} uploadAssetFn - Function to upload the asset (file, type, fileParams)
50
+ * @param {string} fileNamePrefix - Prefix for the generated file name
51
+ * @param {number} maxSize - Maximum file size in bytes
52
+ * @param {string[]} allowedContentTypes - Array of allowed MIME types (defaults to DEFAULT_ALLOWED_CONTENT_TYPES)
53
+ * @returns {Promise<{success: boolean, error: string}>} - Result object with success status and error message
54
+ *
55
+ * @example
56
+ * const result = await uploadImageFromUrlHelper(
57
+ * 'https://example.com/image.jpg',
58
+ * formatMessage,
59
+ * messages,
60
+ * uploadAsset,
61
+ * 'my-image',
62
+ * 5000000,
63
+ * ['image/jpeg', 'image/png']
64
+ * );
65
+ */
66
+ export const uploadImageFromUrlHelper = async (
67
+ url,
68
+ formatMessage,
69
+ messages,
70
+ uploadAssetFn,
71
+ fileNamePrefix,
72
+ maxSize,
73
+ allowedContentTypes = DEFAULT_ALLOWED_CONTENT_TYPES,
74
+ ) => {
75
+ const trimmedUrl = url?.trim() || '';
76
+
77
+ try {
78
+ const response = await fetchImageFromUrl(trimmedUrl);
79
+
80
+ // Validate Content-Type
81
+ const contentType = response.headers?.get('Content-Type') || '';
82
+ const normalizedContentType = contentType.split(';')[0].toLowerCase().trim();
83
+
84
+ if (!allowedContentTypes.includes(normalizedContentType)) {
85
+ return {
86
+ success: false,
87
+ error: formatMessage(messages.imageTypeInvalid),
88
+ };
89
+ }
90
+
91
+ const blob = await response.blob();
92
+
93
+ if (blob.size > maxSize) {
94
+ return {
95
+ success: false,
96
+ error: formatMessage(messages.imageSizeInvalid),
97
+ };
98
+ }
99
+
100
+ // Load image to get dimensions and verify validity
101
+ return new Promise((resolve) => {
102
+ const img = new Image();
103
+ const objectUrl = URL.createObjectURL(blob);
104
+
105
+ img.onload = () => {
106
+ const extension = MIME_TYPE_TO_EXTENSION[normalizedContentType] || DEFAULT_IMAGE_EXTENSION;
107
+ const fileName = `${fileNamePrefix}.${extension}`;
108
+ const file = new File([blob], fileName, { type: blob.type });
109
+ const fileParams = {
110
+ width: img.width,
111
+ height: img.height,
112
+ error: false,
113
+ };
114
+
115
+ uploadAssetFn(file, 'image', fileParams);
116
+ URL.revokeObjectURL(objectUrl);
117
+
118
+ resolve({
119
+ success: true,
120
+ error: '',
121
+ });
122
+ };
123
+
124
+ img.onerror = () => {
125
+ URL.revokeObjectURL(objectUrl);
126
+ resolve({
127
+ success: false,
128
+ error: formatMessage(messages.imageLoadError),
129
+ });
130
+ };
131
+
132
+ img.src = objectUrl;
133
+ });
134
+ } catch (error) {
135
+ return {
136
+ success: false,
137
+ error: formatMessage(messages.imageLoadError),
138
+ };
139
+ }
140
+ };
141
+
@@ -1376,228 +1376,4 @@ 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
- });
1602
1379
  });
1603
-