@capillarytech/creatives-library 8.0.263 → 8.0.265

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 (280) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +1 -3
  4. package/initialReducer.js +0 -2
  5. package/package.json +1 -1
  6. package/services/api.js +0 -15
  7. package/services/tests/api.test.js +0 -34
  8. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +35 -17
  9. package/tests/integration/TemplateCreation/api-response.js +1 -31
  10. package/tests/integration/TemplateCreation/msw-handler.js +0 -2
  11. package/utils/common.js +0 -11
  12. package/utils/commonUtils.js +5 -28
  13. package/utils/tests/commonUtil.test.js +0 -224
  14. package/utils/tests/transformerUtils.test.js +0 -297
  15. package/utils/transformTemplateConfig.js +10 -0
  16. package/utils/transformerUtils.js +0 -40
  17. package/v2Components/CapDeviceContent/index.js +56 -61
  18. package/v2Components/CapImageUpload/constants.js +0 -2
  19. package/v2Components/CapImageUpload/index.js +16 -65
  20. package/v2Components/CapImageUpload/index.scss +1 -4
  21. package/v2Components/CapImageUpload/messages.js +1 -5
  22. package/v2Components/CapTagList/index.js +1 -6
  23. package/v2Components/CapTagListWithInput/index.js +1 -5
  24. package/v2Components/CapTagListWithInput/messages.js +1 -1
  25. package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
  26. package/v2Components/ErrorInfoNote/index.js +72 -402
  27. package/v2Components/ErrorInfoNote/messages.js +6 -32
  28. package/v2Components/ErrorInfoNote/style.scss +6 -278
  29. package/v2Components/FormBuilder/tests/index.test.js +4 -13
  30. package/v2Components/HtmlEditor/HTMLEditor.js +99 -418
  31. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1882
  32. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
  33. package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
  34. package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
  35. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
  36. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
  37. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
  38. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  39. package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -9
  40. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +6 -31
  41. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
  45. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  46. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
  47. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +10 -7
  48. package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
  49. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  50. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
  51. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -18
  52. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -36
  53. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -46
  54. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +46 -52
  55. package/v2Components/HtmlEditor/constants.js +20 -45
  56. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
  57. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -351
  58. package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
  59. package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
  60. package/v2Components/HtmlEditor/hooks/useValidation.js +56 -213
  61. package/v2Components/HtmlEditor/index.js +1 -1
  62. package/v2Components/HtmlEditor/messages.js +94 -102
  63. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -214
  64. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
  65. package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
  66. package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
  67. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +124 -158
  68. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
  69. package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
  70. package/v2Components/MobilePushPreviewV2/index.js +7 -33
  71. package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
  72. package/v2Components/TemplatePreview/index.js +32 -47
  73. package/v2Components/TemplatePreview/messages.js +0 -4
  74. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
  75. package/v2Containers/App/constants.js +0 -5
  76. package/v2Containers/BeeEditor/index.js +90 -172
  77. package/v2Containers/CreativesContainer/SlideBoxContent.js +53 -184
  78. package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
  79. package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -3
  80. package/v2Containers/CreativesContainer/constants.js +0 -4
  81. package/v2Containers/CreativesContainer/index.js +46 -408
  82. package/v2Containers/CreativesContainer/messages.js +0 -12
  83. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
  84. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
  85. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +50 -342
  86. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -103
  87. package/v2Containers/Email/actions.js +0 -7
  88. package/v2Containers/Email/constants.js +1 -5
  89. package/v2Containers/Email/index.js +36 -237
  90. package/v2Containers/Email/messages.js +0 -32
  91. package/v2Containers/Email/reducer.js +1 -12
  92. package/v2Containers/Email/sagas.js +7 -61
  93. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
  94. package/v2Containers/Email/tests/reducer.test.js +0 -46
  95. package/v2Containers/Email/tests/sagas.test.js +29 -320
  96. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
  97. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
  98. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
  99. package/v2Containers/EmailWrapper/constants.js +0 -2
  100. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
  101. package/v2Containers/EmailWrapper/index.js +23 -103
  102. package/v2Containers/EmailWrapper/messages.js +1 -65
  103. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
  104. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
  105. package/v2Containers/InApp/actions.js +0 -7
  106. package/v2Containers/InApp/constants.js +4 -20
  107. package/v2Containers/InApp/index.js +359 -802
  108. package/v2Containers/InApp/index.scss +3 -4
  109. package/v2Containers/InApp/messages.js +3 -7
  110. package/v2Containers/InApp/reducer.js +3 -21
  111. package/v2Containers/InApp/sagas.js +9 -29
  112. package/v2Containers/InApp/selectors.js +5 -25
  113. package/v2Containers/InApp/tests/index.test.js +50 -154
  114. package/v2Containers/InApp/tests/reducer.test.js +0 -34
  115. package/v2Containers/InApp/tests/sagas.test.js +9 -61
  116. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
  117. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
  118. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
  119. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
  120. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
  121. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
  122. package/v2Containers/TagList/index.js +19 -62
  123. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  124. package/v2Containers/Templates/_templates.scss +1 -265
  125. package/v2Containers/Templates/actions.js +1 -2
  126. package/v2Containers/Templates/constants.js +0 -1
  127. package/v2Containers/Templates/index.js +38 -363
  128. package/v2Containers/Templates/messages.js +0 -28
  129. package/v2Containers/Templates/reducer.js +0 -2
  130. package/v2Containers/Templates/tests/index.test.js +0 -10
  131. package/v2Containers/TemplatesV2/TemplatesV2.style.js +2 -4
  132. package/v2Containers/TemplatesV2/index.js +7 -15
  133. package/v2Containers/TemplatesV2/messages.js +0 -4
  134. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
  135. package/utils/imageUrlUpload.js +0 -141
  136. package/v2Components/CapImageUrlUpload/constants.js +0 -26
  137. package/v2Components/CapImageUrlUpload/index.js +0 -365
  138. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  139. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  140. package/v2Components/ErrorInfoNote/constants.js +0 -1
  141. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -870
  142. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
  143. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -281
  144. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -295
  145. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
  146. package/v2Components/HtmlEditor/utils/validationConstants.js +0 -38
  147. package/v2Components/MobilePushPreviewV2/constants.js +0 -6
  148. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
  149. package/v2Containers/BeePopupEditor/constants.js +0 -10
  150. package/v2Containers/BeePopupEditor/index.js +0 -194
  151. package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
  152. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1246
  153. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -2472
  154. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
  155. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -956
  156. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
  157. package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
  158. package/v2Containers/InApp/tests/selectors.test.js +0 -612
  159. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
  160. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
  161. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
  162. package/v2Containers/InAppWrapper/constants.js +0 -16
  163. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
  164. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
  165. package/v2Containers/InAppWrapper/index.js +0 -148
  166. package/v2Containers/InAppWrapper/messages.js +0 -49
  167. package/v2Containers/InappAdvance/index.js +0 -1099
  168. package/v2Containers/InappAdvance/index.scss +0 -10
  169. package/v2Containers/InappAdvance/tests/index.test.js +0 -448
  170. package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
  171. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
  172. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  173. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
  174. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
  175. package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
  176. package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
  177. package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
  178. package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
  179. package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
  180. package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
  181. package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
  182. package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
  183. package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
  184. package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
  185. package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
  186. package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
  187. package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
  188. package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
  189. package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
  190. package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
  191. package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
  192. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  193. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  194. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  195. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  196. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  197. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  198. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -78
  199. package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
  200. package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
  201. package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
  202. package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
  203. package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
  204. package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
  205. package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
  206. package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
  207. package/v2Containers/WebPush/Create/index.js +0 -1148
  208. package/v2Containers/WebPush/Create/index.scss +0 -134
  209. package/v2Containers/WebPush/Create/messages.js +0 -211
  210. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
  211. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
  212. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
  213. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
  214. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
  215. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
  216. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  217. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  218. package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +0 -9
  219. package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
  220. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  221. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  222. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  223. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  224. package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +0 -9
  225. package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
  226. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  227. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  228. package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +0 -9
  229. package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
  230. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
  231. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
  232. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  233. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
  234. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
  235. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
  236. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
  237. package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
  238. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
  239. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
  240. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
  241. package/v2Containers/WebPush/Create/preview/constants.js +0 -637
  242. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
  243. package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
  244. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
  245. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  246. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  247. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  248. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -47
  249. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  250. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  251. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  252. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -207
  253. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
  254. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  255. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
  256. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
  257. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  258. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
  259. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  260. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
  261. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
  262. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
  263. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  264. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -129
  265. package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
  266. package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
  267. package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
  268. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
  269. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  270. package/v2Containers/WebPush/Create/utils/validation.js +0 -75
  271. package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
  272. package/v2Containers/WebPush/actions.js +0 -60
  273. package/v2Containers/WebPush/constants.js +0 -132
  274. package/v2Containers/WebPush/index.js +0 -2
  275. package/v2Containers/WebPush/reducer.js +0 -104
  276. package/v2Containers/WebPush/sagas.js +0 -119
  277. package/v2Containers/WebPush/selectors.js +0 -65
  278. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  279. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  280. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -1,389 +1,21 @@
