@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
@@ -76,7 +76,7 @@ describe('useInAppContent', () => {
76
76
 
77
77
  it('initializes with custom content for Android', () => {
78
78
  const customContent = {
79
- [DEVICE_TYPES.ANDROID]: '<p>Custom Android</p>',
79
+ [DEVICE_TYPES.ANDROID]: '<p>Custom Android</p>'
80
80
  };
81
81
 
82
82
  render(<TestComponent initialContent={customContent} />);
@@ -86,7 +86,7 @@ describe('useInAppContent', () => {
86
86
 
87
87
  it('initializes with custom content for iOS', () => {
88
88
  const customContent = {
89
- [DEVICE_TYPES.IOS]: '<p>Custom iOS</p>',
89
+ [DEVICE_TYPES.IOS]: '<p>Custom iOS</p>'
90
90
  };
91
91
 
92
92
  render(<TestComponent initialContent={customContent} />);
@@ -97,7 +97,7 @@ describe('useInAppContent', () => {
97
97
  it('initializes with custom content for both devices', () => {
98
98
  const customContent = {
99
99
  [DEVICE_TYPES.ANDROID]: '<p>Android</p>',
100
- [DEVICE_TYPES.IOS]: '<p>iOS</p>',
100
+ [DEVICE_TYPES.IOS]: '<p>iOS</p>'
101
101
  };
102
102
 
103
103
  render(<TestComponent initialContent={customContent} />);
@@ -112,10 +112,10 @@ describe('useInAppContent', () => {
112
112
  expect(screen.getByTestId('active-device')).toHaveTextContent(DEVICE_TYPES.ANDROID);
113
113
  });
114
114
 
115
- it('has no content by default (empty strings)', () => {
115
+ it('has content by default', () => {
116
116
  render(<TestComponent />);
117
117
 
118
- expect(screen.getByTestId('has-content')).toHaveTextContent('false');
118
+ expect(screen.getByTestId('has-content')).toHaveTextContent('true');
119
119
  });
120
120
  });
121
121
 
@@ -152,7 +152,7 @@ describe('useInAppContent', () => {
152
152
  it('updates current content when switching devices', () => {
153
153
  const customContent = {
154
154
  [DEVICE_TYPES.ANDROID]: '<p>Android Content</p>',
155
- [DEVICE_TYPES.IOS]: '<p>iOS Content</p>',
155
+ [DEVICE_TYPES.IOS]: '<p>iOS Content</p>'
156
156
  };
157
157
 
158
158
  render(<TestComponent initialContent={customContent} />);
@@ -220,7 +220,7 @@ describe('useInAppContent', () => {
220
220
  it('updates only current device when sync is disabled', () => {
221
221
  const customContent = {
222
222
  [DEVICE_TYPES.ANDROID]: '<p>Android</p>',
223
- [DEVICE_TYPES.IOS]: '<p>iOS</p>',
223
+ [DEVICE_TYPES.IOS]: '<p>iOS</p>'
224
224
  };
225
225
 
226
226
  let inAppState;
@@ -254,7 +254,7 @@ describe('useInAppContent', () => {
254
254
  expect(mockOnChange).toHaveBeenCalled();
255
255
  expect(mockOnChange).toHaveBeenCalledWith(
256
256
  expect.objectContaining({
257
- [DEVICE_TYPES.ANDROID]: '<p>New</p>',
257
+ [DEVICE_TYPES.ANDROID]: '<p>New</p>'
258
258
  }),
259
259
  DEVICE_TYPES.ANDROID
260
260
  );
@@ -294,7 +294,7 @@ describe('useInAppContent', () => {
294
294
  it('syncs content to both devices when sync is enabled', () => {
295
295
  const customContent = {
296
296
  [DEVICE_TYPES.ANDROID]: '<p>Android</p>',
297
- [DEVICE_TYPES.IOS]: '<p>iOS</p>',
297
+ [DEVICE_TYPES.IOS]: '<p>iOS</p>'
298
298
  };
299
299
 
300
300
  render(<TestComponent initialContent={customContent} />);
@@ -457,7 +457,7 @@ describe('useInAppContent', () => {
457
457
  describe('Content Queries', () => {
458
458
  it('reports hasContent as true for non-empty content', () => {
459
459
  const customContent = {
460
- [DEVICE_TYPES.ANDROID]: '<p>Content</p>',
460
+ [DEVICE_TYPES.ANDROID]: '<p>Content</p>'
461
461
  };
462
462
 
463
463
  render(<TestComponent initialContent={customContent} />);
@@ -468,7 +468,7 @@ describe('useInAppContent', () => {
468
468
  it('reports hasContent as false for empty content', () => {
469
469
  const customContent = {
470
470
  [DEVICE_TYPES.ANDROID]: '',
471
- [DEVICE_TYPES.IOS]: '',
471
+ [DEVICE_TYPES.IOS]: ''
472
472
  };
473
473
 
474
474
  let inAppState;
@@ -487,7 +487,7 @@ describe('useInAppContent', () => {
487
487
 
488
488
  it('calculates content size correctly', () => {
489
489
  const customContent = {
490
- [DEVICE_TYPES.ANDROID]: '12345',
490
+ [DEVICE_TYPES.ANDROID]: '12345'
491
491
  };
492
492
 
493
493
  render(<TestComponent initialContent={customContent} />);
@@ -498,7 +498,7 @@ describe('useInAppContent', () => {
498
498
  it('returns 0 size for empty content', () => {
499
499
  const customContent = {
500
500
  [DEVICE_TYPES.ANDROID]: '',
501
- [DEVICE_TYPES.IOS]: '',
501
+ [DEVICE_TYPES.IOS]: ''
502
502
  };
503
503
 
504
504
  let inAppState;
@@ -518,7 +518,7 @@ describe('useInAppContent', () => {
518
518
  it('getDeviceContent returns content for specific device', () => {
519
519
  const customContent = {
520
520
  [DEVICE_TYPES.ANDROID]: '<p>Android</p>',
521
- [DEVICE_TYPES.IOS]: '<p>iOS</p>',
521
+ [DEVICE_TYPES.IOS]: '<p>iOS</p>'
522
522
  };
523
523
 
524
524
  let inAppState;
@@ -655,7 +655,7 @@ describe('useInAppContent', () => {
655
655
  it('handles very large content', () => {
656
656
  const largeContent = 'a'.repeat(100000);
657
657
  const customContent = {
658
- [DEVICE_TYPES.ANDROID]: largeContent,
658
+ [DEVICE_TYPES.ANDROID]: largeContent
659
659
  };
660
660
 
661
661
  let inAppState;
@@ -698,7 +698,7 @@ describe('useInAppContent', () => {
698
698
  it('switches device and updates content', () => {
699
699
  const customContent = {
700
700
  [DEVICE_TYPES.ANDROID]: '<p>Android</p>',
701
- [DEVICE_TYPES.IOS]: '<p>iOS</p>',
701
+ [DEVICE_TYPES.IOS]: '<p>iOS</p>'
702
702
  };
703
703
 
704
704
  let inAppState;
@@ -781,362 +781,5 @@ describe('useInAppContent', () => {
781
781
  expect(mockOnSave).toHaveBeenCalledTimes(1);
782
782
  });
783
783
  });
784
-
785
- describe('setDeviceContent Coverage', () => {
786
- it('sets content for specific device when sync is disabled', () => {
787
- let inAppState;
788
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
789
-
790
- act(() => {
791
- inAppState.setDeviceContent(DEVICE_TYPES.ANDROID, '<p>Android Only</p>');
792
- });
793
-
794
- expect(screen.getByTestId('android-content')).toHaveTextContent('<p>Android Only</p>');
795
- expect(screen.getByTestId('ios-content')).toHaveTextContent('');
796
- });
797
-
798
- it('sets content for both devices when sync is enabled', () => {
799
- let inAppState;
800
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
801
-
802
- // Enable sync first
803
- act(() => {
804
- inAppState.toggleContentSync(true);
805
- });
806
-
807
- // Then set content
808
- act(() => {
809
- inAppState.setDeviceContent(DEVICE_TYPES.ANDROID, '<p>Synced Content</p>');
810
- });
811
-
812
- expect(screen.getByTestId('android-content')).toHaveTextContent('<p>Synced Content</p>');
813
- expect(screen.getByTestId('ios-content')).toHaveTextContent('<p>Synced Content</p>');
814
- });
815
-
816
- it('warns when setting content for invalid device', () => {
817
- const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
818
- let inAppState;
819
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
820
-
821
- act(() => {
822
- inAppState.setDeviceContent('InvalidDevice', '<p>Content</p>');
823
- });
824
-
825
- expect(consoleSpy).toHaveBeenCalledWith(
826
- expect.stringContaining('Invalid device type')
827
- );
828
-
829
- consoleSpy.mockRestore();
830
- });
831
-
832
- it('warns when setting non-string content', () => {
833
- const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
834
- let inAppState;
835
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
836
-
837
- act(() => {
838
- inAppState.setDeviceContent(DEVICE_TYPES.ANDROID, 123);
839
- });
840
-
841
- expect(consoleSpy).toHaveBeenCalledWith(
842
- expect.stringContaining('content must be a string')
843
- );
844
-
845
- consoleSpy.mockRestore();
846
- });
847
- });
848
-
849
- describe('Edge Cases Coverage', () => {
850
- it('handles updateContent with non-string input', () => {
851
- const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
852
- let inAppState;
853
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
854
-
855
- act(() => {
856
- inAppState.updateContent(123);
857
- });
858
-
859
- expect(consoleSpy).toHaveBeenCalledWith(
860
- expect.stringContaining('newContent must be a string')
861
- );
862
-
863
- consoleSpy.mockRestore();
864
- });
865
-
866
- it('handles switchDevice with invalid device type', () => {
867
- const consoleSpy = jest.spyOn(console, 'warn').mockImplementation();
868
- let inAppState;
869
- render(<TestComponent onStateChange={(state) => { inAppState = state; }} />);
870
-
871
- act(() => {
872
- inAppState.switchDevice('InvalidDevice');
873
- });
874
-
875
- expect(consoleSpy).toHaveBeenCalledWith(
876
- expect.stringContaining('Invalid device type')
877
- );
878
-
879
- consoleSpy.mockRestore();
880
- });
881
-
882
- it('handles auto-save with content length below minimum', () => {
883
- const onSave = jest.fn();
884
- let inAppState;
885
- render(
886
- <TestComponent
887
- options={{ autoSave: true, autoSaveInterval: 100, onSave }}
888
- onStateChange={(state) => { inAppState = state; }}
889
- />
890
- );
891
-
892
- act(() => {
893
- inAppState.updateContent(''); // Empty content
894
- });
895
-
896
- act(() => {
897
- jest.advanceTimersByTime(200);
898
- });
899
-
900
- // onSave should not be called for empty content
901
- expect(onSave).not.toHaveBeenCalled();
902
- });
903
-
904
- it('handles auto-save interval below minimum', () => {
905
- const onSave = jest.fn();
906
- let inAppState;
907
- render(
908
- <TestComponent
909
- options={{ autoSave: true, autoSaveInterval: 500, onSave }} // Below 1000ms minimum
910
- onStateChange={(state) => { inAppState = state; }}
911
- />
912
- );
913
-
914
- act(() => {
915
- inAppState.updateContent('<p>Content</p>');
916
- });
917
-
918
- act(() => {
919
- jest.advanceTimersByTime(1000);
920
- });
921
-
922
- // onSave should not be called when interval is below minimum
923
- expect(onSave).not.toHaveBeenCalled();
924
- });
925
- });
926
-
927
- describe('setDeviceContent State Updates (L95-L109)', () => {
928
- it('updates Android content when newAndroidContent differs from current', () => {
929
- // With the fix, initialContent effect only runs on first load or when transitioning from empty to content
930
- // After initial load, changing initialContent won't update content (prevents overriding user edits)
931
- const initialContent = {
932
- [DEVICE_TYPES.ANDROID]: '', // Start with empty
933
- [DEVICE_TYPES.IOS]: '',
934
- };
935
-
936
- const { rerender } = render(
937
- <TestComponent initialContent={initialContent} />
938
- );
939
-
940
- // Initially empty
941
- expect(screen.getByTestId('android-content')).toHaveTextContent('');
942
-
943
- // Transition from empty to meaningful content - this SHOULD update
944
- const updatedContent = {
945
- [DEVICE_TYPES.ANDROID]: 'updated android',
946
- [DEVICE_TYPES.IOS]: '',
947
- };
948
-
949
- rerender(<TestComponent initialContent={updatedContent} />);
950
-
951
- expect(screen.getByTestId('android-content')).toHaveTextContent('updated android');
952
- });
953
-
954
- it('updates iOS content when newIosContent differs from current', () => {
955
- // With the fix, initialContent effect only runs on first load or when transitioning from empty to content
956
- const initialContent = {
957
- [DEVICE_TYPES.ANDROID]: '',
958
- [DEVICE_TYPES.IOS]: '', // Start with empty
959
- };
960
-
961
- const { rerender } = render(
962
- <TestComponent initialContent={initialContent} />
963
- );
964
-
965
- expect(screen.getByTestId('ios-content')).toHaveTextContent('');
966
-
967
- // Transition from empty to meaningful content - this SHOULD update
968
- const updatedContent = {
969
- [DEVICE_TYPES.ANDROID]: '',
970
- [DEVICE_TYPES.IOS]: 'updated ios',
971
- };
972
-
973
- rerender(<TestComponent initialContent={updatedContent} />);
974
-
975
- expect(screen.getByTestId('ios-content')).toHaveTextContent('updated ios');
976
- });
977
-
978
- it('updates both Android and iOS content when both differ', () => {
979
- // With the fix, initialContent effect only runs on first load or when transitioning from empty to content
980
- const initialContent = {
981
- [DEVICE_TYPES.ANDROID]: '',
982
- [DEVICE_TYPES.IOS]: '',
983
- };
984
-
985
- const { rerender } = render(
986
- <TestComponent initialContent={initialContent} />
987
- );
988
-
989
- expect(screen.getByTestId('android-content')).toHaveTextContent('');
990
- expect(screen.getByTestId('ios-content')).toHaveTextContent('');
991
-
992
- // Transition from empty to meaningful content - this SHOULD update
993
- const updatedContent = {
994
- [DEVICE_TYPES.ANDROID]: 'updated android',
995
- [DEVICE_TYPES.IOS]: 'updated ios',
996
- };
997
-
998
- rerender(<TestComponent initialContent={updatedContent} />);
999
-
1000
- expect(screen.getByTestId('android-content')).toHaveTextContent('updated android');
1001
- expect(screen.getByTestId('ios-content')).toHaveTextContent('updated ios');
1002
- });
1003
-
1004
- it('does not update when content is the same', () => {
1005
- const initialContent = {
1006
- [DEVICE_TYPES.ANDROID]: 'same android',
1007
- [DEVICE_TYPES.IOS]: 'same ios',
1008
- };
1009
-
1010
- const { rerender } = render(
1011
- <TestComponent initialContent={initialContent} />
1012
- );
1013
-
1014
- const sameContent = {
1015
- [DEVICE_TYPES.ANDROID]: 'same android',
1016
- [DEVICE_TYPES.IOS]: 'same ios',
1017
- };
1018
-
1019
- rerender(<TestComponent initialContent={sameContent} />);
1020
-
1021
- // Content should remain the same
1022
- expect(screen.getByTestId('android-content')).toHaveTextContent('same android');
1023
- expect(screen.getByTestId('ios-content')).toHaveTextContent('same ios');
1024
- });
1025
-
1026
- it('handles undefined newAndroidContent gracefully', () => {
1027
- // With the fix, after initial load, rerendering with different initialContent won't update
1028
- // This test now verifies that content persists even when initialContent changes
1029
- const initialContent = {
1030
- [DEVICE_TYPES.ANDROID]: 'initial android',
1031
- [DEVICE_TYPES.IOS]: 'initial ios',
1032
- };
1033
-
1034
- const { rerender } = render(
1035
- <TestComponent initialContent={initialContent} />
1036
- );
1037
-
1038
- const updatedContent = {
1039
- [DEVICE_TYPES.IOS]: 'updated ios', // Android is undefined
1040
- };
1041
-
1042
- rerender(<TestComponent initialContent={updatedContent} />);
1043
-
1044
- // With the fix, content should NOT change after initial load (prevents overriding user edits)
1045
- expect(screen.getByTestId('android-content')).toHaveTextContent('initial android');
1046
- expect(screen.getByTestId('ios-content')).toHaveTextContent('initial ios');
1047
- });
1048
-
1049
- it('handles undefined newIosContent gracefully', () => {
1050
- // With the fix, after initial load, rerendering with different initialContent won't update
1051
- const initialContent = {
1052
- [DEVICE_TYPES.ANDROID]: 'initial android',
1053
- [DEVICE_TYPES.IOS]: 'initial ios',
1054
- };
1055
-
1056
- const { rerender } = render(
1057
- <TestComponent initialContent={initialContent} />
1058
- );
1059
-
1060
- const updatedContent = {
1061
- [DEVICE_TYPES.ANDROID]: 'updated android', // iOS is undefined
1062
- };
1063
-
1064
- rerender(<TestComponent initialContent={updatedContent} />);
1065
-
1066
- // With the fix, content should NOT change after initial load (prevents overriding user edits)
1067
- expect(screen.getByTestId('android-content')).toHaveTextContent('initial android');
1068
- expect(screen.getByTestId('ios-content')).toHaveTextContent('initial ios');
1069
- });
1070
-
1071
- it('returns updated content object when changes are made', () => {
1072
- // Test that the transition from empty to content works correctly
1073
- const initialContent = {
1074
- [DEVICE_TYPES.ANDROID]: '',
1075
- [DEVICE_TYPES.IOS]: '',
1076
- };
1077
-
1078
- const { rerender } = render(
1079
- <TestComponent initialContent={initialContent} />
1080
- );
1081
-
1082
- // Transition from empty to content - this SHOULD update
1083
- const updatedContent = {
1084
- [DEVICE_TYPES.ANDROID]: 'updated',
1085
- [DEVICE_TYPES.IOS]: 'updated',
1086
- };
1087
-
1088
- rerender(<TestComponent initialContent={updatedContent} />);
1089
-
1090
- expect(screen.getByTestId('android-content')).toHaveTextContent('updated');
1091
- expect(screen.getByTestId('ios-content')).toHaveTextContent('updated');
1092
- });
1093
-
1094
- it('returns previous content object when no changes', () => {
1095
- const initialContent = {
1096
- [DEVICE_TYPES.ANDROID]: 'same',
1097
- [DEVICE_TYPES.IOS]: 'same',
1098
- };
1099
-
1100
- let firstRender = true;
1101
- let previousState;
1102
-
1103
- const TestObserver = ({ initialContent, onStateChange }) => {
1104
- const inAppState = useInAppContent(initialContent);
1105
-
1106
- React.useEffect(() => {
1107
- if (firstRender) {
1108
- previousState = inAppState.deviceContent;
1109
- firstRender = false;
1110
- } else {
1111
- // Check if object reference is the same
1112
- onStateChange?.(inAppState, previousState);
1113
- }
1114
- });
1115
-
1116
- return (
1117
- <div>
1118
- <div data-testid="android-content">{inAppState.deviceContent[DEVICE_TYPES.ANDROID]}</div>
1119
- <div data-testid="ios-content">{inAppState.deviceContent[DEVICE_TYPES.IOS]}</div>
1120
- </div>
1121
- );
1122
- };
1123
-
1124
- const onStateChange = jest.fn();
1125
- const { rerender } = render(
1126
- <TestObserver initialContent={initialContent} onStateChange={onStateChange} />
1127
- );
1128
-
1129
- const sameContent = {
1130
- [DEVICE_TYPES.ANDROID]: 'same',
1131
- [DEVICE_TYPES.IOS]: 'same',
1132
- };
1133
-
1134
- rerender(<TestObserver initialContent={sameContent} onStateChange={onStateChange} />);
1135
-
1136
- // Content should be the same
1137
- expect(screen.getByTestId('android-content')).toHaveTextContent('same');
1138
- expect(screen.getByTestId('ios-content')).toHaveTextContent('same');
1139
- });
1140
- });
1141
784
  });
1142
785