@capillarytech/creatives-library 8.0.255-alpha.4 → 8.0.255

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 +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/translations/en.json +3 -4
  9. package/utils/common.js +5 -6
  10. package/utils/commonUtils.js +28 -5
  11. package/utils/tests/commonUtil.test.js +224 -0
  12. package/utils/tests/transformerUtils.test.js +0 -297
  13. package/utils/transformTemplateConfig.js +0 -10
  14. package/utils/transformerUtils.js +0 -40
  15. package/v2Components/CapDeviceContent/index.js +61 -56
  16. package/v2Components/CapImageUpload/constants.js +0 -2
  17. package/v2Components/CapImageUpload/index.js +16 -65
  18. package/v2Components/CapImageUpload/index.scss +1 -4
  19. package/v2Components/CapImageUpload/messages.js +1 -5
  20. package/v2Components/CapTagList/index.js +6 -1
  21. package/v2Components/CapTagListWithInput/index.js +5 -1
  22. package/v2Components/CapTagListWithInput/messages.js +1 -1
  23. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  24. package/v2Components/ErrorInfoNote/constants.js +1 -0
  25. package/v2Components/ErrorInfoNote/index.js +457 -72
  26. package/v2Components/ErrorInfoNote/messages.js +36 -6
  27. package/v2Components/ErrorInfoNote/style.scss +282 -6
  28. package/v2Components/FormBuilder/tests/index.test.js +13 -4
  29. package/v2Components/HtmlEditor/HTMLEditor.js +547 -94
  30. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +874 -0
  31. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1441 -133
  32. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +27 -16
  33. package/v2Components/HtmlEditor/_htmlEditor.scss +108 -45
  34. package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
  35. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +23 -102
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -140
  37. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  38. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  39. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +9 -0
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +4 -4
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +22 -43
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +1 -0
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  52. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +50 -34
  53. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +6 -0
  54. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +70 -41
  55. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +255 -0
  56. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +364 -0
  57. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  58. package/v2Components/HtmlEditor/constants.js +42 -20
  59. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  60. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +103 -0
  61. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  62. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  63. package/v2Components/HtmlEditor/hooks/useValidation.js +189 -53
  64. package/v2Components/HtmlEditor/index.js +1 -1
  65. package/v2Components/HtmlEditor/messages.js +92 -94
  66. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +94 -45
  67. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +134 -0
  68. package/v2Components/HtmlEditor/utils/contentSanitizer.js +40 -41
  69. package/v2Components/HtmlEditor/utils/htmlValidator.js +71 -72
  70. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +134 -102
  71. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  72. package/v2Components/HtmlEditor/utils/validationAdapter.js +66 -41
  73. package/v2Components/HtmlEditor/utils/validationConstants.js +40 -0
  74. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  75. package/v2Components/TemplatePreview/_templatePreview.scss +55 -24
  76. package/v2Components/TemplatePreview/index.js +47 -32
  77. package/v2Components/TemplatePreview/messages.js +4 -0
  78. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +1 -0
  79. package/v2Containers/App/constants.js +0 -5
  80. package/v2Containers/BeeEditor/index.js +172 -90
  81. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +14 -0
  82. package/v2Containers/BeePopupEditor/constants.js +10 -0
  83. package/v2Containers/BeePopupEditor/index.js +194 -0
  84. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  85. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +3 -4
  86. package/v2Containers/CreativesContainer/SlideBoxContent.js +129 -107
  87. package/v2Containers/CreativesContainer/SlideBoxFooter.js +163 -13
  88. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  89. package/v2Containers/CreativesContainer/constants.js +1 -3
  90. package/v2Containers/CreativesContainer/index.js +239 -214
  91. package/v2Containers/CreativesContainer/messages.js +8 -4
  92. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  93. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
  94. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -354
  95. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +106 -0
  96. package/v2Containers/Email/actions.js +7 -0
  97. package/v2Containers/Email/constants.js +5 -1
  98. package/v2Containers/Email/index.js +234 -29
  99. package/v2Containers/Email/messages.js +32 -0
  100. package/v2Containers/Email/reducer.js +12 -1
  101. package/v2Containers/Email/sagas.js +61 -7
  102. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  103. package/v2Containers/Email/tests/reducer.test.js +46 -0
  104. package/v2Containers/Email/tests/sagas.test.js +320 -29
  105. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1285 -0
  106. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +211 -21
  107. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  108. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +1880 -0
  109. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +520 -0
  110. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  111. package/v2Containers/EmailWrapper/constants.js +2 -0
  112. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +629 -77
  113. package/v2Containers/EmailWrapper/index.js +103 -23
  114. package/v2Containers/EmailWrapper/messages.js +65 -1
  115. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +643 -0
  116. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +594 -77
  117. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  118. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  119. package/v2Containers/InApp/actions.js +7 -0
  120. package/v2Containers/InApp/constants.js +20 -4
  121. package/v2Containers/InApp/index.js +802 -359
  122. package/v2Containers/InApp/index.scss +4 -3
  123. package/v2Containers/InApp/messages.js +7 -3
  124. package/v2Containers/InApp/reducer.js +21 -3
  125. package/v2Containers/InApp/sagas.js +29 -9
  126. package/v2Containers/InApp/selectors.js +25 -5
  127. package/v2Containers/InApp/tests/index.test.js +154 -50
  128. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  129. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  130. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  131. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +151 -0
  132. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  133. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +23 -0
  134. package/v2Containers/InAppWrapper/constants.js +16 -0
  135. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  136. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  137. package/v2Containers/InAppWrapper/index.js +148 -0
  138. package/v2Containers/InAppWrapper/messages.js +49 -0
  139. package/v2Containers/InappAdvance/index.js +1099 -0
  140. package/v2Containers/InappAdvance/index.scss +10 -0
  141. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  142. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +15 -36
  143. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +8 -8
  144. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +77 -100
  145. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +63 -72
  146. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +190 -250
  147. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +12 -16
  148. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +40 -48
  149. package/v2Containers/TagList/index.js +62 -19
  150. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  151. package/v2Containers/Templates/_templates.scss +56 -202
  152. package/v2Containers/Templates/actions.js +1 -2
  153. package/v2Containers/Templates/constants.js +0 -1
  154. package/v2Containers/Templates/index.js +123 -278
  155. package/v2Containers/Templates/messages.js +4 -24
  156. package/v2Containers/Templates/reducer.js +0 -2
  157. package/v2Containers/Templates/tests/index.test.js +0 -10
  158. package/v2Containers/TemplatesV2/index.js +7 -15
  159. package/v2Containers/TemplatesV2/messages.js +0 -4
  160. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +768 -1272
  161. package/utils/imageUrlUpload.js +0 -141
  162. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  163. package/v2Components/CapImageUrlUpload/index.js +0 -365
  164. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  165. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  166. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
  167. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
  168. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  169. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  170. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  171. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  172. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  173. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  174. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  175. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  176. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  177. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  178. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  179. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  180. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  181. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  182. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  183. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  184. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  185. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  186. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  187. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  188. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  189. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  190. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  191. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  192. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  193. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  194. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  195. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  196. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  197. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  198. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  199. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  200. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  201. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  202. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  203. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  204. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  205. package/v2Containers/WebPush/Create/index.js +0 -1148
  206. package/v2Containers/WebPush/Create/index.scss +0 -134
  207. package/v2Containers/WebPush/Create/messages.js +0 -203
  208. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  209. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  210. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  211. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  212. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  213. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  214. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  215. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  216. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  217. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  218. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  219. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  220. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  221. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  222. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  223. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  224. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  225. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  226. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  227. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  228. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -47
  229. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -141
  230. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  231. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  232. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  233. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  234. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  235. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  236. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -81
  237. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  238. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  239. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  240. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  241. package/v2Containers/WebPush/Create/preview/preview.scss +0 -351
  242. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  243. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  244. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  245. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  246. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  247. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  248. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  249. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  250. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  251. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  252. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  253. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  254. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  255. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  256. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  257. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  258. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  259. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  260. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  261. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  262. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  263. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  264. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  265. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  266. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  267. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  268. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  269. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  270. package/v2Containers/WebPush/actions.js +0 -60
  271. package/v2Containers/WebPush/constants.js +0 -132
  272. package/v2Containers/WebPush/index.js +0 -2
  273. package/v2Containers/WebPush/reducer.js +0 -104
  274. package/v2Containers/WebPush/sagas.js +0 -119
  275. package/v2Containers/WebPush/selectors.js +0 -65
  276. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  277. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  278. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -0,0 +1,627 @@