1
- import React, { useState, useMemo, useEffect } from 'react';
2
- import PropTypes from 'prop-types';
3
- import CapRow from '@capillarytech/cap-ui-library/CapRow';
4
- import CapButton from '@capillarytech/cap-ui-library/CapButton';
5
- import CapIcon from '@capillarytech/cap-ui-library/CapIcon';
6
- import CapLabel from '@capillarytech/cap-ui-library/CapLabel';
7
- import CapTab from '@capillarytech/cap-ui-library/CapTab';
8
- import CapTooltip from '@capillarytech/cap-ui-library/CapTooltip';
1
+ import React from "react";
2
+ import PropTypes from "prop-types";
3
+ import CapRow from "@capillarytech/cap-ui-library/CapRow";
4
+ import CapButton from "@capillarytech/cap-ui-library/CapButton";
5
+ import CapIcon from "@capillarytech/cap-ui-library/CapIcon";
6
+ import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
7
+ import CapList from "@capillarytech/cap-ui-library/CapList";
9
8
  import {
10
9
  FormattedMessage,
10
+ FormattedNumber,
11
11
  injectIntl,
12
- } from 'react-intl';
13
- import './style.scss';
14
- import messages from './messages';
15
- import { processErrors } from './utils';
16
- import ErrorTypeRenderer from './ErrorTypeRenderer';
17
- import { ANDROID, GENERIC, IOS } from '../../v2Containers/CreativesContainer/constants';
18
- import { ERROR_TAB_KEYS } from '../HtmlEditor/utils/validationConstants';
19
- import { SEVERITY } from '../HtmlEditor/components/ValidationPanel/constants';
20
- import { LIQUID_DOC_URL } from './constants';
12
+ } from "react-intl";
13
+ import "./style.scss";
14
+ import messages from "./messages";
15
+ import { processErrors } from "./utils";
16
+ import ErrorTypeRenderer from "./ErrorTypeRenderer";
17
+ import { ANDROID, GENERIC, IOS } from "../../v2Containers/CreativesContainer/constants";
21
18
 
