@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.1

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 (215) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/constants/unified.js +2 -1
  4. package/initialReducer.js +2 -0
  5. package/package.json +1 -1
  6. package/sagas/__tests__/assetPolling.test.js +74 -3
  7. package/sagas/assetPolling.js +8 -1
  8. package/services/api.js +10 -5
  9. package/services/tests/api.test.js +18 -0
  10. package/translations/en.json +0 -1
  11. package/utils/common.js +5 -0
  12. package/utils/commonUtils.js +14 -1
  13. package/utils/tests/commonUtil.test.js +224 -0
  14. package/utils/transformTemplateConfig.js +0 -10
  15. package/utils/transformerUtils.js +0 -42
  16. package/v2Components/CapDeviceContent/index.js +61 -56
  17. package/v2Components/CapImageUpload/constants.js +0 -2
  18. package/v2Components/CapImageUpload/index.js +14 -54
  19. package/v2Components/CapImageUpload/index.scss +1 -4
  20. package/v2Components/CapImageUpload/messages.js +0 -4
  21. package/v2Components/CapTagList/index.js +6 -1
  22. package/v2Components/CapTagListWithInput/index.js +5 -1
  23. package/v2Components/CapTagListWithInput/messages.js +1 -1
  24. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  25. package/v2Components/ErrorInfoNote/index.js +412 -72
  26. package/v2Components/ErrorInfoNote/messages.js +22 -0
  27. package/v2Components/ErrorInfoNote/style.scss +279 -2
  28. package/v2Components/HtmlEditor/HTMLEditor.js +210 -89
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +8 -23
  32. package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
  35. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
  36. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  37. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
  38. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
  39. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  44. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
  45. package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
  46. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  47. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
  49. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
  50. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
  51. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  52. package/v2Components/HtmlEditor/constants.js +29 -20
  53. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  54. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  55. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  56. package/v2Components/HtmlEditor/index.js +1 -1
  57. package/v2Components/HtmlEditor/messages.js +95 -85
  58. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
  59. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  60. package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
  61. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  62. package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
  63. package/v2Components/TemplatePreview/index.js +47 -32
  64. package/v2Components/TemplatePreview/messages.js +4 -0
  65. package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
  66. package/v2Containers/App/constants.js +0 -5
  67. package/v2Containers/BeeEditor/index.js +82 -80
  68. package/v2Containers/BeePopupEditor/constants.js +10 -0
  69. package/v2Containers/BeePopupEditor/index.js +193 -0
  70. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  71. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
  72. package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
  73. package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
  74. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
  75. package/v2Containers/CreativesContainer/constants.js +1 -2
  76. package/v2Containers/CreativesContainer/index.js +173 -193
  77. package/v2Containers/CreativesContainer/messages.js +4 -4
  78. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
  79. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
  80. package/v2Containers/Email/actions.js +7 -0
  81. package/v2Containers/Email/constants.js +5 -1
  82. package/v2Containers/Email/index.js +13 -0
  83. package/v2Containers/Email/messages.js +32 -0
  84. package/v2Containers/Email/reducer.js +12 -1
  85. package/v2Containers/Email/sagas.js +41 -6
  86. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  87. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1045 -0
  88. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
  89. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  90. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  91. package/v2Containers/EmailWrapper/constants.js +2 -0
  92. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
  93. package/v2Containers/EmailWrapper/index.js +99 -23
  94. package/v2Containers/EmailWrapper/messages.js +61 -1
  95. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
  96. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
  97. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  98. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  99. package/v2Containers/InApp/actions.js +7 -0
  100. package/v2Containers/InApp/constants.js +20 -4
  101. package/v2Containers/InApp/index.js +800 -357
  102. package/v2Containers/InApp/index.scss +4 -3
  103. package/v2Containers/InApp/messages.js +7 -3
  104. package/v2Containers/InApp/reducer.js +21 -3
  105. package/v2Containers/InApp/sagas.js +29 -9
  106. package/v2Containers/InApp/selectors.js +25 -5
  107. package/v2Containers/InApp/tests/index.test.js +154 -50
  108. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  109. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  110. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  111. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
  112. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  113. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
  114. package/v2Containers/InAppWrapper/constants.js +16 -0
  115. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  116. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  117. package/v2Containers/InAppWrapper/index.js +148 -0
  118. package/v2Containers/InAppWrapper/messages.js +49 -0
  119. package/v2Containers/InappAdvance/index.js +1099 -0
  120. package/v2Containers/InappAdvance/index.scss +10 -0
  121. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  122. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
  123. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
  124. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
  125. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
  126. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
  127. package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
  128. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
  129. package/v2Containers/TagList/index.js +67 -1
  130. package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
  131. package/v2Containers/Templates/_templates.scss +56 -200
  132. package/v2Containers/Templates/actions.js +1 -2
  133. package/v2Containers/Templates/constants.js +0 -1
  134. package/v2Containers/Templates/index.js +124 -277
  135. package/v2Containers/Templates/messages.js +4 -24
  136. package/v2Containers/Templates/reducer.js +0 -2
  137. package/v2Containers/Templates/tests/index.test.js +0 -10
  138. package/v2Containers/TemplatesV2/index.js +2 -3
  139. package/v2Containers/TemplatesV2/messages.js +0 -4
  140. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
  141. package/v2Components/CapImageUrlUpload/constants.js +0 -19
  142. package/v2Components/CapImageUrlUpload/index.js +0 -455
  143. package/v2Components/CapImageUrlUpload/index.scss +0 -35
  144. package/v2Components/CapImageUrlUpload/messages.js +0 -47
  145. package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
  146. package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
  147. package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
  148. package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
  149. package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
  150. package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
  151. package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
  152. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
  153. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
  154. package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
  155. package/v2Containers/WebPush/Create/index.js +0 -1755
  156. package/v2Containers/WebPush/Create/index.scss +0 -123
  157. package/v2Containers/WebPush/Create/messages.js +0 -199
  158. package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
  159. package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
  160. package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
  161. package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
  162. package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
  163. package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
  164. package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
  165. package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
  166. package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
  167. package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
  168. package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
  169. package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
  170. package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
  171. package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
  172. package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
  173. package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
  174. package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
  175. package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
  176. package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
  177. package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
  178. package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
  179. package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
  180. package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
  181. package/v2Containers/WebPush/Create/preview/constants.js +0 -162
  182. package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
  183. package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
  184. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
  185. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
  186. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
  187. package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
  188. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
  189. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
  190. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
  191. package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
  192. package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
  193. package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
  194. package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
  195. package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
  196. package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
  197. package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
  198. package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
  199. package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
  200. package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
  201. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
  202. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
  203. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
  204. package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
  205. package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
  206. package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
  207. package/v2Containers/WebPush/actions.js +0 -60
  208. package/v2Containers/WebPush/constants.js +0 -108
  209. package/v2Containers/WebPush/index.js +0 -2
  210. package/v2Containers/WebPush/reducer.js +0 -104
  211. package/v2Containers/WebPush/sagas.js +0 -119
  212. package/v2Containers/WebPush/selectors.js +0 -65
  213. package/v2Containers/WebPush/tests/reducer.test.js +0 -863
  214. package/v2Containers/WebPush/tests/sagas.test.js +0 -566
  215. package/v2Containers/WebPush/tests/selectors.test.js +0 -960
