@capillarytech/creatives-library 8.0.235 → 8.0.236-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 (86) hide show
  1. package/assets/Android.png +0 -0
  2. package/assets/iOS.png +0 -0
  3. package/config/app.js +0 -1
  4. package/constants/unified.js +1 -1
  5. package/initialReducer.js +2 -0
  6. package/package.json +1 -1
  7. package/services/api.js +5 -2
  8. package/services/tests/api.test.js +18 -0
  9. package/utils/common.js +1 -2
  10. package/utils/commonUtils.js +14 -1
  11. package/utils/transformTemplateConfig.js +0 -10
  12. package/v2Components/CapDeviceContent/index.js +61 -56
  13. package/v2Components/CapTagList/index.js +4 -0
  14. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  15. package/v2Components/HtmlEditor/HTMLEditor.js +165 -80
  16. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +532 -0
  17. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
  18. package/v2Components/HtmlEditor/_htmlEditor.scss +0 -4
  19. package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
  20. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +0 -98
  21. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +125 -148
  22. package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -0
  23. package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
  24. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  25. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  26. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  27. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  28. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  29. package/v2Components/HtmlEditor/constants.js +29 -20
  30. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +158 -17
  31. package/v2Components/HtmlEditor/hooks/useInAppContent.js +53 -143
  32. package/v2Components/HtmlEditor/index.js +1 -1
  33. package/v2Components/HtmlEditor/messages.js +85 -85
  34. package/v2Components/MobilePushPreviewV2/index.js +32 -7
  35. package/v2Components/TemplatePreview/_templatePreview.scss +31 -21
  36. package/v2Components/TemplatePreview/index.js +47 -32
  37. package/v2Components/TemplatePreview/messages.js +4 -0
  38. package/v2Containers/BeeEditor/index.js +82 -80
  39. package/v2Containers/BeePopupEditor/constants.js +10 -0
  40. package/v2Containers/BeePopupEditor/index.js +180 -0
  41. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  42. package/v2Containers/CreativesContainer/SlideBoxContent.js +69 -34
  43. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -1
  44. package/v2Containers/CreativesContainer/constants.js +1 -0
  45. package/v2Containers/CreativesContainer/index.js +65 -13
  46. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +4 -12
  47. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -0
  48. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  49. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  50. package/v2Containers/InApp/actions.js +7 -0
  51. package/v2Containers/InApp/constants.js +18 -4
  52. package/v2Containers/InApp/index.js +642 -355
  53. package/v2Containers/InApp/index.scss +4 -3
  54. package/v2Containers/InApp/messages.js +7 -3
  55. package/v2Containers/InApp/reducer.js +21 -3
  56. package/v2Containers/InApp/sagas.js +29 -9
  57. package/v2Containers/InApp/selectors.js +25 -5
  58. package/v2Containers/InApp/tests/index.test.js +154 -50
  59. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  60. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  61. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  62. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
  63. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  64. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
  65. package/v2Containers/InAppWrapper/constants.js +16 -0
  66. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  67. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  68. package/v2Containers/InAppWrapper/index.js +148 -0
  69. package/v2Containers/InAppWrapper/messages.js +49 -0
  70. package/v2Containers/InappAdvance/index.js +1006 -0
  71. package/v2Containers/InappAdvance/index.scss +10 -0
  72. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  73. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
  74. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
  75. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
  76. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
  77. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -0
  78. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
  79. package/v2Containers/TagList/index.js +65 -1
  80. package/v2Containers/Templates/_templates.scss +49 -1
  81. package/v2Containers/Templates/index.js +93 -5
  82. package/v2Containers/Templates/messages.js +4 -0
  83. package/v2Containers/Templates/reducer.js +20 -7
  84. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +8 -88
  85. package/v2Containers/Templates/tests/reducer.test.js +125 -0
  86. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -0