22
- const { CapLabelInline } = CapLabel;
23
-
24
- /**
25
- * Group messages into Errors (blocking) and Warnings (non-blocking).
26
- * STANDARD_ERROR_MSG + LIQUID_ERROR_MSG = errors; optional STANDARD_WARNING_MSG = warnings.
27
- */
28
- const groupByErrorsAndWarnings = (standardErrors, liquidErrors, standardWarnings = []) => {
29
- const errors = [];
30
-
31
- (standardErrors || []).forEach((message, index) => {
32
- errors.push({
33
- message,
34
- severity: SEVERITY.ERROR,
35
- index,
36
- source: 'standard',
37
- });
38
- });
39
-
40
- (liquidErrors || []).forEach((message, index) => {
41
- errors.push({
42
- message,
43
- severity: SEVERITY.ERROR,
44
- index,
45
- source: 'liquid',
46
- });
47
- });
48
-
49
- const warnings = (standardWarnings || []).map((message, index) => ({
50
- message,
51
- severity: SEVERITY.WARNING,
52
- index,
53
- source: 'standard',
54
- }));
55
-
56
- return { errors, warnings };
57
- };
58
-
59
- /**
60
- * Clean error message by removing line/char and rule parts
61
- * @param {string} message - Original error message
62
- * @param {RegExpMatchArray|null} lineMatch - Line number match result
63
- * @param {RegExpMatchArray|null} charMatch - Character number match result
64
- * @param {RegExpMatchArray|null} ruleMatch - Rule name match result
65
- * @returns {string} Cleaned message without line/char/rule information
66
- */
67
- const cleanErrorMessage = (message, lineMatch, charMatch, ruleMatch) => {
68
- let displayMessage = message;
69
- if (lineMatch) {
70
- displayMessage = displayMessage.replace(/Line\s+\d+,?\s*/gi, '');
71
- }
72
- if (charMatch) {
73
- displayMessage = displayMessage.replace(/Char\s+\d+\.?\s*/gi, '');
74
- }
75
- if (ruleMatch) {
76
- displayMessage = displayMessage.replace(/•\s*[a-z-]+$/i, '');
77
- }
78
- return displayMessage.trim();
79
- };
80
-
81
- /**
82
- * Tab content component
83
- */
84
- const TabContent = ({ issues, onErrorClick, intl }) => {
85
- if (!issues || issues.length === 0) {
86
- return null;
87
- }
88
-
89
- const handleNavigateClick = (issue, e) => {
90
- e.stopPropagation();
91
- if (onErrorClick) {
92
- onErrorClick(issue);
93
- }
94
- };
95
-
96
- return (
97
- <CapRow className="error-info-note__content">
98
- {issues.map((issue, index) => {
99
- const { severity, message } = issue;
100
- const key = `${message}-${index}`;
101
-
102
- // Parse line and char from message if present (format: "... Line X, Char Y.")
103
- const lineMatch = message.match(/Line\s+(\d+)/i);
104
- const charMatch = message.match(/Char\s+(\d+)/i);
105
- const line = lineMatch ? parseInt(lineMatch[1], 10) : null;
106
- const char = charMatch ? parseInt(charMatch[1], 10) : null;
107
-
108
- // Extract rule from message (format: "... • rule-name")
109
- const ruleMatch = message.match(/•\s*([a-z-]+)$/i);
110
- const rule = ruleMatch ? ruleMatch[1] : null;
111
-
112
- // Clean message (remove line/char and rule parts for display)
113
- const displayMessage = cleanErrorMessage(message, lineMatch, charMatch, ruleMatch);
114
-
115
- return (
116
- <CapRow
117
- key={key}
118
- className={`error-info-note__item error-info-note__item--${severity || 'error'}`}
119
- >
120
- <CapRow className="error-info-note__item-content">
121
- <CapLabelInline type="label2" className="error-info-note__item-message">
122
- {displayMessage}
123
- </CapLabelInline>
124
- {line && (
125
- <CapLabelInline type="label2" className="error-info-note__item-location">
126
- <FormattedMessage {...messages.line} />
127
- {' '}
128
- {line}
129
- {char ? (
130
- <>
131
- ,
132
- {' '}
133
- <FormattedMessage {...messages.char} />
134
- {' '}
135
- {char}
136
- </>
137
- ) : ''}
138
- .
139
- </CapLabelInline>
140
- )}
141
- {rule && (
142
- <CapLabelInline type="label2" className="error-info-note__item-rule">
143
-
144
- {' '}
145
- {rule}
146
- </CapLabelInline>
147
- )}
148
- </CapRow>
149
- {onErrorClick && (
150
- <CapTooltip title={intl?.formatMessage ? intl.formatMessage(messages.navigateToError) : 'Go to error location'}>
151
- <CapButton
152
- type="flat"
153
- className="error-info-note__item-navigate"
154
- onClick={(e) => handleNavigateClick({ ...issue, line, column: char }, e)}
155
- aria-label={intl?.formatMessage ? intl.formatMessage(messages.navigateToError) : 'Go to error location'}
156
- >
157
- <CapIcon type="redirection" />
158
- </CapButton>
159
- </CapTooltip>
160
- )}
161
- </CapRow>
162
- );
163
- })}
164
- </CapRow>
165
- );
166
- };
167
-
168
- TabContent.propTypes = {
169
- issues: PropTypes.array,
170
- onErrorClick: PropTypes.func,
171
- intl: PropTypes.object,
172
- };
173
-
174
- TabContent.defaultProps = {
175
- issues: [],
176
- onErrorClick: null,
177
- intl: null,
178
- };
179
-
180
- /**
181
- * ErrorInfoNote Component with Tabbed Interface
182
- * @param {boolean} useLegacyDisplay - If true, uses simple list display instead of tabbed interface (for BEE Editor)
183
- */
184
- export const ErrorInfoNote = (props) => {
185
- const {
186
- errorMessages,
187
- onErrorClick,
188
- onClose,
189
- isLiquidEnabled = true,
190
- intl,
191
- useLegacyDisplay = false, // Use simple list display instead of tabs (for BEE Editor)
192
- } = props;
193
-
194
- const [isDismissed, setIsDismissed] = useState(false);
195
- const [activeKey, setActiveKey] = useState(null);
196
-
197
- const {
198
- LIQUID_ERROR_MSG: rawLiquidErrors = [],
199
- STANDARD_ERROR_MSG: rawStandardErrors = [],
200
- STANDARD_WARNING_MSG: rawStandardWarnings = [],
201
- } = errorMessages || {};
202
-
203
- // Detect if platform-specific (ANDROID/IOS) or GENERIC
204
- const isObject = typeof rawStandardErrors === 'object' && rawStandardErrors !== null;
205
- const isNotArray = !Array.isArray(rawLiquidErrors);
206
- const hasPlatformKeys = isObject && isNotArray && [ANDROID, IOS, GENERIC].some((key) => key in rawLiquidErrors);
207
-
208
- // For platform-specific errors or when useLegacyDisplay is true, use the legacy renderer
209
- if (hasPlatformKeys) {
210
- // Process errors for both platforms - they use the same structure but different platform parameters
211
- const createPlatformErrors = (platform) => ({
212
- STANDARD: processErrors(rawStandardErrors, 'standard', platform, messages),
213
- LIQUID: processErrors(rawLiquidErrors, 'liquid', platform, messages),
214
- });
215
-
216
- const androidErrors = createPlatformErrors(ANDROID);
217
- const iosErrors = createPlatformErrors(IOS);
218
- return (
219
- <ErrorTypeRenderer
220
- genericErrors={null}
221
- androidErrors={androidErrors}
222
- iosErrors={iosErrors}
223
- ErrorSectionComponent={ErrorSection}
224
- />
225
- );
226
- }
227
-
228
- // For BEE Editor (useLegacyDisplay=true), use simple list display without tabs
229
- if (useLegacyDisplay) {
230
- const standardErrors = Array.isArray(rawStandardErrors) ? rawStandardErrors : [];
231
- const liquidErrors = Array.isArray(rawLiquidErrors) ? rawLiquidErrors : [];
232
- const hasStandardErrors = standardErrors.length > 0;
233
- const hasLiquidErrors = liquidErrors.length > 0 && isLiquidEnabled;
234
-
235
- if (!hasStandardErrors && !hasLiquidErrors) {
236
- return null;
237
- }
238
-
239
- return (
240
- <CapRow className="error-container error-container--legacy">
241
- {hasStandardErrors && (
242
- <ErrorSection
243
- title={<FormattedMessage {...messages.standardErrorHeader} />}
244
- errors={standardErrors}
245
- liquidError={false}
246
- />
247
- )}
248
- {hasLiquidErrors && (
249
- <ErrorSection
250
- title={<FormattedMessage {...messages.dynamicErrorHeader} />}
251
- errors={liquidErrors}
252
- liquidError
253
- />
254
- )}
255
- </CapRow>
256
- );
257
- }
258
-
259
- // Group into Errors (blocking) and Warnings (non-blocking)
260
- const { errors: errorIssues, warnings: warningIssues } = useMemo(() => groupByErrorsAndWarnings(
261
- Array.isArray(rawStandardErrors) ? rawStandardErrors : [],
262
- Array.isArray(rawLiquidErrors) ? rawLiquidErrors : [],
263
- Array.isArray(rawStandardWarnings) ? rawStandardWarnings : [],
264
- ), [rawStandardErrors, rawLiquidErrors, rawStandardWarnings]);
265
-
266
- const errorsCount = errorIssues.length;
267
- const warningsCount = warningIssues.length;
268
- const totalCount = errorsCount + warningsCount;
269
- const hasLiquidErrors = Array.isArray(rawLiquidErrors) && rawLiquidErrors.length > 0;
270
-
271
- // Default active tab: errors if any, else warnings
272
- useEffect(() => {
273
- if (errorsCount > 0) {
274
- setActiveKey(ERROR_TAB_KEYS.ERRORS);
275
- } else if (warningsCount > 0) {
276
- setActiveKey(ERROR_TAB_KEYS.WARNINGS);
277
- }
278
- }, [errorsCount, warningsCount]);
279
-
280
- // Handle close
281
- const handleClose = () => {
282
- setIsDismissed(true);
283
- if (onClose) {
284
- onClose();
285
- }
286
- };
287
-
288
- // Handle liquid documentation click
289
- const handleLiquidDocClick = () => {
290
- window.open(
291
- LIQUID_DOC_URL,
292
- '_blank',
293
- );
294
- };
295
-
296
- // Don't render if no issues or dismissed
297
- if (totalCount === 0 || isDismissed) {
298
- return null;
299
- }
300
-
301
- // Build tab panes: only Errors and Warnings
302
- const tabPanes = [];
303
-
304
- if (errorsCount > 0) {
305
- tabPanes.push({
306
- key: ERROR_TAB_KEYS.ERRORS,
307
- tab: (
308
- <CapLabelInline type="label2" className="error-info-note__tab-label error-info-note__tab-label--errors">
309
- <FormattedMessage {...messages.errors} />
310
- <CapLabelInline type="label2" className="error-info-note__tab-count">
311
- (
312
- {errorsCount}
313
- )
314
- </CapLabelInline>
315
- </CapLabelInline>
316
- ),
317
- content: (
318
- <TabContent
319
- issues={errorIssues}
320
- onErrorClick={onErrorClick}
321
- intl={intl}
322
- />
323
- ),
324
- });
325
- }
326
-
327
- if (warningsCount > 0) {
328
- tabPanes.push({
329
- key: ERROR_TAB_KEYS.WARNINGS,
330
- tab: (
331
- <CapLabelInline type="label2" className="error-info-note__tab-label error-info-note__tab-label--warnings">
332
- <FormattedMessage {...messages.warnings} />
333
- <CapLabelInline type="label2" className="error-info-note__tab-count">
334
- (
335
- {warningsCount}
336
- )
337
- </CapLabelInline>
338
- </CapLabelInline>
339
- ),
340
- content: (
341
- <TabContent
342
- issues={warningIssues}
343
- onErrorClick={onErrorClick}
344
- intl={intl}
345
- />
346
- ),
347
- });
348
- }
349
-
350
- return (
351
- <CapRow className="error-container error-container--tabs">
352
- <CapRow className="error-info-note__header">
353
- <CapTab
354
- activeKey={activeKey || (tabPanes[0]?.key)}
355
- onChange={setActiveKey}
356
- panes={tabPanes}
357
- className="error-info-note__tabs"
358
- />
359
- <CapRow className="error-info-note__actions">
360
- {hasLiquidErrors && isLiquidEnabled && (
361
- <CapButton
362
- type="flat"
363
- className="error-info-note__liquid-doc"
364
- onClick={handleLiquidDocClick}
365
- >
366
- <FormattedMessage {...messages.liquidDoc} />
367
- <CapIcon size="s" type="launch" />
368
- </CapButton>
369
- )}
370
- <CapTooltip title={intl?.formatMessage ? intl.formatMessage(messages.closePanel) : 'Close validation panel'}>
371
- <CapButton
372
- type="flat"
373
- className="error-info-note__close"
374
- onClick={handleClose}
375
- aria-label={intl?.formatMessage ? intl.formatMessage(messages.closePanel) : 'Close validation panel'}
376
- >
377
- <CapIcon type="close" />
378
- </CapButton>
379
- </CapTooltip>
380
- </CapRow>
381
- </CapRow>
382
- </CapRow>
383
- );
384
- };
385
-
386
- // Legacy ErrorSection component for platform-specific errors (backwards compatibility)
387
19
  const ErrorSection = ({
388
20
  title,
389
21
  errors,
@@ -394,7 +26,7 @@ const ErrorSection = ({
394
26
  {title && (
395
27
  <CapRow
396
28
  className={`error-header ${
397
- !liquidError ? 'standard-error-header' : ''
29
+ !liquidError ? "standard-error-header" : ""
398
30
  }`}
399
31
  >
400
32
  <>
@@ -406,7 +38,8 @@ const ErrorSection = ({
406
38
  <CapButton
407
39
  type="flat"
408
40
  className="add-btn"
409
- onClick={() => window.open(LIQUID_DOC_URL, '_blank')}
41
+ onClick={() => window.open("https://docs.capillarytech.com/docs/liquid-language-in-messages", "_blank")
42
+ }
410
43
  >
411
44
  <FormattedMessage {...messages.liquidDoc} />
412
45
  <CapIcon size="s" type="launch" />
@@ -420,15 +53,21 @@ const ErrorSection = ({
420
53
  <CapLabel type="label2">{platformLabel}</CapLabel>
421
54
  </CapRow>
422
55
  )}
423
- <CapRow className="error-list-legacy">
424
- {(errors || []).map((error) => (
425
- <CapRow key={`${error}`} className="error-list-legacy__item">
56
+ <CapList
57
+ className="error-list"
58
+ size="small"
59
+ dataSource={errors}
60
+ renderItem={(error, index) => (
61
+ <CapList.Item>
426
62
  <CapLabel type="label2" className="cap-list-v2-error-item">
63
+ <CapLabel type="label2">
64
+ <FormattedNumber value={index + 1} />.
65
+ </CapLabel>
427
66
  <CapLabel type="label2">{error}</CapLabel>
428
67
  </CapLabel>
429
- </CapRow>
430
- ))}
431
- </CapRow>
68
+ </CapList.Item>
69
+ )}
70
+ />
432
71
  </>
433
72
  );
434
73
 
@@ -445,16 +84,54 @@ ErrorSection.defaultProps = {
445
84
  platformLabel: null,
446
85
  };
447
86
 
87
+ export const ErrorInfoNote = (props) => {
88
+ const { errorMessages } = props;
89
+
90
+ const {
91
+ LIQUID_ERROR_MSG: rawLiquidErrors = [],
92
+ STANDARD_ERROR_MSG: rawStandardErrors = [],
93
+ } = errorMessages || {};
94
+
95
+ // Detect if platform-specific (ANDROID/IOS) or GENERIC
96
+ const isObject = typeof rawStandardErrors === 'object' && rawStandardErrors !== null;
97
+ const isNotArray = !Array.isArray(rawLiquidErrors);
98
+ const hasPlatformKeys = isObject && isNotArray && [ANDROID, IOS, GENERIC].some((key) => key in rawLiquidErrors);
99
+
100
+ if (hasPlatformKeys) {
101
+ // Platform-specific
102
+ const androidErrors = {
103
+ STANDARD: processErrors(rawStandardErrors, 'standard', ANDROID, messages),
104
+ LIQUID: processErrors(rawLiquidErrors, 'liquid', ANDROID, messages),
105
+ };
106
+ const iosErrors = {
107
+ STANDARD: processErrors(rawStandardErrors, 'standard', IOS, messages),
108
+ LIQUID: processErrors(rawLiquidErrors, 'liquid', IOS, messages),
109
+ };
110
+ return (
111
+ <ErrorTypeRenderer
112
+ genericErrors={null}
113
+ androidErrors={androidErrors}
114
+ iosErrors={iosErrors}
115
+ ErrorSectionComponent={ErrorSection}
116
+ />
117
+ );
118
+ }
119
+ // GENERIC (not platform-specific)
120
+ const genericStandard = processErrors(rawStandardErrors, 'standard', null, messages);
121
+ const genericLiquid = processErrors(rawLiquidErrors, 'liquid', null, messages);
122
+ return (
123
+ <ErrorTypeRenderer
124
+ genericErrors={{ standard: genericStandard, liquid: genericLiquid }}
125
+ ErrorSectionComponent={ErrorSection}
126
+ />
127
+ );
128
+ };
129
+
448
130
  ErrorInfoNote.defaultProps = {
449
131
  errorMessages: {
450
132
  LIQUID_ERROR_MSG: [],
451
133
  STANDARD_ERROR_MSG: [],
452
134
  },
453
- onErrorClick: null,
454
- onClose: null,
455
- isLiquidEnabled: true,
456
- intl: null,
457
- useLegacyDisplay: false, // Use simple list display for BEE Editor
458
135
  };
459
136
 
460
137
  ErrorInfoNote.propTypes = {
@@ -475,13 +152,6 @@ ErrorInfoNote.propTypes = {
475
152
  GENERIC: PropTypes.array,
476
153
  }),
477
154
  ]),
478
- STANDARD_WARNING_MSG: PropTypes.array,
479
155
  }),
480
- onErrorClick: PropTypes.func,
481
- onClose: PropTypes.func,
482
- isLiquidEnabled: PropTypes.bool,
483
- intl: PropTypes.object,
484
- useLegacyDisplay: PropTypes.bool, // Use simple list display for BEE Editor
485
156
  };
486
-
487
157
  export default injectIntl(ErrorInfoNote);
@@ -6,24 +6,6 @@
6
6
  import { defineMessages } from "react-intl";
7
7
  const scope = "creatives.componentsV2.ErrorInfoNote";
8
8
  export default defineMessages({
9
- // Tab labels: Errors = blocking, Warnings = non-blocking
10
- errors: {
11
- id: `${scope}.errors`,
12
- defaultMessage: "Errors",
13
- },
14
- warnings: {
15
- id: `${scope}.warnings`,
16
- defaultMessage: "Warnings",
17
- },
18
- navigateToError: {
19
- id: `${scope}.navigateToError`,
20
- defaultMessage: "Go to error location",
21
- },
22
- closePanel: {
23
- id: `${scope}.closePanel`,
24
- defaultMessage: "Close validation panel",
25
- },
26
- // Legacy messages (kept for backwards compatibility)
27
9
  dynamicErrorHeader: {
28
10
  id: `${scope}.dynamicErrorHeader`,
29
11
  defaultMessage:
@@ -42,39 +24,31 @@ export default defineMessages({
42
24
  ariaFooter: {
43
25
  id: `${scope}.ariaFooter`,
44
26
  defaultMessage:
45
- "Aira can make mistakes. Please verify the suggestions before applying them",
27
+ "Aira can make mistakes. Please verify the suggestions before applying them"
46
28
  },
47
29
  liquidDocLink: {
48
30
  id: `${scope}.liquidDocLink`,
49
31
  defaultMessage:
50
- "https://docs.capillarytech.com/docs/liquid-language-in-messages",
32
+ "https://docs.capillarytech.com/docs/liquid-language-in-messages"
51
33
  },
52
34
  androidDynamicErrorHeader: {
53
35
  id: `${scope}.androidDynamicErrorHeader`,
54
36
  defaultMessage:
55
- "Errors found in Android Dynamic Tags",
37
+ "Errors found in Android Dynamic Tags"
56
38
  },
57
39
  iosDynamicErrorHeader: {
58
40
  id: `${scope}.iosDynamicErrorHeader`,
59
41
  defaultMessage:
60
- "Errors found in iOS Dynamic Tags",
42
+ "Errors found in iOS Dynamic Tags"
61
43
  },
62
44
  androidStandardErrorHeader: {
63
45
  id: `${scope}.androidStandardErrorHeader`,
64
46
  defaultMessage:
65
- "Errors found in Android Standard Tags",
47
+ "Errors found in Android Standard Tags"
66
48
  },
67
49
  iosStandardErrorHeader: {
68
50
  id: `${scope}.iosStandardErrorHeader`,
69
51
  defaultMessage:
70
- "Errors found in iOS Standard Tags",
71
- },
72
- line: {
73
- id: `${scope}.line`,
74
- defaultMessage: "Line",
75
- },
76
- char: {
77
- id: `${scope}.char`,
78
- defaultMessage: "Char",
52
+ "Errors found in iOS Standard Tags"
79
53
  },
80
54
  });