@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.
- package/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/config/app.js +0 -1
- package/constants/unified.js +1 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/services/api.js +5 -2
- package/services/tests/api.test.js +18 -0
- package/utils/common.js +1 -2
- package/utils/commonUtils.js +14 -1
- package/utils/transformTemplateConfig.js +0 -10
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapTagList/index.js +4 -0
- package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
- package/v2Components/HtmlEditor/HTMLEditor.js +165 -80
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +532 -0
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
- package/v2Components/HtmlEditor/_htmlEditor.scss +0 -4
- package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +0 -98
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +125 -148
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -0
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
- package/v2Components/HtmlEditor/constants.js +29 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +158 -17
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +53 -143
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +85 -85
- package/v2Components/MobilePushPreviewV2/index.js +32 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +31 -21
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Containers/BeeEditor/index.js +82 -80
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +180 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +69 -34
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -1
- package/v2Containers/CreativesContainer/constants.js +1 -0
- package/v2Containers/CreativesContainer/index.js +65 -13
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +4 -12
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -0
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
- package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
- package/v2Containers/InApp/actions.js +7 -0
- package/v2Containers/InApp/constants.js +18 -4
- package/v2Containers/InApp/index.js +642 -355
- package/v2Containers/InApp/index.scss +4 -3
- package/v2Containers/InApp/messages.js +7 -3
- package/v2Containers/InApp/reducer.js +21 -3
- package/v2Containers/InApp/sagas.js +29 -9
- package/v2Containers/InApp/selectors.js +25 -5
- package/v2Containers/InApp/tests/index.test.js +154 -50
- package/v2Containers/InApp/tests/reducer.test.js +34 -0
- package/v2Containers/InApp/tests/sagas.test.js +61 -9
- package/v2Containers/InApp/tests/selectors.test.js +612 -0
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
- package/v2Containers/InAppWrapper/constants.js +16 -0
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
- package/v2Containers/InAppWrapper/index.js +148 -0
- package/v2Containers/InAppWrapper/messages.js +49 -0
- package/v2Containers/InappAdvance/index.js +1006 -0
- package/v2Containers/InappAdvance/index.scss +10 -0
- package/v2Containers/InappAdvance/tests/index.test.js +448 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -0
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
- package/v2Containers/TagList/index.js +65 -1
- package/v2Containers/Templates/_templates.scss +49 -1
- package/v2Containers/Templates/index.js +93 -5
- package/v2Containers/Templates/messages.js +4 -0
- package/v2Containers/Templates/reducer.js +20 -7
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +8 -88
- package/v2Containers/Templates/tests/reducer.test.js +125 -0
- 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
|
-
|
|
30
|
-
const
|
|
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:
|
|
62
|
-
templateLayoutType:
|
|
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
|
-
|
|
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
|
|
163
|
-
hasIos = get(templateData, 'versions.base.content.IOS') || get(templateData, 'iosContent
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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:
|
|
136
|
-
width:
|
|
137
|
-
left:
|
|
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:
|
|
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: -
|
|
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:
|
|
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:
|
|
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:
|
|
284
|
-
left:
|
|
285
|
-
top:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
354
|
-
left:
|
|
355
|
-
top:
|
|
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:
|
|
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
|
|