@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
@@ -10,6 +10,7 @@ import SmsWrapper from '../SmsWrapper';
10
10
  import Email from '../Email';
11
11
  import EmailWrapper from '../EmailWrapper';
12
12
  import MobilepushWrapper from '../MobilepushWrapper';
13
+ import InAppWrapper from '../InAppWrapper';
13
14
  import EmailPreviewV2 from '../../v2Components/EmailPreviewV2';
14
15
  import MobilePushPreview from '../../v2Components/MobilePushPreviewV2';
15
16
  import WechatWrapper from '../WeChat/Wrapper';
@@ -28,10 +29,6 @@ import { getWhatsappContent } from '../Whatsapp/utils';
28
29
  import * as commonUtil from '../../utils/common';
29
30
  import Zalo from '../Zalo';
30
31
  import MobilePushNew from '../MobilePushNew';
31
- import WebPush from '../WebPush';
32
- import DevicePreviewContent from '../WebPush/Create/preview/DevicePreviewContent';
33
- import { LAYOUT_MODE } from '../WebPush/Create/preview/constants';
34
- import { WEBPUSH_CONTENT_FIELDS, WEBPUSH_TEMPLATE_PATHS } from '../WebPush/constants';
35
32
  const CreativesWrapper = styled.div`
36
33
  .ant-popover,
37
34
  .ant-notification,
@@ -119,7 +116,11 @@ export function SlideBoxContent(props) {
119
116
  emailCreateMode,
120
117
  onMobilepushModeChange,
121
118
  mobilePushCreateMode,
119
+ onInAppEditorTypeChange,
120
+ inAppEditorType,
122
121
  templateStep,
122
+ inAppCreateMode,
123
+ onInAppModeChange,
123
124
  onEnterTemplateName,
124
125
  onRemoveTemplateName,
125
126
  onCreateNextStep,
@@ -133,7 +134,6 @@ export function SlideBoxContent(props) {
133
134
  onValidationFail,
134
135
  channelsToHide,
135
136
  forwardedTags,
136
- supportedTags = [],
137
137
  selectedOfferDetails,
138
138
  channelsToDisable,
139
139
  weChatTemplateType,
@@ -169,6 +169,7 @@ export function SlideBoxContent(props) {
169
169
  handleTestAndPreview,
170
170
  handleCloseTestAndPreview,
171
171
  isTestAndPreviewMode,
172
+ onHtmlEditorValidationStateChange,
172
173
  } = props;
173
174
  const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
174
175
  const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
@@ -205,7 +206,6 @@ export function SlideBoxContent(props) {
205
206
  const isCreateRcs = isCreate && channel === constants.RCS;
206
207
  const isCreateMPush = isCreate && channel === constants.MOBILE_PUSH;
207
208
  const isCreateCallTask = isCreate && channel === constants.CALL_TASK;
208
- const isCreateWebPush = isCreate && channel === constants.WEBPUSH;
209
209
  let isEditSms = false;
210
210
  let isEditEmailWithId = false;
211
211
  let isEmailEditWithContent = false;
@@ -213,14 +213,12 @@ export function SlideBoxContent(props) {
213
213
  let isEmailPreview = false;
214
214
  let isMpushPreview = false;
215
215
  let isInappPreview = false;
216
- let isWebPushPreview = false;
217
216
  let isEditCallTask = false;
218
217
  let isEditMPush = false;
219
218
  let isEditFacebook = false;
220
219
  let isEditFTP = false;
221
220
  let isEditWhatsapp = false;
222
221
  let isEditInApp = false;
223
- let isEditWebPush = false;
224
222
  let isEditRcs = false;
225
223
  let isEditZalo = false;
226
224
  const isEmailCreate = isCreate && channel === constants.EMAIL;
@@ -234,12 +232,10 @@ export function SlideBoxContent(props) {
234
232
  isEditFacebook = isEdit && channel === constants.FACEBOOK;
235
233
  isEditWhatsapp = isEdit && channel === constants.WHATSAPP;
236
234
  isEditRcs = isEdit && channel === constants.RCS;
237
- isEditWebPush = isEdit && channel === constants.WEBPUSH;
238
235
  isPreview = slidBoxContent === 'preview' && [constants.SMS, constants.LINE, constants.WHATSAPP, constants.FACEBOOK, constants.VIBER, constants.RCS].includes(channel);
239
236
  isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
240
237
  isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
241
238
  isInappPreview = slidBoxContent === 'preview' && channel === constants.INAPP;
242
- isWebPushPreview = slidBoxContent === 'preview' && channel === constants.WEBPUSH;
243
239
  isEditFTP = isEdit && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
244
240
  isEditZalo = isEdit && channel?.toUpperCase() === constants.ZALO;
245
241
  isEditInApp = isEdit && channel === constants.INAPP;
@@ -487,30 +483,8 @@ export function SlideBoxContent(props) {
487
483
  templateData={templateData}
488
484
  channel={channel}
489
485
  forwardedTags={forwardedTags}
490
- />
486
+ />
491
487
  )}
492
- {isWebPushPreview && (() => {
493
- const webpushContent = get(templateData, WEBPUSH_TEMPLATE_PATHS.CONTENT, {});
494
- const notificationTitle = webpushContent?.[WEBPUSH_CONTENT_FIELDS.TITLE] || '';
495
- const notificationBody = webpushContent?.[WEBPUSH_CONTENT_FIELDS.MESSAGE] || '';
496
- const imageSrc = webpushContent?.[WEBPUSH_CONTENT_FIELDS.IMAGE] || '';
497
- const brandIconSrc = webpushContent?.[WEBPUSH_CONTENT_FIELDS.BRAND_ICON] || '';
498
- // Extract URL from onClickAction or use empty string
499
- const url = webpushContent?.[WEBPUSH_CONTENT_FIELDS.ON_CLICK_ACTION]?.url || '';
500
-
501
- return (
502
- <div className="webpush-preview-container">
503
- <DevicePreviewContent
504
- notificationTitle={notificationTitle}
505
- notificationBody={notificationBody}
506
- url={url}
507
- imageSrc={imageSrc}
508
- brandIconSrc={brandIconSrc}
509
- layoutMode={LAYOUT_MODE.COMPACT}
510
- />
511
- </div>
512
- );
513
- })()}
514
488
 
515
489
  {
516
490
  (currentChannel === constants.WECHAT && !!slidBoxContent) && <WechatWrapper
@@ -668,44 +642,95 @@ export function SlideBoxContent(props) {
668
642
  handleTestAndPreview={handleTestAndPreview}
669
643
  handleCloseTestAndPreview={handleCloseTestAndPreview}
670
644
  isTestAndPreviewMode={isTestAndPreviewMode}
645
+ location={location}
646
+ onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
671
647
  />
672
648
  )}
673
649
  {(isEditEmailWithId || isEmailEditWithContent) && (
674
- <Email
675
- key="cretives-container-email-edit"
676
- setIsLoadingContent={setIsLoadingContent}
677
- location={{
678
- pathname: `/email/edit`,
679
- query: { type: 'embedded', module: 'library'},
680
- }}
681
- route={{ name: 'email' }}
682
- isGetFormData={isGetFormData}
683
- getFormdata={getFormData}
684
- params={{ id: templateData._id }}
685
- templateData={templateData}
686
- getFormSubscriptionData={getFormData}
687
- getDefaultTags={type}
688
- isFullMode={isFullMode}
689
- editor={editor}
690
- cap={cap}
691
- showTemplateName={showTemplateName}
692
- onValidationFail={onValidationFail}
693
- forwardedTags={forwardedTags}
694
- selectedOfferDetails={selectedOfferDetails}
695
- onPreviewContentClicked={onPreviewContentClicked}
696
- onTestContentClicked={onTestContentClicked}
697
- moduleType={moduleType}
698
- showLiquidErrorInFooter={showLiquidErrorInFooter}
699
- eventContextTags={eventContextTags}
700
- isLoyaltyModule={isLoyaltyModule}
701
- showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
702
- handleTestAndPreview={handleTestAndPreview}
703
- handleCloseTestAndPreview={handleCloseTestAndPreview}
704
- isTestAndPreviewMode={(() => {
705
- return isTestAndPreviewMode;
706
- })()}
707
- />
708
- )}
650
+ (() => {
651
+ const supportCKEditor = commonUtil.hasSupportCKEditor();
652
+ // When supportCKEditor is true: Always use Email component (legacy flow)
653
+ if (supportCKEditor || templateData?.is_drag_drop) {
654
+ return (
655
+ <Email
656
+ key="cretives-container-email-edit"
657
+ setIsLoadingContent={setIsLoadingContent}
658
+ location={{
659
+ pathname: `/email/edit`,
660
+ query: { type: 'embedded', module: 'library'},
661
+ }}
662
+ route={{ name: 'email' }}
663
+ isGetFormData={isGetFormData}
664
+ getFormdata={getFormData}
665
+ params={{ id: templateData._id }}
666
+ templateData={templateData}
667
+ getFormSubscriptionData={getFormData}
668
+ getDefaultTags={type}
669
+ isFullMode={isFullMode}
670
+ editor={editor}
671
+ cap={cap}
672
+ showTemplateName={showTemplateName}
673
+ onValidationFail={onValidationFail}
674
+ forwardedTags={forwardedTags}
675
+ selectedOfferDetails={selectedOfferDetails}
676
+ onPreviewContentClicked={onPreviewContentClicked}
677
+ onTestContentClicked={onTestContentClicked}
678
+ moduleType={moduleType}
679
+ showLiquidErrorInFooter={showLiquidErrorInFooter}
680
+ eventContextTags={eventContextTags}
681
+ isLoyaltyModule={isLoyaltyModule}
682
+ showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
683
+ handleTestAndPreview={handleTestAndPreview}
684
+ handleCloseTestAndPreview={handleCloseTestAndPreview}
685
+ isTestAndPreviewMode={isTestAndPreviewMode}
686
+ onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
687
+ />
688
+ );
689
+ }
690
+ // HTML template: Use EmailWrapper component (which uses EmailWithoutSaga)
691
+ return (
692
+ <EmailWrapper
693
+ key="cretives-container-email-edit-wrapper"
694
+ setIsLoadingContent={setIsLoadingContent}
695
+ onEmailModeChange={onEmailModeChange}
696
+ emailCreateMode="editor"
697
+ isGetFormData={isGetFormData}
698
+ getFormdata={getFormData}
699
+ templateData={templateData}
700
+ type={type}
701
+ step="createTemplateContent"
702
+ showNextStep={onCreateNextStep}
703
+ isFullMode={isFullMode}
704
+ editor={editor}
705
+ cap={cap}
706
+ onResetStep={onResetStep}
707
+ showTemplateName={showTemplateName}
708
+ onEnterTemplateName={onEnterTemplateName}
709
+ onRemoveTemplateName={onRemoveTemplateName}
710
+ onValidationFail={onValidationFail}
711
+ forwardedTags={forwardedTags}
712
+ selectedOfferDetails={selectedOfferDetails}
713
+ onPreviewContentClicked={onPreviewContentClicked}
714
+ onTestContentClicked={onTestContentClicked}
715
+ getCmsTemplatesInProgress={getCmsTemplatesInProgress}
716
+ moduleType={moduleType}
717
+ showLiquidErrorInFooter={showLiquidErrorInFooter}
718
+ eventContextTags={eventContextTags}
719
+ isLoyaltyModule={isLoyaltyModule}
720
+ showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
721
+ handleTestAndPreview={handleTestAndPreview}
722
+ handleCloseTestAndPreview={handleCloseTestAndPreview}
723
+ isTestAndPreviewMode={isTestAndPreviewMode}
724
+ onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
725
+ location={{
726
+ pathname: `/email/edit/${templateData._id}`,
727
+ query: { type: 'embedded', module: 'library', id: templateData._id },
728
+ }}
729
+ params={{ id: templateData._id }}
730
+ />
731
+ );
732
+ })()
733
+ )}
709
734
  {isEditMPush && (
710
735
  (isFullMode && !commonUtil.hasNewMobilePushFeatureEnabled()) ||
711
736
  (!isFullMode && isLoyaltyModule) ||
@@ -999,22 +1024,39 @@ export function SlideBoxContent(props) {
999
1024
  />
1000
1025
  )}
1001
1026
 
1002
- {isCreateInApp && (<InApp
1003
- isFullMode={isFullMode}
1004
- onCreateComplete={onCreateComplete}
1005
- handleClose={handleClose}
1006
- location={{
1007
- pathname: `/inapp/create`,
1008
- query,
1009
- search: '',
1010
- }}
1011
- getFormData={getFormData}
1012
- isGetFormData={isGetFormData}
1013
- templateData={templateData}
1014
- getDefaultTags={type}
1015
- eventContextTags={eventContextTags}
1016
- showLiquidErrorInFooter={showLiquidErrorInFooter}
1017
- showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
1027
+ {isCreateInApp && (
1028
+ <InAppWrapper
1029
+ key="creatives-inapp-wrapper"
1030
+ date={new Date().getMilliseconds()}
1031
+ setIsLoadingContent={setIsLoadingContent}
1032
+ onInAppEditorTypeChange={onInAppEditorTypeChange}
1033
+ inAppEditorType={inAppEditorType}
1034
+ isGetFormData={isGetFormData}
1035
+ getFormdata={getFormData}
1036
+ templateData={templateData}
1037
+ type={type}
1038
+ step={templateStep}
1039
+ showNextStep={onCreateNextStep}
1040
+ isFullMode={isFullMode}
1041
+ cap={cap}
1042
+ onResetStep={onResetStep}
1043
+ showTemplateName={showTemplateName}
1044
+ onEnterTemplateName={onEnterTemplateName}
1045
+ onRemoveTemplateName={onRemoveTemplateName}
1046
+ onValidationFail={onValidationFail}
1047
+ forwardedTags={forwardedTags}
1048
+ selectedOfferDetails={selectedOfferDetails}
1049
+ onPreviewContentClicked={onPreviewContentClicked}
1050
+ onTestContentClicked={onTestContentClicked}
1051
+ moduleType={moduleType}
1052
+ showLiquidErrorInFooter={showLiquidErrorInFooter}
1053
+ eventContextTags={eventContextTags}
1054
+ onCreateComplete={onCreateComplete}
1055
+ handleClose={handleClose}
1056
+ getDefaultTags={type}
1057
+ onInAppModeChange={onInAppModeChange}
1058
+ inAppCreateMode={inAppCreateMode}
1059
+ showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
1018
1060
  handleTestAndPreview={handleTestAndPreview}
1019
1061
  handleCloseTestAndPreview={handleCloseTestAndPreview}
1020
1062
  isTestAndPreviewMode={isTestAndPreviewMode}
@@ -1046,28 +1088,6 @@ export function SlideBoxContent(props) {
1046
1088
  />
1047
1089
  )}
1048
1090
 
1049
- {(isCreateWebPush || isEditWebPush) && (
1050
- <WebPush
1051
- isFullMode={isFullMode}
1052
- handleClose={handleClose}
1053
- onCreateComplete={onCreateComplete}
1054
- getFormData={getFormData}
1055
- isGetFormData={isGetFormData}
1056
- templateData={isEditWebPush ? templateData : undefined}
1057
- creativesMode={creativesMode}
1058
- params={isEditWebPush && templateData ? { id: templateData._id } : undefined}
1059
- location={{
1060
- pathname: isEditWebPush ? '/webpush/edit' : '/webpush/create',
1061
- query,
1062
- search: '',
1063
- }}
1064
- getDefaultTags={type}
1065
- forwardedTags={forwardedTags}
1066
- supportedTags={supportedTags}
1067
- selectedOfferDetails={selectedOfferDetails}
1068
- eventContextTags={eventContextTags}
1069
- />
1070
- )}
1071
1091
  {isCreateRcs && (<Rcs
1072
1092
  {...rcsCommonProps}
1073
1093
  showLiquidErrorInFooter={showLiquidErrorInFooter}
@@ -1105,6 +1125,8 @@ SlideBoxContent.propTypes = {
1105
1125
  onSelectTemplate: PropTypes.func,
1106
1126
  onPreviewTemplate: PropTypes.func,
1107
1127
  templateData: PropTypes.object,
1128
+ onInAppEditorTypeChange: PropTypes.func,
1129
+ inAppEditorType: PropTypes.object,
1108
1130
  location: PropTypes.object,
1109
1131
  isGetFormData: PropTypes.bool,
1110
1132
  getFormData: PropTypes.func,
@@ -1130,7 +1152,6 @@ SlideBoxContent.propTypes = {
1130
1152
  onValidationFail: PropTypes.func,
1131
1153
  channelsToHide: PropTypes.array,
1132
1154
  forwardedTags: PropTypes.object,
1133
- supportedTags: PropTypes.array,
1134
1155
  selectedOfferDetails: PropTypes.array,
1135
1156
  channelsToDisable: PropTypes.array,
1136
1157
  weChatTemplateType: PropTypes.string,
@@ -1146,7 +1167,7 @@ SlideBoxContent.propTypes = {
1146
1167
  onFTPSubmit: PropTypes.func,
1147
1168
  messageStrategy: PropTypes.string,
1148
1169
  fbAdManager: PropTypes.string,
1149
- showDisabledFBInfo: PropTypes.bool,
1170
+ showDisabledFBInfo: PropTypes.boolean,
1150
1171
  orgUnitId: PropTypes.any,
1151
1172
  smsRegister: PropTypes.any,
1152
1173
  getCmsTemplatesInProgress: PropTypes.bool,
@@ -7,12 +7,15 @@ import PropTypes from 'prop-types';
7
7
  import messages from './messages';
8
8
  import ErrorInfoNote from '../../v2Components/ErrorInfoNote';
9
9
  import { PREVIEW } from './constants';
10
+ import { EMAIL_CREATE_MODES } from '../EmailWrapper/constants';
10
11
 
11
- function getFullModeSaveBtn(slidBoxContent) {
12
- return slidBoxContent === "editTemplate" ?
13
- <FormattedMessage {...messages.creativesTemplatesUpdate}/>
14
- :
15
- <FormattedMessage {...messages.creativesTemplatesSaveFullMode}/>;
12
+ function getFullModeSaveBtn(slidBoxContent, isCreatingTemplate) {
13
+ if (isCreatingTemplate) {
14
+ return <FormattedMessage {...messages.creativesTemplatesDone} />;
15
+ }
16
+ return slidBoxContent === "editTemplate"
17
+ ? <FormattedMessage {...messages.creativesTemplatesUpdate} />
18
+ : <FormattedMessage {...messages.creativesTemplatesSaveFullMode} />;
16
19
  }
17
20
  function SlideBoxFooter(props) {
18
21
  const {
@@ -24,18 +27,119 @@ function SlideBoxFooter(props) {
24
27
  fetchingCmsData,
25
28
  isTemplateNameEmpty,
26
29
  errorMessages,
27
- isLiquidValidationError,
30
+ // eslint-disable-next-line no-unused-vars
31
+ isLiquidValidationError, // Legacy prop, kept for PropTypes compatibility
28
32
  currentTab,
29
33
  onTestAndPreview,
30
34
  // isEmptyContent,
31
35
  showTestAndPreviewButton,
32
36
  shouldShowDoneFooter,
33
37
  shouldShowContinueFooter,
38
+ isContinueButtonDisabled,
39
+ continueButtonLabel,
40
+ htmlEditorValidationState,
41
+ isCreatingTemplate,
42
+ currentChannel,
43
+ emailCreateMode,
44
+ selectedEmailCreateMode,
34
45
  } = props;
35
46
 
47
+ // Calculate if buttons should be disabled
48
+ // Only apply validation state checks for EMAIL channel in HTML Editor mode (not BEE/DragDrop)
49
+ // For other channels, BEE editor, or when htmlEditorValidationState is not provided, don't disable based on validation
50
+ const isEmailChannel = currentChannel?.toUpperCase() === 'EMAIL';
51
+ const isEditMode = slidBoxContent === 'editTemplate';
52
+
53
+ // Use selectedEmailCreateMode for accurate mode detection in create mode (emailCreateMode is mapped for backwards compatibility)
54
+ // In edit mode: htmlEditorValidationState is initialized as {} but only updated by HTML Editor
55
+ // If it's still in initial state (validationComplete === false, issueCounts.total === 0), it's BEE editor
56
+ // Upload mode also uses HTML Editor, so include it in HTML Editor mode check
57
+ const isUploadMode = emailCreateMode === EMAIL_CREATE_MODES.UPLOAD;
58
+ const isHTMLEditorModeInCreate = selectedEmailCreateMode === EMAIL_CREATE_MODES.HTML_EDITOR || isUploadMode;
59
+ // In edit mode: Check if htmlEditorValidationState has been updated by HTML Editor
60
+ // HTML Editor will call updateHtmlEditorValidationState, setting validationComplete to true at some point
61
+ // If validationComplete is false and issueCounts.total === 0, it's likely still in initial state (BEE editor)
62
+ const isHtmlEditorValidationStateActive = htmlEditorValidationState && (
63
+ htmlEditorValidationState.validationComplete === true
64
+ || (htmlEditorValidationState.issueCounts && htmlEditorValidationState.issueCounts.total > 0)
65
+ || htmlEditorValidationState.hasErrors === true
66
+ );
67
+ const isHTMLEditorModeInEdit = isEditMode && isHtmlEditorValidationStateActive;
68
+ const isHTMLEditorMode = isHTMLEditorModeInCreate || isHTMLEditorModeInEdit;
69
+ console.log('***isHTMLEditorMode', isHTMLEditorMode, 'isHTMLEditorModeInCreate', isHTMLEditorModeInCreate, 'isHTMLEditorModeInEdit', isHTMLEditorModeInEdit, 'isHtmlEditorValidationStateActive', isHtmlEditorValidationStateActive);
70
+
71
+ // BEE editor detection: drag_drop mode OR (editor mode AND not HTML Editor)
72
+ // In edit mode: if htmlEditorValidationState is in initial state (not updated by HTML Editor), it's BEE editor
73
+ const isBEEEditor = selectedEmailCreateMode === EMAIL_CREATE_MODES.DRAG_DROP
74
+ || (emailCreateMode === EMAIL_CREATE_MODES.EDITOR && !isHTMLEditorMode)
75
+ || (isEditMode && !isHtmlEditorValidationStateActive);
76
+ // Only check validation for HTML Editor mode, not for BEE/DragDrop editor
77
+ const shouldCheckValidation = isEmailChannel && htmlEditorValidationState && isHTMLEditorMode && !isBEEEditor;
78
+ const isContentEmpty = shouldCheckValidation ? (htmlEditorValidationState?.isContentEmpty ?? true) : false;
79
+ // Check if validation has completed
80
+ const validationComplete = shouldCheckValidation ? (htmlEditorValidationState?.validationComplete ?? false) : true;
81
+ // Only Rule Group #1 (Input & Sanitization) blocks; hasErrors is set by HTMLEditor from hasBlockingErrors.
82
+ // hasErrors should always be set (defaults to false), so we only check for explicit true value.
83
+ // Warnings (label issues, HTML/CSS compatibility) do NOT block buttons.
84
+ const hasValidationErrors = shouldCheckValidation && htmlEditorValidationState?.hasErrors === true;
85
+ console.log('***hasValidationErrors', hasValidationErrors);
86
+ const errorsAcknowledged = shouldCheckValidation ? (htmlEditorValidationState?.errorsAcknowledged ?? false) : true;
87
+ console.log('***errorsAcknowledged', errorsAcknowledged);
88
+
89
+ // IMPORTANT: In both modes, if validation finds errors, buttons must stay disabled until user acknowledges by clicking redirection icon
90
+ let shouldDisableButtons = false;
91
+ if (shouldCheckValidation) {
92
+ if (isEditMode) {
93
+ // Edit mode: Disable if validation has completed AND found errors AND errors not acknowledged
94
+ shouldDisableButtons = validationComplete && hasValidationErrors && !errorsAcknowledged;
95
+ } else {
96
+ // Create mode:
97
+ // 1. Disable until validation completes
98
+ // 2. Disable if content is empty
99
+ // 3. Disable if validation finds errors AND errors not acknowledged (user must click redirection icon)
100
+ shouldDisableButtons = !validationComplete || isContentEmpty || (hasValidationErrors && !errorsAcknowledged);
101
+ }
102
+ }
103
+
104
+ // Show ErrorInfoNote for API validation errors (from validateLiquidTemplateContent)
105
+ // For HTML Editor: API validation errors are shown in ValidationErrorDisplay (inside CodeEditorPane), not here
106
+ const hasStandardErrors = errorMessages && errorMessages.STANDARD_ERROR_MSG && errorMessages.STANDARD_ERROR_MSG.length > 0;
107
+ const hasLiquidErrors = errorMessages && errorMessages.LIQUID_ERROR_MSG && errorMessages.LIQUID_ERROR_MSG.length > 0;
108
+
109
+ // Check if htmlEditorValidationState has actual validation errors
110
+ // If htmlEditorValidationState exists but has no errors (total === 0), and we have STANDARD/LIQUID errors,
111
+ // then those errors are from BEE editor (FormBuilder validation), not HTML Editor
112
+ const htmlEditorHasErrors = htmlEditorValidationState && htmlEditorValidationState.issueCounts && htmlEditorValidationState.issueCounts.total > 0;
113
+
114
+ // BEE editor errors: We have STANDARD/LIQUID errors AND either:
115
+ // 1. No htmlEditorValidationState exists, OR
116
+ // 2. htmlEditorValidationState exists but has no actual errors (meaning errors are from FormBuilder/BEE editor)
117
+ // IMPORTANT: Only check for BEE editor errors when NOT in HTML Editor mode (upload or html_editor)
118
+ // Upload mode uses HTML Editor, so BEE editor errors don't apply
119
+ // IMPORTANT: BEE editor doesn't have real-time content updates,
120
+ // so we should NOT disable buttons based on validation errors
121
+ // In edit mode: Check if htmlEditorValidationState is in initial state (not updated by HTML Editor)
122
+ // In edit mode with BEE editor, htmlEditorValidationState will remain in initial state
123
+ // In create mode, check selectedEmailCreateMode or emailCreateMode
124
+ const isBEEEditorModeInEdit = isEditMode && !isHtmlEditorValidationStateActive;
125
+ console.log('***isBEEEditorModeInEdit', isBEEEditorModeInEdit, 'isHtmlEditorValidationStateActive', isHtmlEditorValidationStateActive);
126
+ const isBEEEditorModeInCreate = !isHTMLEditorMode && !isEditMode;
127
+ console.log('***isBEEEditorModeInCreate', isBEEEditorModeInCreate);
128
+ const isBEEEditorMode = isBEEEditorModeInEdit || isBEEEditorModeInCreate;
129
+ console.log('***isBEEEditorMode', isBEEEditorMode);
130
+ const hasBEEEditorErrors = isEmailChannel && isBEEEditorMode && (hasStandardErrors || hasLiquidErrors) && (!htmlEditorValidationState || !htmlEditorHasErrors);
131
+ console.log('***hasBEEEditorErrors', hasBEEEditorErrors);
132
+
133
+ const shouldShowErrorInfoNote = hasBEEEditorErrors;
36
134
  return (
37
- <div className='template-footer-width'>
38
- {isLiquidValidationError && (<ErrorInfoNote errorMessages={errorMessages} currentTab={currentTab?.toUpperCase()} />)}
135
+ <div className="template-footer-width">
136
+ {shouldShowErrorInfoNote && (
137
+ <ErrorInfoNote
138
+ errorMessages={errorMessages}
139
+ currentTab={currentTab?.toUpperCase()}
140
+ useLegacyDisplay // Use simple list display for BEE Editor (not tabbed interface)
141
+ />
142
+ )}
39
143
  <div>
40
144
  {shouldShowDoneFooter() && (
41
145
  <div>
@@ -47,10 +151,10 @@ function SlideBoxFooter(props) {
47
151
  <CapRow>
48
152
  <CapButton
49
153
  onClick={onSave}
50
- disabled={isTemplateNameEmpty || fetchingCmsData || false}
154
+ disabled={isTemplateNameEmpty || fetchingCmsData || shouldDisableButtons}
51
155
  >
52
156
  {isFullMode ? (
53
- getFullModeSaveBtn(slidBoxContent)
157
+ getFullModeSaveBtn(slidBoxContent, isCreatingTemplate)
54
158
  ) : (
55
159
  <FormattedMessage {...messages.creativesTemplatesSave} />
56
160
  )}
@@ -59,7 +163,7 @@ function SlideBoxFooter(props) {
59
163
  <CapButton
60
164
  type="secondary"
61
165
  onClick={onTestAndPreview}
62
- // disabled={isEmptyContent || false}
166
+ disabled={shouldDisableButtons}
63
167
  style={{ marginLeft: '8px' }}
64
168
  >
65
169
  <FormattedMessage {...messages.testAndPreview} />
@@ -70,8 +174,11 @@ function SlideBoxFooter(props) {
70
174
  </div>
71
175
  )}
72
176
  {shouldShowContinueFooter() && (
73
- <CapButton onClick={onCreateNextStep}>
74
- <FormattedMessage {...messages.continue} />
177
+ <CapButton
178
+ onClick={onCreateNextStep}
179
+ disabled={isContinueButtonDisabled || false}
180
+ >
181
+ <FormattedMessage {...(continueButtonLabel || messages.continue)} />
75
182
  </CapButton>
76
183
  )}
77
184
  {slidBoxContent === PREVIEW && (
@@ -99,5 +206,48 @@ SlideBoxFooter.propTypes = {
99
206
  onTestAndPreview: PropTypes.func,
100
207
  isEmptyContent: PropTypes.bool,
101
208
  showTestAndPreviewButton: PropTypes.bool,
209
+ isContinueButtonDisabled: PropTypes.bool,
210
+ continueButtonLabel: PropTypes.object,
211
+ htmlEditorValidationState: PropTypes.shape({
212
+ isContentEmpty: PropTypes.bool,
213
+ issueCounts: PropTypes.shape({
214
+ html: PropTypes.number,
215
+ label: PropTypes.number,
216
+ liquid: PropTypes.number,
217
+ total: PropTypes.number,
218
+ }),
219
+ validationComplete: PropTypes.bool,
220
+ /** Only Rule Group #1 (Input & Sanitization) blocks; warnings do not block */
221
+ hasErrors: PropTypes.bool,
222
+ }),
223
+ isCreatingTemplate: PropTypes.bool,
224
+ currentChannel: PropTypes.string,
225
+ emailCreateMode: PropTypes.string,
226
+ selectedEmailCreateMode: PropTypes.string,
227
+ };
228
+
229
+ SlideBoxFooter.defaultProps = {
230
+ slidBoxContent: '',
231
+ onSave: () => {},
232
+ onEditTemplate: () => {},
233
+ onCreateNextStep: () => {},
234
+ shouldShowContinueFooter: () => {},
235
+ shouldShowDoneFooter: () => {},
236
+ isFullMode: false,
237
+ fetchingCmsData: false,
238
+ isTemplateNameEmpty: false,
239
+ errorMessages: [],
240
+ isLiquidValidationError: false,
241
+ currentTab: '',
242
+ onTestAndPreview: () => {},
243
+ isEmptyContent: false,
244
+ showTestAndPreviewButton: false,
245
+ isContinueButtonDisabled: false,
246
+ continueButtonLabel: {},
247
+ htmlEditorValidationState: {},
248
+ isCreatingTemplate: false,
249
+ currentChannel: '',
250
+ emailCreateMode: '',
251
+ selectedEmailCreateMode: '',
102
252
  };
103
253
  export default SlideBoxFooter;
@@ -45,6 +45,7 @@ export function SlideBoxHeader(props) {
45
45
  const isZaloEdit = channel.toLowerCase() === ZALO && slidBoxContent === 'editTemplate';
46
46
  const zaloOverview = isZaloEdit && isFullMode;
47
47
  const whatsappOverview = isWhatsappEdit && isFullMode;
48
+ const shouldShowInAppEditHeader = isInAppEdit && !isFullMode;
48
49
  const headerMessage = whatsappOverview ? messages.whatsappOverview : zaloOverview ? messages.zaloOverview : messages.editMessageContent;
49
50
  const {
50
51
  whatsappTemplateName,
@@ -71,7 +72,6 @@ export function SlideBoxHeader(props) {
71
72
  rcs: <FormattedMessage {...messages.rcsCreative} />,
72
73
  zalo: <FormattedMessage {...messages.zaloTemplate} />,
73
74
  viber: <FormattedMessage {...messages.viberTemplate} />,
74
- webpush: <FormattedMessage {...messages.webPushTemplate} />,
75
75
  };
76
76
  return labels[currentChannel.toLowerCase()];
77
77
  };
@@ -110,7 +110,7 @@ export function SlideBoxHeader(props) {
110
110
  }
111
111
  />
112
112
  )}
113
- {!showTemplateNameHeader && slidBoxContent === 'editTemplate' && (
113
+ {!showTemplateNameHeader && slidBoxContent === 'editTemplate' && (shouldShowInAppEditHeader || !isInAppCreate) && (
114
114
  <CapHeader
115
115
  className="support-video-elements"
116
116
  title={<FormattedMessage {...headerMessage} values={{ channel: getChannelLabel(channel) }} />}
@@ -21,11 +21,10 @@ export const PUSH = "PUSH";
21
21
  export const RCS = "RCS";
22
22
  export const ZALO = "ZALO";
23
23
  export const INAPP = "INAPP";
24
- export const WEBPUSH = "WEBPUSH";
25
- export const WEBPUSH_BRAND_ICON = "WEBPUSH_BRAND_ICON";
26
24
  export const PREVIEW = "preview";
27
25
  export const EDIT_TEMPLATE = "editTemplate";
28
26
  export const JOURNEY = "journey";
27
+ export const HTML = "HTML";
29
28
 
30
29
  export const LOYALTY_SUPPORTED_ACTION = "SEND_COMMUNICATION_ACTION";
31
30
 
@@ -50,4 +49,3 @@ export const BIG_TEXT = "BIG_TEXT";
50
49
  export const GENERIC = "GENERIC";
51
50
  export const LIQUID_ERROR_MSG = "LIQUID_ERROR_MSG";
52
51
  export const STANDARD_ERROR_MSG = "STANDARD_ERROR_MSG";
53
- export const COMMON_CHANNELS = ['sms', 'email', 'wechat', 'mobilepush', 'webpush', 'line', 'viber', 'facebook', 'call_task', 'ftp', 'assets'];