@@ -26,8 +26,17 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
26
26
  this.getPreview = this.getPreview.bind(this);
27
27
  this.setContent = this.setContent.bind(this);
28
28
  this.goToDuplicate = this.goToDuplicate.bind(this);
29
- const hasAndroid = get(props, 'templateData.versions.base.ANDROID') || get(props, 'templateData.androidContent.title');
30
- const hasIos = get(props, 'templateData.versions.base.IOS') || get(props, 'templateData.iosContent.title');
29
+ // Check for INAPP channel structure (versions.base.content.ANDROID/IOS) or MOBILE_PUSH structure (versions.base.ANDROID/IOS)
30
+ const { channel, templateData } = props;
31
+ let hasAndroid;
32
+ let hasIos;
33
+ if (channel === INAPP.toUpperCase()) {
34
+ hasAndroid = get(templateData, 'versions.base.content.ANDROID') || get(templateData, 'androidContent');
35
+ hasIos = get(templateData, 'versions.base.content.IOS') || get(templateData, 'iosContent');
36
+ } else {
37
+ hasAndroid = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent.title');
38
+ hasIos = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent.title');
39
+ }
31
40
  let device = "android";
32
41
  if (hasAndroid) {
33
42
  device = 'android';
@@ -45,6 +54,17 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
45
54
  if (channel === INAPP.toUpperCase()) {
46
55
  const androidContent = get(templateData, 'versions.base.content.ANDROID') || get(templateData, 'androidContent');
47
56
  const iosContent = get(templateData, 'versions.base.content.IOS') || get(templateData, 'iosContent');
57
+ const isBeeFreeTemplate = get(androidContent, 'isBEEeditor') || get(iosContent, 'isBEEeditor');
58
+ if (isBeeFreeTemplate) {
59
+ // Normalize device to 'android' or 'ios' for comparison
60
+ const normalizedDevice = device === 'iphone' ? 'ios' : device?.toLowerCase();
61
+ const isAndroid = normalizedDevice === ANDROID.toLowerCase();
62
+ content = {
63
+ inAppPreviewContent: isAndroid ? androidContent?.beeHtml : iosContent?.beeHtml,
64
+ isBeeFreeTemplate: true,
65
+ };
66
+ return content;
67
+ }
48
68
  const androidPreviewContent = {
49
69
  templateTitle: androidContent?.title,
50
70
  templateMsg: androidContent?.message,
@@ -57,9 +77,12 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
57
77
  mediaPreview: { inAppImageSrcIos: iosContent?.expandableDetails?.image },
58
78
  ctaData: getCtaObject(iosContent?.expandableDetails?.ctas),
59
79
  };
80
+ // Normalize device to 'android' or 'ios' for comparison
81
+ const normalizedDevice = device === 'iphone' ? 'ios' : device?.toLowerCase();
82
+ const isAndroid = normalizedDevice === ANDROID.toLowerCase();
60
83
  content = {
61
- inAppPreviewContent: device === ANDROID.toLowerCase() ? androidPreviewContent : iosPreviewContent,
62
- templateLayoutType: device === ANDROID.toLowerCase() ? androidContent?.bodyType : iosContent?.bodyType,
84
+ inAppPreviewContent: isAndroid ? androidPreviewContent : iosPreviewContent,
85
+ templateLayoutType: isAndroid ? androidContent?.bodyType : iosContent?.bodyType,
63
86
  };
64
87
  } else if (channel === MOBILE_PUSH) {
65
88
  const androidContent = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent');
@@ -125,7 +148,9 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
125
148
  }
126
149
 
127
150
  getPreview(device) {
128
- const deviceParam = device === ANDROID.toLowerCase() ? ANDROID : IOS;
151
+ // Normalize device to 'android' or 'ios' for comparison
152
+ const normalizedDevice = device === 'iphone' ? 'ios' : device?.toLowerCase();
153
+ const deviceParam = normalizedDevice === ANDROID.toLowerCase() ? ANDROID : IOS;
129
154
  return (
130
155
  <TemplatePreview
131
156
  device={this.props.channel === INAPP.toUpperCase() ? deviceParam : device}
@@ -159,8 +184,8 @@ class MobilePushPreviewV2 extends React.Component { // eslint-disable-line react
159
184
  hasAndroid = get(templateData, 'versions.base.ANDROID') || get(templateData, 'androidContent.title');
160
185
  hasIos = get(templateData, 'versions.base.IOS') || get(templateData, 'iosContent.title');
161
186
  } else if (this.props.channel === INAPP.toUpperCase()) {
162
- hasAndroid = get(templateData, 'versions.base.content.ANDROID') || get(templateData, 'androidContent.title');
163
- hasIos = get(templateData, 'versions.base.content.IOS') || get(templateData, 'iosContent.title');
187
+ hasAndroid = get(templateData, 'versions.base.content.ANDROID') || get(templateData, 'androidContent');
188
+ hasIos = get(templateData, 'versions.base.content.IOS') || get(templateData, 'iosContent');
164
189
  }
165
190
  const hasBothAndroidAndIos = hasAndroid && hasIos;
166
191
  return (
@@ -16,10 +16,11 @@
16
16
  &.mobilepush
17
17
 
18
18
  .inapp-message-container-POPUP-ANDROID {
19
+ background-color: $CAP_WHITE;
19
20
  position: absolute;
20
- top: 20%;
21
+ top: 30%;
21
22
  display: flex;
22
- width: 200px;
23
+ width: 14.286rem;
23
24
  left: 28%;
24
25
 
25
26
  .inapp-title-POPUP-ANDROID {
@@ -59,10 +60,10 @@
59
60
  .inapp-message-container-HEADER-ANDROID {
60
61
  position: absolute;
61
62
  display: flex;
62
- // bottom: 19.4rem;
63
- width: 200px;
64
- left: 28%;
65
- top: 20px;
63
+ width: 17.571rem;
64
+ left: 18%;
65
+ top: 4.071rem;
66
+ background-color: $CAP_WHITE;
66
67
 
67
68
  .inapp-title-HEADER-ANDROID {
68
69
  left: 34%;
@@ -129,22 +130,24 @@
129
130
 
130
131
 
131
132
  .inapp-message-container-FOOTER-ANDROID {
133
+ background-color: $CAP_WHITE;
132
134
  position: absolute;
133
135
  display: flex;
134
136
  justify-content: center;
135
- bottom: 1.5%;
136
- width: 200px;
137
- left: 28%;
137
+ bottom: 2.5%;
138
+ width: 16.571rem;
139
+ left: 21%;
140
+ background-color: $CAP_WHITE;
138
141
 
139
142
  .inapp-title-FOOTER-ANDROID {
140
- width: 90px;
143
+ width: 6.429rem;
141
144
  height: 12px;
142
145
  text-align: left;
143
146
  left: 34%;
144
147
  justify-content: center;
145
148
  position: relative;
146
149
  right: 33%;
147
- bottom: -22px;
150
+ bottom: -1.429rem;
148
151
  font-size: 10px;
149
152
  text-overflow: ellipsis;
150
153
  overflow: hidden;
@@ -201,10 +204,12 @@
201
204
  }
202
205
 
203
206
  .inapp-message-container-FULLSCREEN-ANDROID {
207
+ background-color: $CAP_WHITE;
204
208
  position: absolute;
205
209
  top: 10%;
206
210
  display: flex;
207
- left: 29%;
211
+ left: 20%;
212
+ width: 16.643rem;
208
213
  .inapp-title-FULLSCREEN-ANDROID {
209
214
  text-overflow: ellipsis;
210
215
  overflow: hidden;
@@ -238,10 +243,11 @@
238
243
  }
239
244
 
240
245
  .inapp-message-container-POPUP-iOS {
246
+ background-color: $CAP_WHITE;
241
247
  position: absolute;
242
- top: 20%;
248
+ top: 30%;
243
249
  display: flex;
244
- width: 200px;
250
+ width: 14.286rem;
245
251
  left: 28%;
246
252
 
247
253
  .inapp-title-POPUP-iOS {
@@ -278,18 +284,19 @@
278
284
  }
279
285
 
280
286
  .inapp-message-container-HEADER-iOS {
287
+ background-color: $CAP_WHITE;
281
288
  position: absolute;
282
289
  display: flex;
283
- width: 200px;
284
- left: 28%;
285
- top: 3%;
290
+ width: 16.571rem;
291
+ left: 20%;
292
+ top: 10%;
286
293
 
287
294
  .inapp-title-HEADER-iOS {
288
295
  left: 34%;
289
296
  top: 15%;
290
297
  position: relative;
291
298
  font-size: 10px;
292
- width: 90px;
299
+ width: 6.429rem;
293
300
  height: 12px;
294
301
  text-overflow: ellipsis;
295
302
  overflow: hidden;
@@ -300,7 +307,7 @@
300
307
 
301
308
  .without-image-title-HEADER-ios {
302
309
  left: 26%;
303
- top: 18px;
310
+ top: 1.286rem;
304
311
  text-align: center;
305
312
  }
306
313
 
@@ -330,7 +337,7 @@
330
337
  .without-image-content-HEADER-ios {
331
338
  width: 92%;
332
339
  left: 6%;
333
- top: 21px;
340
+ top: 1.5rem;
334
341
  }
335
342
 
336
343
  .inapp-button-HEADER-iOS {
@@ -347,12 +354,14 @@
347
354
  }
348
355
 
349
356
  .inapp-message-container-FOOTER-iOS {
357
+ background-color: $CAP_WHITE;
350
358
  position: absolute;
351
359
  display: flex;
352
360
  justify-content: center;
353
- width: 200px;
354
- left: 28%;
355
- top: 75%;
361
+ width: 16.571rem;
362
+ left: 20%;
363
+ top: 42%;
364
+ bottom: 3.5%;
356
365
 
357
366
  .inapp-title-FOOTER-iOS {
358
367
  width: 90px;
@@ -420,10 +429,12 @@
420
429
  }
421
430
 
422
431
  .inapp-message-container-FULLSCREEN-iOS {
432
+ background-color: $CAP_WHITE;
423
433
  position: absolute;
424
434
  top: 10%;
425
435
  display: flex;
426
- left: 29%;
436
+ left: 20%;
437
+ width: 16.643rem;
427
438
  .inapp-title-FULLSCREEN-iOS {
428
439
  text-overflow: ellipsis;
429
440
  overflow: hidden;
@@ -455,6 +466,15 @@
455
466
  bottom: -1%;
456
467
  }
457
468
  }
469
+
470
+ .inapp-message-container-MODAL-ANDROID, .inapp-message-container-MODAL-iOS {
471
+ background-color: $CAP_WHITE;
472
+ position: absolute;
473
+ top: 30%;
474
+ display: flex;
475
+ width: 14.286rem;
476
+ left: 28%;
477
+ }
458
478
  }
459
479
 
460
480
 
@@ -37,14 +37,8 @@ import {
37
37
  import { VIBER, FACEBOOK } from '../../v2Containers/App/constants';
38
38
  import Carousel from '../Carousel';
39
39
  import whatsappMobileAndroid from './assets/images/whatsapp_mobile_android.svg';
40
- import inAppMobileAndroidModal from './assets/images/inapp_mobile_android_modal.svg';
41
- import inAppMobileAndroidTop from './assets/images/inapp_mobile_android_top.svg';
42
- import inAppMobileAndroidBottom from './assets/images/inapp_mobile_android_bottom.svg';
43
- import inAppMobileAndroidFull from './assets/images/inapp_mobile_android_full.svg';
44
- import inAppMobileIOSModal from './assets/images/inapp_mobile_ios_modal.svg';
45
- import inAppMobileIOSTop from './assets/images/inapp_mobile_ios_top.svg';
46
- import inAppMobileIOSBottom from './assets/images/inapp_mobile_ios_bottom.svg';
47
- import inAppMobileIOSFull from './assets/images/inapp_mobile_ios_full.svg';
40
+ import inAppMobileDeviceAndroid from '../../assets/Android.png';
41
+ import inAppMobileDeviceIos from '../../assets/iOS.png';
48
42
  import whatsappImageEmptyPreview from './assets/images/empty_image_preview.svg';
49
43
  import whatsappVideoEmptyPreview from './assets/images/empty_video_preview.svg';
50
44
  import videoPlay from '../../assets/videoPlay.svg';
@@ -239,7 +233,7 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
239
233
  } = this.props;
240
234
  let content = channel && channel.toLowerCase() === 'sms' ? [this.props.content] : this.props.content;
241
235
  const { formatMessage } = intl;
242
- const { rcsPreviewContent, inAppPreviewContent, viberPreviewContent } = content || {};
236
+ const { rcsPreviewContent, inAppPreviewContent, viberPreviewContent, isBeeFreeTemplate } = content || {};
243
237
  const { rcsImageSrc, rcsVideoSrc, rcsTitle, rcsDesc, rcsSuggestions } = rcsPreviewContent || {};
244
238
  const {
245
239
  videoParams,
@@ -247,7 +241,11 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
247
241
  buttonText: viberButtonText,
248
242
  messageContent: viberMessageContent,
249
243
  } = viberPreviewContent || {};
244
+ let isHTMLContent = true;
250
245
  const {mediaPreview = {}, templateTitle = "", templateMsg = "", ctaData} = inAppPreviewContent || {};
246
+ if(templateTitle !== undefined && ctaData !== undefined && templateMsg !== undefined) {
247
+ isHTMLContent = false;
248
+ }
251
249
  let smsDetails = {};
252
250
  // let smsText = '';
253
251
  if (this.props.content && this.props.charCounterEnabled) {
@@ -464,27 +462,9 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
464
462
 
465
463
  const getPreviewImage = () => {
466
464
  if (this.props.device === ANDROID) {
467
- switch (templateLayoutType) {
468
- case INAPP_MESSAGE_LAYOUT_TYPES.MODAL:
469
- return inAppMobileAndroidModal;
470
- case INAPP_MESSAGE_LAYOUT_TYPES.TOPBANNER:
471
- return inAppMobileAndroidTop;
472
- case INAPP_MESSAGE_LAYOUT_TYPES.BOTTOMBANNER:
473
- return inAppMobileAndroidBottom;
474
- default:
475
- return inAppMobileAndroidFull;
476
- }
465
+ return inAppMobileDeviceAndroid;
477
466
  } else {
478
- switch (templateLayoutType) {
479
- case INAPP_MESSAGE_LAYOUT_TYPES.MODAL:
480
- return inAppMobileIOSModal;
481
- case INAPP_MESSAGE_LAYOUT_TYPES.TOPBANNER:
482
- return inAppMobileIOSTop;
483
- case INAPP_MESSAGE_LAYOUT_TYPES.BOTTOMBANNER:
484
- return inAppMobileIOSBottom;
485
- default:
486
- return inAppMobileIOSFull;
487
- }
467
+ return inAppMobileDeviceIos;
488
468
  }
489
469
  };
490
470
 
@@ -1406,7 +1386,34 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
1406
1386
  </div>
1407
1387
  )}
1408
1388
  {channel?.toUpperCase() === INAPP && (
1409
- <div className="shell-v2 align-center">
1389
+ isBeeFreeTemplate ? (
1390
+ <div className="shell-v2 align-center">
1391
+ <div style={{ position: 'relative', display: 'inline-block', width: '100%', height: '100%' }}>
1392
+ <CapImage
1393
+ className="preview-image"
1394
+ src={this.props.device === ANDROID ? inAppMobileDeviceAndroid : inAppMobileDeviceIos}
1395
+ alt={formatMessage(messages.previewGenerated)}
1396
+ />
1397
+ <iframe
1398
+ srcDoc={inAppPreviewContent?.value}
1399
+ title={formatMessage(messages.inappPreview)}
1400
+ style={{
1401
+ position: 'absolute',
1402
+ top: '3rem',
1403
+ left: '5rem',
1404
+ width: '60%',
1405
+ height: '89%',
1406
+ zIndex: 1,
1407
+ pointerEvents: 'none',
1408
+ backgroundColor: 'white',
1409
+ borderRadius: `${CAP_SPACE_08}`,
1410
+ }}
1411
+ frameBorder="0"
1412
+ />
1413
+ </div>
1414
+ </div>
1415
+ ): (
1416
+ <div className="shell-v2 align-center">
1410
1417
  <CapImage
1411
1418
  className="preview-image"
1412
1419
  src={getPreviewImage()}
@@ -1414,9 +1421,15 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
1414
1421
  />
1415
1422
  <div className="preview-image">
1416
1423
  <div
1417
- className={`inapp-message-container-${templateLayoutType}-${device} sms`}
1424
+ className={`inapp-message-container-${templateLayoutType}-${device} inapp`}
1418
1425
  >
1419
- <div className="preview-inapp-screen">
1426
+ {isHTMLContent ? (
1427
+ <div
1428
+ className="inapp-html-content"
1429
+ dangerouslySetInnerHTML={{ __html: templateMsg }}
1430
+ />
1431
+ ) : (
1432
+ <div className="preview-inapp-screen">
1420
1433
  {
1421
1434
  <CapLabel
1422
1435
  type="label15"
@@ -1481,9 +1494,11 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
1481
1494
  </CapButton>
1482
1495
  )}
1483
1496
  </div>
1497
+ )}
1484
1498
  </div>
1485
1499
  </div>
1486
1500
  </div>
1501
+ )
1487
1502
  )}
1488
1503
  </CapRow>
1489
1504
  </CapColumn>
@@ -94,4 +94,8 @@ export default defineMessages({
94
94
  id: 'creatives.componentsV2.TemplatePreview.videoNotSupported',
95
95
  defaultMessage: 'Your browser does not support the video tag.',
96
96
  },
97
+ inappPreview: {
98
+ id: 'creatives.componentsV2.TemplatePreview.inappPreview',
99
+ defaultMessage: 'Inapp Preview',
100
+ },
97
101
  });
@@ -92,9 +92,12 @@ const TestAndPreviewSlidebox = (props) => {
92
92
  const activeTab = currentTabData?.activeTab;
93
93
  const templateContent = currentTabData?.[activeTab]?.['template-content'];
94
94
 
95
- if (templateContent) {
95
+ // Use templateContent or fall back to content prop
96
+ const initialContent = templateContent || content;
97
+
98
+ if (initialContent) {
96
99
  return {
97
- resolvedBody: templateContent,
100
+ resolvedBody: initialContent,
98
101
  resolvedTitle: formData['template-subject'] || ''
99
102
  };
100
103
  }
@@ -112,14 +115,14 @@ const TestAndPreviewSlidebox = (props) => {
112
115
  const resolveTagsInText = (text, tagValues) => {
113
116
  if (!text) return text;
114
117
  let resolvedText = text;
115
-
118
+
116
119
  // Replace each tag with its custom value
117
120
  Object.keys(tagValues).forEach((tagPath) => {
118
121
  const tagName = tagPath.split('.').pop(); // Get the actual tag name from the path
119
122
  const tagRegex = new RegExp(`{{${tagName}}}`, 'g');
120
123
  resolvedText = resolvedText.replace(tagRegex, tagValues[tagPath] || `{{${tagName}}}`);
121
124
  });
122
-
125
+
123
126
  return resolvedText;
124
127
  };
125
128
 
@@ -128,7 +131,7 @@ const TestAndPreviewSlidebox = (props) => {
128
131
  const currentTabData = formData[currentTab - 1];
129
132
  const activeTab = currentTabData?.activeTab;
130
133
  const isDragDrop = currentTabData?.[activeTab]?.is_drag_drop;
131
-
134
+
132
135
  if (isDragDrop && beeContent) {
133
136
  return beeContent; // Use BEE content if available
134
137
  }
@@ -230,7 +233,7 @@ const TestAndPreviewSlidebox = (props) => {
230
233
  actions.extractTagsRequested(formData['template-subject'] || '', payloadContent);
231
234
  }
232
235
  }
233
-
236
+
234
237
  actions.fetchTestCustomersRequested();
235
238
  actions.fetchTestGroupsRequested();
236
239
  }
@@ -242,17 +245,20 @@ const TestAndPreviewSlidebox = (props) => {
242
245
  const activeTab = currentTabData?.activeTab;
243
246
  const isDragDrop = currentTabData?.[activeTab]?.is_drag_drop;
244
247
  const templateContent = currentTabData?.[activeTab]?.['template-content'];
245
-
246
- if (templateContent && templateContent.trim() !== '') {
248
+
249
+ // Fallback to content prop if templateContent is missing (for HTML editor)
250
+ const contentToUse = templateContent || content;
251
+
252
+ if (contentToUse && (typeof contentToUse === 'string' && contentToUse.trim() !== '')) {
247
253
  // Common function to handle content update
248
- const handleContentUpdate = (content) => {
254
+ const handleContentUpdate = (newContent) => {
249
255
  setPreviewDataHtml({
250
- resolvedBody: content,
256
+ resolvedBody: newContent,
251
257
  resolvedTitle: formData['template-subject'] || ''
252
258
  });
253
259
 
254
260
  // Extract tags from content
255
- const payloadContent = convert(content, GLOBAL_CONVERT_OPTIONS);
261
+ const payloadContent = convert(newContent, GLOBAL_CONVERT_OPTIONS);
256
262
  actions.extractTagsRequested(formData['template-subject'] || '', payloadContent);
257
263
  };
258
264
 
@@ -264,13 +270,13 @@ const TestAndPreviewSlidebox = (props) => {
264
270
  handleContentUpdate(templateContent);
265
271
  }
266
272
  } else {
267
- // For CKEditor, only update if content changed
268
- if (templateContent !== previewDataHtml?.resolvedBody) {
269
- handleContentUpdate(templateContent);
273
+ // For CKEditor/HTML, only update if content changed
274
+ if (contentToUse !== previewDataHtml?.resolvedBody) {
275
+ handleContentUpdate(contentToUse);
270
276
  }
271
277
  }
272
278
  }
273
- }, [formData, currentTab]);
279
+ }, [formData, currentTab, content]);
274
280
 
275
281
  // Cleanup effect to reset ref when slidebox closes
276
282
  useEffect(() => {
@@ -366,10 +372,10 @@ const TestAndPreviewSlidebox = (props) => {
366
372
  useEffect(() => {
367
373
  if (selectedCustomer) {
368
374
  setTagsExtracted(true); // Auto-open custom values editor
369
-
375
+
370
376
  // Get all available tags
371
377
  const allTags = [...requiredTags, ...optionalTags];
372
-
378
+
373
379
  if (allTags.length > 0) {
374
380
  const payload = {
375
381
  channel: EMAIL,
@@ -391,7 +397,7 @@ const TestAndPreviewSlidebox = (props) => {
391
397
  updatedValues[tag?.fullPath] = prefilledValues[tag?.fullPath] || '';
392
398
  });
393
399
 
394
-
400
+
395
401
  setCustomValues(updatedValues);
396
402
 
397
403
  // Update preview with prefilled values
@@ -439,10 +445,10 @@ const TestAndPreviewSlidebox = (props) => {
439
445
  setSelectedTestEntities([]);
440
446
  setBeeContent('');
441
447
  previousBeeContentRef.current = '';
442
-
448
+
443
449
  // Clear any pending actions
444
450
  actions.clearPrefilledValues();
445
-
451
+
446
452
  // Call parent's onClose if provided
447
453
  if (onClose) {
448
454
  onClose();
@@ -457,7 +463,7 @@ const TestAndPreviewSlidebox = (props) => {
457
463
  const handleCustomerSelect = (customer) => {
458
464
  setSelectedCustomer(customer);
459
465
  setTagsExtracted(true); // Auto-open custom values editor
460
-
466
+
461
467
  // Clear any existing values while waiting for prefilled values
462
468
  const emptyValues = {};
463
469
  [...requiredTags, ...optionalTags].forEach((tag) => {
@@ -468,7 +474,7 @@ const TestAndPreviewSlidebox = (props) => {
468
474
 
469
475
  const handleClearSelection = () => {
470
476
  setSelectedCustomer(null);
471
-
477
+
472
478
  // Initialize empty values for all tags
473
479
  const emptyValues = {};
474
480
  [...requiredTags, ...optionalTags].forEach((tag) => {
@@ -559,12 +565,12 @@ const TestAndPreviewSlidebox = (props) => {
559
565
  const currentTabData = formData[currentTab - 1];
560
566
  const activeTab = currentTabData?.activeTab;
561
567
  const templateContent = currentTabData?.[activeTab]?.['template-content'];
562
-
568
+
563
569
  // Check for personalization tags (excluding unsubscribe)
564
570
  const content = templateContent || getCurrentContent;
565
571
  const tags = content.match(/{{[^}]+}}/g) || [];
566
572
  const hasPersonalizationTags = tags.some(tag => !tag.includes('unsubscribe'));
567
-
573
+
568
574
  if (!hasPersonalizationTags && tags.length === 1 && tags[0].includes('unsubscribe')) {
569
575
  // If only unsubscribe tag is present, show noTagsExtracted message
570
576
  setTagsExtracted(false);
@@ -573,7 +579,7 @@ const TestAndPreviewSlidebox = (props) => {
573
579
  setCustomValues({});
574
580
  return;
575
581
  }
576
-
582
+
577
583
  // Extract tags
578
584
  setTagsExtracted(true);
579
585
  if (templateContent) {
@@ -40,7 +40,6 @@ export const TRACK_CREATE_IMAGE = 'createImage';
40
40
  export const TRACK_CREATE_LINE = 'createLine';
41
41
  export const TRACK_CREATE_VIBER = 'createViber';
42
42
  export const TRACK_CREATE_FACEBOOK = 'createFacebook';
43
- export const TRACK_CREATE_WEBPUSH = 'createWebPush';
44
43
 
45
44
  export const CREATE = 'create';
46
45
  export const EDIT = 'edit';
@@ -55,7 +54,6 @@ export const EMAIL = 'email';
55
54
  export const ASSETS = 'assets';
56
55
  export const ZALO = 'zalo';
57
56
  export const INAPP = 'inapp';
58
- export const WEBPUSH = 'webpush';
59
57
 
60
58
  export const JP_LOCALE_HIDE_FEATURE = 'JP_LOCALE_HIDE_FEATURE';
61
59
 
@@ -67,7 +65,6 @@ export const TRACK_EDIT_IMAGE = 'editImage';
67
65
  export const TRACK_EDIT_LINE = 'editLine';
68
66
  export const TRACK_EDIT_VIBER = 'editViber';
69
67
  export const TRACK_EDIT_FACEBOOK = 'editFacebook';
70
- export const TRACK_EDIT_WEBPUSH = 'editWebPush';
71
68
 
72
69
  export const CHANNEL_CREATE_TRACK_MAPPING = {
73
70
  sms: TRACK_CREATE_SMS,
@@ -78,7 +75,6 @@ export const CHANNEL_CREATE_TRACK_MAPPING = {
78
75
  line: TRACK_CREATE_LINE,
79
76
  viber: TRACK_CREATE_VIBER,
80
77
  facebook: TRACK_CREATE_FACEBOOK,
81
- webpush: TRACK_CREATE_WEBPUSH,
82
78
  };
83
79
 
84
80
  export const CHANNEL_EDIT_TRACK_MAPPING = {
@@ -90,7 +86,6 @@ export const CHANNEL_EDIT_TRACK_MAPPING = {
90
86
  line: TRACK_EDIT_LINE,
91
87
  viber: TRACK_EDIT_VIBER,
92
88
  facebook: TRACK_EDIT_FACEBOOK,
93
- webpush: TRACK_EDIT_WEBPUSH,
94
89
  };
95
90
  export const GTM_TRACKING_ID = 'UA-110024621-2';
96
91
  export const BEE_PLUGIN = 'BEE_PLUGIN';