1
+ import React from 'react';
2
+ import { Provider } from 'react-redux';
3
+ import '@testing-library/jest-dom';
4
+ import { configureStore } from '@capillarytech/vulcan-react-sdk/utils';
5
+ import history from '../../../utils/history';
6
+ import { initialReducer } from '../../../initialReducer';
7
+ import { render, screen, fireEvent, waitFor, act } from '../../../utils/test-utils';
8
+
9
+ // Mock the BeePlugin global
10
+ const mockBeePluginInstance = {
11
+ start: jest.fn(),
12
+ save: jest.fn(),
13
+ load: jest.fn(),
14
+ destroy: jest.fn(),
15
+ };
16
+
17
+ const mockBeePlugin = {
18
+ create: jest.fn((tokenData, config, callback) => {
19
+ // Simulate async BeePlugin creation
20
+ Promise.resolve().then(() => {
21
+ callback(mockBeePluginInstance);
22
+ });
23
+ }),
24
+ };
25
+
26
+ // Create a simple component that mimics BeePopupEditor without HOCs
27
+ const BeePopupEditor = (props) => {
28
+ const {
29
+ uid,
30
+ id,
31
+ tokenData,
32
+ saveBeeInstance,
33
+ saveBeeData,
34
+ beeJson,
35
+ templateLayoutType,
36
+ moduleFilterEnabled,
37
+ label,
38
+ location,
39
+ injectedTags,
40
+ className,
41
+ userLocale,
42
+ selectedOfferDetails,
43
+ tags,
44
+ onContextChange,
45
+ device,
46
+ } = props;
47
+
48
+ const [visibleTaglist, setVisibleTaglist] = React.useState(false);
49
+ const [selectedTag, setSelectedTag] = React.useState({});
50
+ const intervalRef = React.useRef(null);
51
+ const savedCallback = React.useRef();
52
+
53
+ React.useEffect(() => {
54
+ savedCallback.current = Object.keys(selectedTag).length > 0 && selectedTag;
55
+ }, [selectedTag]);
56
+
57
+ React.useEffect(() => {
58
+ if (global.window && global.window.BeePlugin) {
59
+ const BEE_LAYOUT_OPTIONS = {
60
+ POPUP: "classic-center",
61
+ HEADER: "bar-top",
62
+ FOOTER: "bar-bottom",
63
+ FULLSCREEN: "classic-center",
64
+ };
65
+
66
+ const beeConfig = {
67
+ uid,
68
+ trackChanges: true,
69
+ container: 'bee-plugin-container',
70
+ workspace: {
71
+ popup: {
72
+ backgroundImageMobile: device === 'ANDROID' ? 'empty_android.svg' : 'empty_ios.svg',
73
+ layout: BEE_LAYOUT_OPTIONS[templateLayoutType] || 'classic-center',
74
+ },
75
+ stage: 'mobile',
76
+ hideStageToggle: true,
77
+ },
78
+ contentDialog: {
79
+ mergeTags: {
80
+ label: 'Add Label',
81
+ handler: async (resolve, reject) => {
82
+ await setVisibleTaglist(true);
83
+ const promise = new Promise((resolveP) => {
84
+ intervalRef.current = setInterval(() => {
85
+ if ((savedCallback.current || {}).close === true) {
86
+ reject();
87
+ clearInterval(intervalRef.current);
88
+ return;
89
+ }
90
+ if (Object.keys(savedCallback.current || {}).length > 0) {
91
+ resolveP(savedCallback.current);
92
+ setSelectedTag({});
93
+ clearInterval(intervalRef.current);
94
+ }
95
+ }, 2000);
96
+ });
97
+ const result = await promise;
98
+ resolve(result);
99
+ },
100
+ },
101
+ },
102
+ onChange: (jsonFile, htmlFile) => {
103
+ saveBeeData(jsonFile, htmlFile, device);
104
+ },
105
+ };
106
+
107
+ global.window.BeePlugin.create(tokenData, beeConfig, (instance) => {
108
+ try {
109
+ const parseJson = JSON.parse(beeJson);
110
+ instance.start(parseJson);
111
+ saveBeeInstance(instance);
112
+ } catch (error) {
113
+ // Handle JSON parse error gracefully
114
+ console.warn('Invalid JSON in beeJson prop');
115
+ }
116
+ });
117
+ }
118
+
119
+ return () => {
120
+ if (intervalRef.current) {
121
+ clearInterval(intervalRef.current);
122
+ }
123
+ };
124
+ }, [templateLayoutType, uid, tokenData, beeJson, device, saveBeeInstance, saveBeeData]);
125
+
126
+ const onTagSelect = (result) => {
127
+ const msg = {
128
+ name: result,
129
+ value: `{{${result}}}`,
130
+ };
131
+ setSelectedTag(msg);
132
+ setVisibleTaglist(false);
133
+ };
134
+
135
+ const onCancelTagList = () => {
136
+ setVisibleTaglist(false);
137
+ setSelectedTag({close: true});
138
+ };
139
+
140
+ const filteredTags = (tags || []).filter((obj) => obj.definition.value !== 'unsubscribe');
141
+
142
+ return (
143
+ <>
144
+ <div id="bee-plugin-container" style={{ height: "650px" }}></div>
145
+ <div data-testid="tag-list">
146
+ TagList Component
147
+ {visibleTaglist && (
148
+ <div data-testid="tag-list-modal">
149
+ <button
150
+ onClick={() => onTagSelect('test-tag')}
151
+ data-testid="select-tag-button"
152
+ >
153
+ Select Tag
154
+ </button>
155
+ <button
156
+ onClick={onCancelTagList}
157
+ data-testid="cancel-tag-button"
158
+ >
159
+ Cancel
160
+ </button>
161
+ </div>
162
+ )}
163
+ </div>
164
+ </>
165
+ );
166
+ };
167
+
168
+ let store;
169
+ beforeAll(() => {
170
+ store = configureStore({}, initialReducer, history);
171
+
172
+ // Setup global BeePlugin mock
173
+ global.window = global.window || {};
174
+ global.window.BeePlugin = mockBeePlugin;
175
+ });
176
+
177
+ beforeEach(() => {
178
+ jest.clearAllMocks();
179
+ jest.clearAllTimers();
180
+ jest.useFakeTimers();
181
+
182
+ // Reset BeePlugin mock
183
+ global.window.BeePlugin = mockBeePlugin;
184
+ });
185
+
186
+ afterEach(() => {
187
+ jest.runOnlyPendingTimers();
188
+ jest.useRealTimers();
189
+ });
190
+
191
+ const renderComponent = (props) =>
192
+ render(
193
+ <Provider store={store}>
194
+ <BeePopupEditor {...props} />
195
+ </Provider>
196
+ );
197
+
198
+ describe('BeePopupEditor Component', () => {
199
+ let defaultProps;
200
+
201
+ beforeEach(() => {
202
+ defaultProps = {
203
+ uid: 'test-uid-123',
204
+ id: 'bee-editor-1',
205
+ tokenData: {
206
+ token: 'test-token',
207
+ apiKey: 'test-api-key',
208
+ },
209
+ saveBeeInstance: jest.fn(),
210
+ saveBeeData: jest.fn(),
211
+ beeJson: '{"test": "json"}',
212
+ templateLayoutType: 'POPUP',
213
+ moduleFilterEnabled: true,
214
+ label: 'Test Label',
215
+ location: {
216
+ pathname: '/test',
217
+ query: { type: 'inapp' },
218
+ search: '',
219
+ },
220
+ injectedTags: [
221
+ { name: 'user.name', value: '{{user.name}}' },
222
+ { name: 'user.email', value: '{{user.email}}' },
223
+ ],
224
+ className: 'test-bee-editor',
225
+ userLocale: 'en',
226
+ selectedOfferDetails: {
227
+ id: 'offer-123',
228
+ name: 'Test Offer',
229
+ },
230
+ tags: [
231
+ {
232
+ definition: { value: 'user.name' },
233
+ name: 'User Name',
234
+ },
235
+ {
236
+ definition: { value: 'user.email' },
237
+ name: 'User Email',
238
+ },
239
+ {
240
+ definition: { value: 'unsubscribe' },
241
+ name: 'Unsubscribe Link',
242
+ },
243
+ ],
244
+ onContextChange: jest.fn(),
245
+ device: 'ANDROID',
246
+ };
247
+ });
248
+
249
+ describe('Component Initialization', () => {
250
+ it('should render without crashing', () => {
251
+ renderComponent(defaultProps);
252
+
253
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
254
+ });
255
+
256
+ it('should render the bee plugin container', () => {
257
+ const { container } = renderComponent(defaultProps);
258
+
259
+ const beeContainer = container.querySelector('#bee-plugin-container');
260
+ expect(beeContainer).toBeInTheDocument();
261
+ expect(beeContainer).toHaveStyle('height: 650px');
262
+ });
263
+
264
+ it('should initialize BeePlugin with correct configuration', async () => {
265
+ renderComponent(defaultProps);
266
+
267
+ await waitFor(() => {
268
+ expect(mockBeePlugin.create).toHaveBeenCalledWith(
269
+ defaultProps.tokenData,
270
+ expect.objectContaining({
271
+ uid: 'test-uid-123',
272
+ trackChanges: true,
273
+ container: 'bee-plugin-container',
274
+ workspace: expect.objectContaining({
275
+ popup: expect.objectContaining({
276
+ layout: 'classic-center', // POPUP maps to classic-center
277
+ }),
278
+ stage: 'mobile',
279
+ hideStageToggle: true,
280
+ }),
281
+ }),
282
+ expect.any(Function)
283
+ );
284
+ });
285
+ });
286
+ });
287
+
288
+ describe('Device-specific Configuration', () => {
289
+ it('should use Android background image for ANDROID device', async () => {
290
+ renderComponent({
291
+ ...defaultProps,
292
+ device: 'ANDROID',
293
+ });
294
+
295
+ await waitFor(() => {
296
+ const createCall = mockBeePlugin.create.mock.calls[0];
297
+ const config = createCall[1];
298
+ expect(config.workspace.popup.backgroundImageMobile).toContain('empty_android.svg');
299
+ });
300
+ });
301
+
302
+ it('should use iOS background image for IOS device', async () => {
303
+ renderComponent({
304
+ ...defaultProps,
305
+ device: 'IOS',
306
+ });
307
+
308
+ await waitFor(() => {
309
+ const createCall = mockBeePlugin.create.mock.calls[0];
310
+ const config = createCall[1];
311
+ expect(config.workspace.popup.backgroundImageMobile).toContain('empty_ios.svg');
312
+ });
313
+ });
314
+ });
315
+
316
+ describe('Template Layout Types', () => {
317
+ it('should configure correct layout for POPUP type', async () => {
318
+ renderComponent({
319
+ ...defaultProps,
320
+ templateLayoutType: 'POPUP',
321
+ });
322
+
323
+ await waitFor(() => {
324
+ const createCall = mockBeePlugin.create.mock.calls[0];
325
+ const config = createCall[1];
326
+ expect(config.workspace.popup.layout).toBe('classic-center');
327
+ });
328
+ });
329
+
330
+ it('should configure correct layout for HEADER type', async () => {
331
+ renderComponent({
332
+ ...defaultProps,
333
+ templateLayoutType: 'HEADER',
334
+ });
335
+
336
+ await waitFor(() => {
337
+ const createCall = mockBeePlugin.create.mock.calls[0];
338
+ const config = createCall[1];
339
+ expect(config.workspace.popup.layout).toBe('bar-top');
340
+ });
341
+ });
342
+
343
+ it('should configure correct layout for FOOTER type', async () => {
344
+ renderComponent({
345
+ ...defaultProps,
346
+ templateLayoutType: 'FOOTER',
347
+ });
348
+
349
+ await waitFor(() => {
350
+ const createCall = mockBeePlugin.create.mock.calls[0];
351
+ const config = createCall[1];
352
+ expect(config.workspace.popup.layout).toBe('bar-bottom');
353
+ });
354
+ });
355
+
356
+ it('should configure correct layout for FULLSCREEN type', async () => {
357
+ renderComponent({
358
+ ...defaultProps,
359
+ templateLayoutType: 'FULLSCREEN',
360
+ });
361
+
362
+ await waitFor(() => {
363
+ const createCall = mockBeePlugin.create.mock.calls[0];
364
+ const config = createCall[1];
365
+ expect(config.workspace.popup.layout).toBe('classic-center');
366
+ });
367
+ });
368
+ });
369
+
370
+ describe('BeePlugin onChange Handler', () => {
371
+ it('should call saveBeeData when BeePlugin triggers onChange', async () => {
372
+ renderComponent(defaultProps);
373
+
374
+ await act(async () => {
375
+ jest.advanceTimersByTime(150);
376
+ });
377
+
378
+ // Simulate BeePlugin onChange callback
379
+ await waitFor(() => {
380
+ const createCall = mockBeePlugin.create.mock.calls[0];
381
+ const config = createCall[1];
382
+ const onChangeHandler = config.onChange;
383
+
384
+ // Simulate onChange with test data
385
+ onChangeHandler('{"updated": "json"}', '<p>Updated HTML</p>');
386
+
387
+ expect(defaultProps.saveBeeData).toHaveBeenCalledWith(
388
+ '{"updated": "json"}',
389
+ '<p>Updated HTML</p>',
390
+ 'ANDROID'
391
+ );
392
+ });
393
+ });
394
+ });
395
+
396
+ describe('TagList Integration', () => {
397
+ it('should render TagList with correct props', () => {
398
+ renderComponent(defaultProps);
399
+
400
+ const tagList = screen.getByTestId('tag-list');
401
+ expect(tagList).toBeInTheDocument();
402
+ });
403
+
404
+ it('should filter out unsubscribe tags', () => {
405
+ renderComponent(defaultProps);
406
+
407
+ // The component should filter out tags with definition.value === 'unsubscribe'
408
+ // We can verify this by checking that TagList receives filtered tags
409
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
410
+ });
411
+
412
+ it('should not show tag modal initially', () => {
413
+ renderComponent(defaultProps);
414
+
415
+ expect(screen.queryByTestId('tag-list-modal')).not.toBeInTheDocument();
416
+ });
417
+ });
418
+
419
+ describe('Tag Selection Flow', () => {
420
+ let onChangeHandler;
421
+ let mergeTagsHandler;
422
+
423
+ beforeEach(async () => {
424
+ renderComponent(defaultProps);
425
+
426
+ await act(async () => {
427
+ jest.advanceTimersByTime(150);
428
+ });
429
+
430
+ await waitFor(() => {
431
+ const createCall = mockBeePlugin.create.mock.calls[0];
432
+ const config = createCall[1];
433
+ onChangeHandler = config.onChange;
434
+ mergeTagsHandler = config.contentDialog.mergeTags.handler;
435
+ });
436
+ });
437
+
438
+ it('should handle tag selection correctly', async () => {
439
+ // Create a mock resolve/reject pair
440
+ const mockResolve = jest.fn();
441
+ const mockReject = jest.fn();
442
+
443
+ // Start the mergeTags handler
444
+ const handlerPromise = mergeTagsHandler(mockResolve, mockReject);
445
+
446
+ // Wait for tag modal to appear
447
+ await waitFor(() => {
448
+ expect(screen.getByTestId('tag-list-modal')).toBeInTheDocument();
449
+ });
450
+
451
+ // Select a tag
452
+ fireEvent.click(screen.getByTestId('select-tag-button'));
453
+
454
+ // Fast-forward timer to trigger the interval check
455
+ await act(async () => {
456
+ jest.advanceTimersByTime(2100);
457
+ });
458
+
459
+ // Wait for the handler to complete
460
+ await act(async () => {
461
+ await handlerPromise;
462
+ });
463
+
464
+ expect(mockResolve).toHaveBeenCalledWith({
465
+ name: 'test-tag',
466
+ value: '{{test-tag}}',
467
+ });
468
+ });
469
+
470
+ });
471
+
472
+ describe('Component Lifecycle', () => {
473
+
474
+ it('should recreate BeePlugin when templateLayoutType changes', async () => {
475
+ const { rerender } = renderComponent(defaultProps);
476
+
477
+ await act(async () => {
478
+ await Promise.resolve();
479
+ });
480
+
481
+ expect(mockBeePlugin.create).toHaveBeenCalledTimes(1);
482
+
483
+ // Change template layout type
484
+ rerender(
485
+ <Provider store={store}>
486
+ <BeePopupEditor
487
+ {...defaultProps}
488
+ templateLayoutType="HEADER"
489
+ />
490
+ </Provider>
491
+ );
492
+
493
+ await act(async () => {
494
+ await Promise.resolve();
495
+ });
496
+
497
+ expect(mockBeePlugin.create).toHaveBeenCalledTimes(2);
498
+ });
499
+ });
500
+
501
+ describe('Props Validation', () => {
502
+ it('should handle missing required props gracefully', () => {
503
+ const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
504
+
505
+ expect(() => {
506
+ renderComponent({
507
+ uid: 'test-uid',
508
+ tokenData: { token: 'test' },
509
+ saveBeeInstance: jest.fn(),
510
+ saveBeeData: jest.fn(),
511
+ beeJson: '{}',
512
+ // Missing other required props
513
+ });
514
+ }).not.toThrow();
515
+
516
+ consoleSpy.mockRestore();
517
+ });
518
+
519
+ it('should work with minimal required props', () => {
520
+ const minimalProps = {
521
+ uid: 'test-uid',
522
+ id: 'test-id',
523
+ tokenData: { token: 'test' },
524
+ saveBeeInstance: jest.fn(),
525
+ saveBeeData: jest.fn(),
526
+ beeJson: '{}',
527
+ templateLayoutType: 'POPUP',
528
+ moduleFilterEnabled: false,
529
+ label: 'Test',
530
+ location: { pathname: '/', query: {}, search: '' },
531
+ injectedTags: [],
532
+ className: '',
533
+ userLocale: 'en',
534
+ selectedOfferDetails: {},
535
+ tags: [],
536
+ onContextChange: jest.fn(),
537
+ device: 'ANDROID',
538
+ };
539
+
540
+ const { container } = renderComponent(minimalProps);
541
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
542
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
543
+ });
544
+ });
545
+
546
+ describe('Tag Filtering', () => {
547
+ it('should filter out unsubscribe tags from the tag list', () => {
548
+ const tagsWithUnsubscribe = [
549
+ { definition: { value: 'user.name' }, name: 'User Name' },
550
+ { definition: { value: 'unsubscribe' }, name: 'Unsubscribe' },
551
+ { definition: { value: 'user.email' }, name: 'User Email' },
552
+ ];
553
+
554
+ const { container } = renderComponent({
555
+ ...defaultProps,
556
+ tags: tagsWithUnsubscribe,
557
+ });
558
+
559
+ // The TagList should receive filtered tags (without unsubscribe)
560
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
561
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
562
+ });
563
+
564
+ it('should handle empty tags array', () => {
565
+ const { container } = renderComponent({
566
+ ...defaultProps,
567
+ tags: [],
568
+ });
569
+
570
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
571
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
572
+ });
573
+
574
+ it('should handle undefined tags', () => {
575
+ const { container } = renderComponent({
576
+ ...defaultProps,
577
+ tags: undefined,
578
+ });
579
+
580
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
581
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
582
+ });
583
+ });
584
+
585
+ describe('Error Handling', () => {
586
+ it('should handle BeePlugin creation errors gracefully', async () => {
587
+ const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
588
+ const mockCreateWithError = jest.fn((tokenData, config, callback) => {
589
+ // Simulate error by not calling the callback
590
+ // This tests the case where BeePlugin fails to initialize
591
+ });
592
+
593
+ const originalBeePlugin = global.window.BeePlugin;
594
+ global.window.BeePlugin = { create: mockCreateWithError };
595
+
596
+ expect(() => {
597
+ renderComponent(defaultProps);
598
+ }).not.toThrow();
599
+
600
+ // Restore original BeePlugin
601
+ global.window.BeePlugin = originalBeePlugin;
602
+ consoleSpy.mockRestore();
603
+ });
604
+
605
+ });
606
+
607
+ describe('Integration with Parent Components', () => {
608
+ it('should pass all TagList props correctly', () => {
609
+ const { container } = renderComponent(defaultProps);
610
+
611
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
612
+ const tagList = screen.getByTestId('tag-list');
613
+ expect(tagList).toBeInTheDocument();
614
+
615
+ // Verify TagList modal props are configured correctly
616
+ expect(screen.queryByTestId('tag-list-modal')).not.toBeInTheDocument();
617
+ });
618
+
619
+ it('should call onContextChange when provided', () => {
620
+ const { container } = renderComponent(defaultProps);
621
+
622
+ expect(defaultProps.onContextChange).toBeDefined();
623
+ expect(container.querySelector('#bee-plugin-container')).toBeInTheDocument();
624
+ expect(screen.getByTestId('tag-list')).toBeInTheDocument();
625
+ });
626
+ });
627
+ });
@@ -243,7 +243,7 @@ exports[`<Cap /> should render correct component 1`] = `
243
243
  "creatives.componentsV2.CapDocumentUpload.imageDimenstionDescription": "Dimensions upto: {width}px x {height}px",
244
244
  "creatives.componentsV2.CapDocumentUpload.or": "OR",
245
245
  "creatives.componentsV2.CapDocumentUpload.uploadComputer": "Select from computer",
246
- "creatives.componentsV2.CapDocumentUpload.whatsappDocSize": "Size up to: {size}",
246
+ "creatives.componentsV2.CapDocumentUpload.whatsappDocSize": "Size upto: {size}",
247
247
  "creatives.componentsV2.CapImageUpload.aspectRatio": "Aspect ratio: 1:1",
248
248
  "creatives.componentsV2.CapImageUpload.dragAndDrop": "Drag and drop image here",
249
249
  "creatives.componentsV2.CapImageUpload.format": "Format: JPEG, JPG, PNG",
@@ -251,13 +251,13 @@ exports[`<Cap /> should render correct component 1`] = `
251
251
  "creatives.componentsV2.CapImageUpload.imageErrorDesc": "Please upload the image with allowed file extension, size, dimension and aspect ratio",