@@ -13,321 +13,321 @@ export default defineMessages({
13
13
  // Main component messages
14
14
  initializing: {
15
15
  id: `${scope}.initializing`,
16
- defaultMessage: 'Initializing HTML Editor...'
16
+ defaultMessage: 'Initializing HTML Editor...',
17
17
  },
18
18
 
19
19
  // Label insertion messages
20
20
  addLabel: {
21
21
  id: `${scope}.addLabel`,
22
- defaultMessage: 'Add label'
22
+ defaultMessage: 'Add label',
23
23
  },
24
24
  labelInserted: {
25
25
  id: `${scope}.labelInserted`,
26
- defaultMessage: 'Label inserted successfully'
26
+ defaultMessage: 'Label inserted successfully',
27
27
  },
28
28
  labelInsertedDescription: {
29
29
  id: `${scope}.labelInsertedDescription`,
30
- defaultMessage: 'The label "{label}" has been inserted at the cursor position'
30
+ defaultMessage: 'The label "{label}" has been inserted at the cursor position',
31
31
  },
32
32
  labelInsertError: {
33
33
  id: `${scope}.labelInsertError`,
34
- defaultMessage: 'Failed to insert label'
34
+ defaultMessage: 'Failed to insert label',
35
35
  },
36
36
  editorNotReady: {
37
37
  id: `${scope}.editorNotReady`,
38
- defaultMessage: 'Editor is not ready. Please try again.'
38
+ defaultMessage: 'Editor is not ready. Please try again.',
39
39
  },
40
40
  editorMethodNotAvailable: {
41
41
  id: `${scope}.editorMethodNotAvailable`,
42
- defaultMessage: 'Editor method not available. Please refresh and try again.'
42
+ defaultMessage: 'Editor method not available. Please refresh and try again.',
43
43
  },
44
44
 
45
45
  // Save messages
46
46
  contentSaved: {
47
47
  id: `${scope}.contentSaved`,
48
- defaultMessage: 'Content saved successfully'
48
+ defaultMessage: 'Content saved successfully',
49
49
  },
50
50
  saveError: {
51
51
  id: `${scope}.saveError`,
52
- defaultMessage: 'Failed to save content'
52
+ defaultMessage: 'Failed to save content',
53
53
  },
54
54
  autoSaveEnabled: {
55
55
  id: `${scope}.autoSaveEnabled`,
56
- defaultMessage: 'Auto-save is enabled'
56
+ defaultMessage: 'Auto-save is enabled',
57
57
  },
58
58
  autoSaveDisabled: {
59
59
  id: `${scope}.autoSaveDisabled`,
60
- defaultMessage: 'Auto-save is disabled'
60
+ defaultMessage: 'Auto-save is disabled',
61
61
  },
62
62
 
63
63
  // Editor toolbar messages
64
64
  htmlEditor: {
65
65
  id: `${scope}.htmlEditor`,
66
- defaultMessage: 'Email content'
66
+ defaultMessage: 'Email content',
67
67
  },
68
68
  desktop: {
69
69
  id: `${scope}.desktop`,
70
- defaultMessage: 'Desktop'
70
+ defaultMessage: 'Desktop',
71
71
  },
72
72
  mobile: {
73
73
  id: `${scope}.mobile`,
74
- defaultMessage: 'Mobile'
74
+ defaultMessage: 'Mobile',
75
75
  },
76
76
  mobileDevice: {
77
77
  id: `${scope}.mobileDevice`,
78
- defaultMessage: 'Mobile Device'
78
+ defaultMessage: 'Mobile Device',
79
79
  },
80
80
  htmlPreview: {
81
81
  id: `${scope}.htmlPreview`,
82
- defaultMessage: 'HTML Preview'
82
+ defaultMessage: 'HTML Preview',
83
83
  },
84
84
  startTypingHtml: {
85
85
  id: `${scope}.startTypingHtml`,
86
- defaultMessage: 'Start typing HTML to see the preview'
86
+ defaultMessage: 'Start typing HTML to see the preview',
87
87
  },
88
88
  previewMode: {
89
89
  id: `${scope}.previewMode`,
90
- defaultMessage: 'Preview Mode'
90
+ defaultMessage: 'Preview Mode',
91
91
  },
92
92
  fullscreen: {
93
93
  id: `${scope}.fullscreen`,
94
- defaultMessage: 'Fullscreen'
94
+ defaultMessage: 'Fullscreen',
95
95
  },
96
96
  enterFullscreen: {
97
97
  id: `${scope}.enterFullscreen`,
98
- defaultMessage: 'Enter Fullscreen'
98
+ defaultMessage: 'Enter Fullscreen',
99
99
  },
100
100
  exitFullscreen: {
101
101
  id: `${scope}.exitFullscreen`,
102
- defaultMessage: 'Exit Fullscreen'
102
+ defaultMessage: 'Exit Fullscreen',
103
103
  },
104
104
  save: {
105
105
  id: `${scope}.save`,
106
- defaultMessage: 'Save'
106
+ defaultMessage: 'Save',
107
107
  },
108
108
 
109
109
  // Editor tabs messages
110
110
  htmlTab: {
111
111
  id: `${scope}.htmlTab`,
112
- defaultMessage: 'HTML'
112
+ defaultMessage: 'HTML',
113
113
  },
114
114
  cssTab: {
115
115
  id: `${scope}.cssTab`,
116
- defaultMessage: 'CSS'
116
+ defaultMessage: 'CSS',
117
117
  },
118
118
  javascriptTab: {
119
119
  id: `${scope}.javascriptTab`,
120
- defaultMessage: 'JavaScript'
120
+ defaultMessage: 'JavaScript',
121
121
  },
122
122
 
123
123
  // Preview messages
124
124
  previewTitle: {
125
125
  id: `${scope}.previewTitle`,
126
- defaultMessage: 'Preview'
126
+ defaultMessage: 'Preview',
127
127
  },
128
128
  previewLoading: {
129
129
  id: `${scope}.previewLoading`,
130
- defaultMessage: 'Loading preview...'
130
+ defaultMessage: 'Loading preview...',
131
131
  },
132
132
  previewError: {
133
133
  id: `${scope}.previewError`,
134
- defaultMessage: 'Preview error'
134
+ defaultMessage: 'Preview error',
135
135
  },
136
136
  previewEmpty: {
137
137
  id: `${scope}.previewEmpty`,
138
- defaultMessage: 'Start typing HTML to see the preview'
138
+ defaultMessage: 'Start typing HTML to see the preview',
139
139
  },
140
140
  refreshPreview: {
141
141
  id: `${scope}.refreshPreview`,
142
- defaultMessage: 'Refresh Preview'
142
+ defaultMessage: 'Refresh Preview',
143
143
  },
144
144
 
145
145
  // Mobile device preview messages
146
146
  android: {
147
147
  id: `${scope}.android`,
148
- defaultMessage: 'Android'
148
+ defaultMessage: 'Android',
149
149
  },
150
150
  ios: {
151
151
  id: `${scope}.ios`,
152
- defaultMessage: 'iOS'
152
+ defaultMessage: 'iOS',
153
153
  },
154
154
  devicePreview: {
155
155
  id: `${scope}.devicePreview`,
156
- defaultMessage: 'Device Preview'
156
+ defaultMessage: 'Device Preview',
157
157
  },
158
158
 
159
159
  // InApp variant messages
160
160
  inAppEditor: {
161
161
  id: `${scope}.inAppEditor`,
162
- defaultMessage: 'In-app content'
162
+ defaultMessage: 'In-app content',
163
163
  },
164
164
  keepContentSameForBoth: {
165
165
  id: `${scope}.keepContentSameForBoth`,
166
- defaultMessage: 'Keep content same for both'
166
+ defaultMessage: 'Keep content same for both',
167
167
  },
168
168
 
169
169
  // Validation messages
170
170
  validationErrors: {
171
171
  id: `${scope}.validationErrors`,
172
- defaultMessage: '{count} validation {count, plural, one {error} other {errors}}'
172
+ defaultMessage: '{count} validation {count, plural, one {error} other {errors}}',
173
173
  },
174
174
  validationWarnings: {
175
175
  id: `${scope}.validationWarnings`,
176
- defaultMessage: '{count} validation {count, plural, one {warning} other {warnings}}'
176
+ defaultMessage: '{count} validation {count, plural, one {warning} other {warnings}}',
177
177
  },
178
178
  noValidationIssues: {
179
179
  id: `${scope}.noValidationIssues`,
180
- defaultMessage: 'No validation issues'
180
+ defaultMessage: 'No validation issues',
181
181
  },
182
182
  showProblems: {
183
183
  id: `${scope}.showProblems`,
184
- defaultMessage: 'Show Problems'
184
+ defaultMessage: 'Show Problems',
185
185
  },
186
186
  hideProblems: {
187
187
  id: `${scope}.hideProblems`,
188
- defaultMessage: 'Hide Problems'
188
+ defaultMessage: 'Hide Problems',
189
189
  },
190
190
 
191
191
  // Error messages
192
192
  securityError: {
193
193
  id: `${scope}.securityError`,
194
- defaultMessage: 'Security Error'
194
+ defaultMessage: 'Security Error',
195
195
  },
196
196
  runtimeError: {
197
197
  id: `${scope}.runtimeError`,
198
- defaultMessage: 'Runtime Error'
198
+ defaultMessage: 'Runtime Error',
199
199
  },
200
200
  renderError: {
201
201
  id: `${scope}.renderError`,
202
- defaultMessage: 'Render Error'
202
+ defaultMessage: 'Render Error',
203
203
  },
204
204
  clearErrors: {
205
205
  id: `${scope}.clearErrors`,
206
- defaultMessage: 'Clear Errors'
206
+ defaultMessage: 'Clear Errors',
207
207
  },
208
208
  copyError: {
209
209
  id: `${scope}.copyError`,
210
- defaultMessage: 'Copy Error Details'
210
+ defaultMessage: 'Copy Error Details',
211
211
  },
212
212
  errorCopied: {
213
213
  id: `${scope}.errorCopied`,
214
- defaultMessage: 'Error details copied to clipboard'
214
+ defaultMessage: 'Error details copied to clipboard',
215
215
  },
216
216
 
217
217
  // Accessibility messages
218
218
  codeEditor: {
219
219
  id: `${scope}.codeEditor`,
220
- defaultMessage: 'Email Editor'
220
+ defaultMessage: 'Email Editor',
221
221
  },
222
222
  previewPanel: {
223
223
  id: `${scope}.previewPanel`,
224
- defaultMessage: 'Preview Panel'
224
+ defaultMessage: 'Preview Panel',
225
225
  },
226
226
  resizeHandle: {
227
227
  id: `${scope}.resizeHandle`,
228
- defaultMessage: 'Drag to resize panels'
228
+ defaultMessage: 'Drag to resize panels',
229
229
  },
230
230
  splitPanels: {
231
231
  id: `${scope}.splitPanels`,
232
- defaultMessage: 'Split panels - code editor and preview'
232
+ defaultMessage: 'Split panels - code editor and preview',
233
233
  },
234
234
 
235
235
  // Performance messages
236
236
  optimizing: {
237
237
  id: `${scope}.optimizing`,
238
- defaultMessage: 'Optimizing performance...'
238
+ defaultMessage: 'Optimizing performance...',
239
239
  },
240
240
  performanceWarning: {
241
241
  id: `${scope}.performanceWarning`,
242
- defaultMessage: 'Large content detected. Performance may be affected.'
242
+ defaultMessage: 'Large content detected. Performance may be affected.',
243
243
  },
244
244
 
245
245
  // Feature messages
246
246
  autoSave: {
247
247
  id: `${scope}.autoSave`,
248
- defaultMessage: 'Auto-save'
248
+ defaultMessage: 'Auto-save',
249
249
  },
250
250
  lastSaved: {
251
251
  id: `${scope}.lastSaved`,
252
- defaultMessage: 'Last saved: {time}'
252
+ defaultMessage: 'Last saved: {time}',
253
253
  },
254
254
  unsavedChanges: {
255
255
  id: `${scope}.unsavedChanges`,
256
- defaultMessage: 'You have unsaved changes'
256
+ defaultMessage: 'You have unsaved changes',
257
257
  },
258
258
 
259
259
  // Content Sanitizer messages
260
260
  sanitizer: {
261
261
  invalidInput: {
262
262
  id: `${scope}.sanitizer.invalidInput`,
263
- defaultMessage: 'Invalid input: HTML content must be a string'
263
+ defaultMessage: 'Invalid input: HTML content must be a string',
264
264
  },
265
265
  invalidInputNonEmpty: {
266
266
  id: `${scope}.sanitizer.invalidInputNonEmpty`,
267
- defaultMessage: 'Invalid input: HTML content must be a non-empty string'
267
+ defaultMessage: 'Invalid input: HTML content must be a non-empty string',
268
268
  },
269
269
  sanitizationFailed: {
270
270
  id: `${scope}.sanitizer.sanitizationFailed`,
271
- defaultMessage: 'Sanitization failed: {error}'
271
+ defaultMessage: 'Sanitization failed: {error}',
272
272
  },
273
273
  dangerousProtocolDetected: {
274
274
  id: `${scope}.sanitizer.dangerousProtocolDetected`,
275
- defaultMessage: 'Dangerous protocol detected'
275
+ defaultMessage: 'Dangerous protocol detected',
276
276
  },
277
277
 
278
278
  // Email compatibility warnings
279
279
  emailMultimediaNotSupported: {
280
280
  id: `${scope}.sanitizer.emailMultimediaNotSupported`,
281
- defaultMessage: 'Video/audio/canvas elements may not be supported in email clients'
281
+ defaultMessage: 'Video/audio/canvas elements may not be supported in email clients',
282
282
  },
283
283
  emailPositioningNotSupported: {
284
284
  id: `${scope}.sanitizer.emailPositioningNotSupported`,
285
- defaultMessage: 'Fixed/sticky positioning may not work in email clients'
285
+ defaultMessage: 'Fixed/sticky positioning may not work in email clients',
286
286
  },
287
287
  emailModernCssLimited: {
288
288
  id: `${scope}.sanitizer.emailModernCssLimited`,
289
- defaultMessage: 'CSS Grid and Flexbox have limited support in email clients'
289
+ defaultMessage: 'CSS Grid and Flexbox have limited support in email clients',
290
290
  },
291
291
  emailViewportUnitsNotSupported: {
292
292
  id: `${scope}.sanitizer.emailViewportUnitsNotSupported`,
293
- defaultMessage: 'Viewport units and rem may not be supported in all email clients'
293
+ defaultMessage: 'Viewport units and rem may not be supported in all email clients',
294
294
  },
295
295
 
296
296
  // Mobile optimization warnings
297
297
  mobileTablesNotFriendly: {
298
298
  id: `${scope}.sanitizer.mobileTablesNotFriendly`,
299
- defaultMessage: 'Tables may not be mobile-friendly - consider using flexbox or grid'
299
+ defaultMessage: 'Tables may not be mobile-friendly - consider using flexbox or grid',
300
300
  },
301
301
  mobileRelativeFontSizes: {
302
302
  id: `${scope}.sanitizer.mobileRelativeFontSizes`,
303
- defaultMessage: 'Consider using relative font sizes (em, rem, %) for better mobile scaling'
303
+ defaultMessage: 'Consider using relative font sizes (em, rem, %) for better mobile scaling',
304
304
  },
305
305
  mobileFixedWidthsProblematic: {
306
306
  id: `${scope}.sanitizer.mobileFixedWidthsProblematic`,
307
- defaultMessage: 'Large fixed widths may not work well on mobile devices'
307
+ defaultMessage: 'Large fixed widths may not work well on mobile devices',
308
308
  },
309
309
  mobileRelativeUnits: {
310
310
  id: `${scope}.sanitizer.mobileRelativeUnits`,
311
- defaultMessage: 'Consider using relative units (rem, em, %) for better mobile responsiveness'
311
+ defaultMessage: 'Consider using relative units (rem, em, %) for better mobile responsiveness',
312
312
  },
313
313
 
314
314
  // Production recommendations
315
315
  productionValidHtml: {
316
316
  id: `${scope}.sanitizer.productionValidHtml`,
317
- defaultMessage: 'Provide valid HTML content before deploying to production'
317
+ defaultMessage: 'Provide valid HTML content before deploying to production',
318
318
  },
319
319
  productionSanitized: {
320
320
  id: `${scope}.sanitizer.productionSanitized`,
321
- defaultMessage: 'Content has been sanitized for security - review changes before deploying'
321
+ defaultMessage: 'Content has been sanitized for security - review changes before deploying',
322
322
  },
323
323
  productionInlineCss: {
324
324
  id: `${scope}.sanitizer.productionInlineCss`,
325
- defaultMessage: 'Consider inlining CSS for better email client compatibility'
325
+ defaultMessage: 'Consider inlining CSS for better email client compatibility',
326
326
  },
327
327
  productionLargeContent: {
328
328
  id: `${scope}.sanitizer.productionLargeContent`,
329
- defaultMessage: 'Content is large ({size} characters) - consider optimizing for mobile performance'
330
- }
329
+ defaultMessage: 'Content is large ({size} characters) - consider optimizing for mobile performance',
330
+ },
331
331
  },
332
332
 
333
333
  // HTML Validator messages
@@ -335,55 +335,55 @@ export default defineMessages({
335
335
  // General validation messages
336
336
  validationFailed: {
337
337
  id: `${scope}.validator.validationFailed`,
338
- defaultMessage: 'Validation failed: {error}'
338
+ defaultMessage: 'Validation failed: {error}',
339
339
  },
340
340
  liquidValidationFailed: {
341
341
  id: `${scope}.validator.liquidValidationFailed`,
342
- defaultMessage: 'Liquid validation failed'
342
+ defaultMessage: 'Liquid validation failed',
343
343
  },
344
344
 
345
345
  // Security validation messages
346
346
  unsafeProtocolDetected: {
347
347
  id: `${scope}.validator.unsafeProtocolDetected`,
348
- defaultMessage: 'Potentially unsafe protocol detected: {protocol}'
348
+ defaultMessage: 'Potentially unsafe protocol detected: {protocol}',
349
349
  },
350
350
  scriptTagsDetected: {
351
351
  id: `${scope}.validator.scriptTagsDetected`,
352
- defaultMessage: 'Script tags detected - may be filtered in production'
352
+ defaultMessage: 'Script tags detected - may be filtered in production',
353
353
  },
354
354
 
355
355
  // Email-specific validation messages
356
356
  outlookIncompatible: {
357
357
  id: `${scope}.validator.outlookIncompatible`,
358
- defaultMessage: 'Element may not be supported in Outlook: {element}'
358
+ defaultMessage: 'Element may not be supported in Outlook: {element}',
359
359
  },
360
360
  emailCssUnsupported: {
361
361
  id: `${scope}.validator.emailCssUnsupported`,
362
- defaultMessage: 'CSS feature may not be supported in email clients'
362
+ defaultMessage: 'CSS feature may not be supported in email clients',
363
363
  },
364
364
 
365
365
  // Mobile/InApp validation messages
366
366
  mobileIncompatible: {
367
367
  id: `${scope}.validator.mobileIncompatible`,
368
- defaultMessage: 'Element may not be supported on mobile: {element}'
368
+ defaultMessage: 'Element may not be supported on mobile: {element}',
369
369
  },
370
370
  largeImageDetected: {
371
371
  id: `${scope}.validator.largeImageDetected`,
372
- defaultMessage: 'Large image dimensions detected - consider mobile optimization'
372
+ defaultMessage: 'Large image dimensions detected - consider mobile optimization',
373
373
  },
374
374
 
375
375
  // CSS validation messages
376
376
  unclosedCssRule: {
377
377
  id: `${scope}.validator.unclosedCssRule`,
378
- defaultMessage: 'Unclosed CSS rule detected'
378
+ defaultMessage: 'Unclosed CSS rule detected',
379
379
  },
380
380
  emptyCssRule: {
381
381
  id: `${scope}.validator.emptyCssRule`,
382
- defaultMessage: 'Empty CSS rule detected'
382
+ defaultMessage: 'Empty CSS rule detected',
383
383
  },
384
384
  cssValidationFailed: {
385
385
  id: `${scope}.validator.cssValidationFailed`,
386
- defaultMessage: 'CSS validation failed: {error}'
387
- }
388
- }
386
+ defaultMessage: 'CSS validation failed: {error}',
387
+ },
388
+ },
389
389
  });