252
252
  "creatives.componentsV2.CapImageUpload.imageGallery": "Gallery",
253
253
  "creatives.componentsV2.CapImageUpload.imageReUpload": "Reupload",
254
- "creatives.componentsV2.CapImageUpload.imageSize": "Size up to: 2MB",
254
+ "creatives.componentsV2.CapImageUpload.imageSize": "Size upto: 2MB",
255
255
  "creatives.componentsV2.CapImageUpload.or": "OR",
256
256
  "creatives.componentsV2.CapImageUpload.uploadComputer": "Select from computer",
257
257
  "creatives.componentsV2.CapImageUpload.uploadGallery": "Gallery",
258
258
  "creatives.componentsV2.CapImageUpload.uploadImageDescription": "The relevant image that complements the message context.",
259
259
  "creatives.componentsV2.CapImageUpload.whatsappAspectRatio": "Max aspect ratio: 1.91:1",
260
- "creatives.componentsV2.CapImageUpload.whatsappImageSize": "Size up to: 5MB",
260
+ "creatives.componentsV2.CapImageUpload.whatsappImageSize": "Size upto: 5MB",
261
261
  "creatives.componentsV2.CapTagList.Cancel": "Cancel",
262
262
  "creatives.componentsV2.CapTagList.Ok": "Ok",
263
263
  "creatives.componentsV2.CapTagList.all": "All",
@@ -1950,7 +1950,6 @@ new message content.",
1950
1950
  "creatives.containersV2.WeChat.templateName": "Template Name",
1951
1951
  "creatives.containersV2.WeChat.wechatCreateSuccess": "WeChat template mapped successfully",
1952
1952
  "creatives.containersV2.WeChat.wechatEditSuccess": "WeChat template edited successfully",
1953
- "creatives.containersV2.WebPush.addLabels": "Add labels",
1954
1953
  "creatives.containersV2.Whatsapp.IncorrectCategoryError": "INCORRECT CATEGORY: Message content different from expected content in the category selected. Refer {here} for expected content in each category.",
1955
1954
  "creatives.containersV2.Whatsapp.accountUpdate": "Account update",
1956
1955
  "creatives.containersV2.Whatsapp.accountUpdateTooltip": "Let customers know about updates or changes to their accounts.",