@@ -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 (
@@ -59,10 +59,9 @@
59
59
  .inapp-message-container-HEADER-ANDROID {
60
60
  position: absolute;
61
61
  display: flex;
62
- // bottom: 19.4rem;
63
- width: 200px;
64
- left: 28%;
65
- top: 20px;
62
+ width: 17.571rem;
63
+ left: 18%;
64
+ top: 4.071rem;
66
65
 
67
66
  .inapp-title-HEADER-ANDROID {
68
67
  left: 34%;
@@ -132,19 +131,20 @@
132
131
  position: absolute;
133
132
  display: flex;
134
133
  justify-content: center;
135
- bottom: 1.5%;
136
- width: 200px;
137
- left: 28%;
134
+ bottom: 2.5%;
135
+ width: 16.571rem;
136
+ left: 21%;
137
+ background-color: $CAP_WHITE;
138
138
 
139
139
  .inapp-title-FOOTER-ANDROID {
140
- width: 90px;
140
+ width: 6.429rem;
141
141
  height: 12px;
142
142
  text-align: left;
143
143
  left: 34%;
144
144
  justify-content: center;
145
145
  position: relative;
146
146
  right: 33%;
147
- bottom: -22px;
147
+ bottom: -1.429rem;
148
148
  font-size: 10px;
149
149
  text-overflow: ellipsis;
150
150
  overflow: hidden;
@@ -204,7 +204,8 @@
204
204
  position: absolute;
205
205
  top: 10%;
206
206
  display: flex;
207
- left: 29%;
207
+ left: 20%;
208
+ width: 16.643rem;
208
209
  .inapp-title-FULLSCREEN-ANDROID {
209
210
  text-overflow: ellipsis;
210
211
  overflow: hidden;
@@ -241,7 +242,7 @@
241
242
  position: absolute;
242
243
  top: 20%;
243
244
  display: flex;
244
- width: 200px;
245
+ width: 14.286rem;
245
246
  left: 28%;
246
247
 
247
248
  .inapp-title-POPUP-iOS {
@@ -280,16 +281,16 @@
280
281
  .inapp-message-container-HEADER-iOS {
281
282
  position: absolute;
282
283
  display: flex;
283
- width: 200px;
284
- left: 28%;
285
- top: 3%;
284
+ width: 16.571rem;
285
+ left: 20%;
286
+ top: 10%;
286
287
 
287
288
  .inapp-title-HEADER-iOS {
288
289
  left: 34%;
289
290
  top: 15%;
290
291
  position: relative;
291
292
  font-size: 10px;
292
- width: 90px;
293
+ width: 6.429rem;
293
294
  height: 12px;
294
295
  text-overflow: ellipsis;
295
296
  overflow: hidden;
@@ -300,7 +301,7 @@
300
301
 
301
302
  .without-image-title-HEADER-ios {
302
303
  left: 26%;
303
- top: 18px;
304
+ top: 1.286rem;
304
305
  text-align: center;
305
306
  }
306
307
 
@@ -330,7 +331,7 @@
330
331
  .without-image-content-HEADER-ios {
331
332
  width: 92%;
332
333
  left: 6%;
333
- top: 21px;
334
+ top: 1.5rem;
334
335
  }
335
336
 
336
337
  .inapp-button-HEADER-iOS {
@@ -350,9 +351,9 @@
350
351
  position: absolute;
351
352
  display: flex;
352
353
  justify-content: center;
353
- width: 200px;
354
- left: 28%;
355
- top: 75%;
354
+ width: 16.571rem;
355
+ left: 20%;
356
+ top: 45%;
356
357
 
357
358
  .inapp-title-FOOTER-iOS {
358
359
  width: 90px;
@@ -423,7 +424,8 @@
423
424
  position: absolute;
424
425
  top: 10%;
425
426
  display: flex;
426
- left: 29%;
427
+ left: 20%;
428
+ width: 16.643rem;
427
429
  .inapp-title-FULLSCREEN-iOS {
428
430
  text-overflow: ellipsis;
429
431
  overflow: hidden;
@@ -455,6 +457,14 @@
455
457
  bottom: -1%;
456
458
  }
457
459
  }
460
+
461
+ .inapp-message-container-MODAL-ANDROID, .inapp-message-container-MODAL-iOS {
462
+ position: absolute;
463
+ top: 30%;
464
+ display: flex;
465
+ width: 200px;
466
+ left: 28%;
467
+ }
458
468
  }
459
469
 
460
470