@capillarytech/creatives-library 8.0.271 → 8.0.273

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 (153) 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/services/api.js +10 -0
  7. package/services/tests/api.test.js +34 -0
  8. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +17 -35
  9. package/tests/integration/TemplateCreation/api-response.js +31 -1
  10. package/tests/integration/TemplateCreation/msw-handler.js +2 -0
  11. package/utils/common.js +5 -0
  12. package/utils/commonUtils.js +28 -5
  13. package/utils/imageUrlUpload.js +13 -14
  14. package/utils/tests/commonUtil.test.js +224 -0
  15. package/utils/tests/imageUrlUpload.test.js +298 -0
  16. package/utils/transformTemplateConfig.js +0 -10
  17. package/v2Components/CapDeviceContent/index.js +61 -56
  18. package/v2Components/CapTagList/index.js +6 -1
  19. package/v2Components/CapTagListWithInput/index.js +5 -1
  20. package/v2Components/CapTagListWithInput/messages.js +1 -1
  21. package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
  22. package/v2Components/ErrorInfoNote/constants.js +1 -0
  23. package/v2Components/ErrorInfoNote/index.js +402 -72
  24. package/v2Components/ErrorInfoNote/messages.js +32 -6
  25. package/v2Components/ErrorInfoNote/style.scss +278 -6
  26. package/v2Components/FormBuilder/tests/index.test.js +13 -4
  27. package/v2Components/HtmlEditor/HTMLEditor.js +418 -99
  28. package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +870 -0
  29. package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1882 -133
  30. package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +27 -16
  31. package/v2Components/HtmlEditor/_htmlEditor.scss +108 -45
  32. package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
  33. package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +23 -102
  34. package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -140
  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/_editorToolbar.scss +9 -1
  38. package/v2Components/HtmlEditor/components/EditorToolbar/index.js +31 -6
  39. package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
  40. package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
  41. package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
  42. package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
  43. package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
  44. package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
  45. package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +7 -10
  46. package/v2Components/HtmlEditor/components/PreviewPane/index.js +22 -43
  47. package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
  48. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +18 -0
  49. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +36 -31
  50. package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +46 -34
  51. package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +6 -0
  52. package/v2Components/HtmlEditor/components/ValidationPanel/index.js +52 -46
  53. package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +277 -0
  54. package/v2Components/HtmlEditor/components/ValidationTabs/index.js +295 -0
  55. package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
  56. package/v2Components/HtmlEditor/constants.js +45 -20
  57. package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
  58. package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +351 -16
  59. package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
  60. package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
  61. package/v2Components/HtmlEditor/hooks/useValidation.js +213 -56
  62. package/v2Components/HtmlEditor/index.js +1 -1
  63. package/v2Components/HtmlEditor/messages.js +102 -94
  64. package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +214 -45
  65. package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +134 -0
  66. package/v2Components/HtmlEditor/utils/contentSanitizer.js +40 -41
  67. package/v2Components/HtmlEditor/utils/htmlValidator.js +71 -72
  68. package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +158 -124
  69. package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
  70. package/v2Components/HtmlEditor/utils/validationAdapter.js +66 -41
  71. package/v2Components/HtmlEditor/utils/validationConstants.js +38 -0
  72. package/v2Components/MobilePushPreviewV2/constants.js +6 -0
  73. package/v2Components/MobilePushPreviewV2/index.js +33 -7
  74. package/v2Components/TemplatePreview/_templatePreview.scss +55 -24
  75. package/v2Components/TemplatePreview/index.js +47 -32
  76. package/v2Components/TemplatePreview/messages.js +4 -0
  77. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +1 -0
  78. package/v2Containers/BeeEditor/index.js +172 -90
  79. package/v2Containers/BeePopupEditor/_beePopupEditor.scss +14 -0
  80. package/v2Containers/BeePopupEditor/constants.js +10 -0
  81. package/v2Containers/BeePopupEditor/index.js +194 -0
  82. package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
  83. package/v2Containers/CreativesContainer/SlideBoxContent.js +127 -51
  84. package/v2Containers/CreativesContainer/SlideBoxFooter.js +156 -13
  85. package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -1
  86. package/v2Containers/CreativesContainer/constants.js +1 -0
  87. package/v2Containers/CreativesContainer/index.js +251 -47
  88. package/v2Containers/CreativesContainer/messages.js +8 -0
  89. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
  90. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
  91. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +103 -0
  92. package/v2Containers/Email/actions.js +7 -0
  93. package/v2Containers/Email/constants.js +5 -1
  94. package/v2Containers/Email/index.js +234 -29
  95. package/v2Containers/Email/messages.js +32 -0
  96. package/v2Containers/Email/reducer.js +12 -1
  97. package/v2Containers/Email/sagas.js +61 -7
  98. package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
  99. package/v2Containers/Email/tests/reducer.test.js +46 -0
  100. package/v2Containers/Email/tests/sagas.test.js +320 -29
  101. package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1246 -0
  102. package/v2Containers/EmailWrapper/components/EmailWrapperView.js +212 -21
  103. package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
  104. package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +2614 -0
  105. package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +520 -0
  106. package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
  107. package/v2Containers/EmailWrapper/constants.js +2 -0
  108. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +627 -79
  109. package/v2Containers/EmailWrapper/index.js +103 -23
  110. package/v2Containers/EmailWrapper/messages.js +65 -1
  111. package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +955 -0
  112. package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +596 -82
  113. package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
  114. package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
  115. package/v2Containers/InApp/actions.js +7 -0
  116. package/v2Containers/InApp/constants.js +20 -4
  117. package/v2Containers/InApp/index.js +802 -360
  118. package/v2Containers/InApp/index.scss +4 -3
  119. package/v2Containers/InApp/messages.js +7 -3
  120. package/v2Containers/InApp/reducer.js +21 -3
  121. package/v2Containers/InApp/sagas.js +29 -9
  122. package/v2Containers/InApp/selectors.js +25 -5
  123. package/v2Containers/InApp/tests/index.test.js +154 -50
  124. package/v2Containers/InApp/tests/reducer.test.js +34 -0
  125. package/v2Containers/InApp/tests/sagas.test.js +61 -9
  126. package/v2Containers/InApp/tests/selectors.test.js +612 -0
  127. package/v2Containers/InAppWrapper/components/InAppWrapperView.js +151 -0
  128. package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
  129. package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +23 -0
  130. package/v2Containers/InAppWrapper/constants.js +16 -0
  131. package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
  132. package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
  133. package/v2Containers/InAppWrapper/index.js +148 -0
  134. package/v2Containers/InAppWrapper/messages.js +49 -0
  135. package/v2Containers/InappAdvance/index.js +1099 -0
  136. package/v2Containers/InappAdvance/index.scss +10 -0
  137. package/v2Containers/InappAdvance/tests/index.test.js +448 -0
  138. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
  139. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
  140. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
  141. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
  142. package/v2Containers/MobilePush/Create/index.js +1 -1
  143. package/v2Containers/MobilePush/Edit/index.js +10 -6
  144. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -0
  145. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
  146. package/v2Containers/TagList/index.js +62 -19
  147. package/v2Containers/Templates/_templates.scss +60 -1
  148. package/v2Containers/Templates/index.js +89 -4
  149. package/v2Containers/Templates/messages.js +4 -0
  150. package/v2Containers/TemplatesV2/TemplatesV2.style.js +4 -2
  151. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -0
  152. package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
  153. package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useRef, useCallback } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { FormattedMessage } from 'react-intl';
4
4
  import styled from 'styled-components';
@@ -11,25 +11,38 @@ import CapSpin from '@capillarytech/cap-ui-library/CapSpin';
11
11
  import CapButton from '@capillarytech/cap-ui-library/CapButton';
12
12
  import CapError from '@capillarytech/cap-ui-library/CapError';
13
13
  import ComponentWithLabelHOC from '@capillarytech/cap-ui-library/assets/HOCs/ComponentWithLabelHOC';
14
- import Email from '../../Email';
14
+ import { CAP_COLOR_06, CAP_WHITE } from '@capillarytech/cap-ui-library/styled/variables';
15
+ import { EmailWithoutSaga } from '../../Email';
15
16
  import CmsTemplatesComponent from '../../../v2Components/CmsTemplatesComponent';
17
+ import EmailHTMLEditor from './EmailHTMLEditor';
18
+ import TestAndPreviewSlidebox from '../../../v2Components/TestAndPreviewSlidebox';
19
+ import { EMAIL } from '../../CreativesContainer/constants';
16
20
  import messages from '../messages';
17
21
  import { EMAIL_CREATE_MODES, STEPS } from '../constants';
22
+ import { hasSupportCKEditor } from '../../../utils/common';
18
23
 
19
24
  const CapRadioCardWithLabel = ComponentWithLabelHOC(CapRadioCard);
20
25
 
21
26
  const CardContainer = styled.div`
22
27
  margin-top: 16px;
23
- .ant-radio-group{
24
- .ant-radio-button-wrapper{
25
- &:first-child{
26
- margin-left: unset;
28
+
29
+ .ant-radio-group.cap-radioCard-v2 {
30
+ .ant-radio-button-wrapper {
31
+ &.ant-radio-button-wrapper-checked {
32
+ .icon-container {
33
+ background-color: ${CAP_COLOR_06};
34
+ .anticon,
35
+ .cap-icon {
36
+ color: ${CAP_WHITE};
37
+ }
38
+ }
27
39
  }
28
40
  }
29
41
  }
30
42
  `;
31
43
 
32
- // Mode selection component that handles the creation mode selection UI
44
+
45
+ // Mode selection component
33
46
  const ModeSelectionUI = ({
34
47
  isFullMode,
35
48
  templateName,
@@ -51,20 +64,21 @@ const ModeSelectionUI = ({
51
64
  value={templateName}
52
65
  labelPosition="top"
53
66
  size="default"
54
- style={{ width: '68%'}}
67
+ style={{ width: '68%' }}
55
68
  />
56
69
  )}
57
70
  <CardContainer>
58
71
  <CapRadioCardWithLabel
72
+ style={{ marginLeft: '-6px'}}
59
73
  panes={modes}
60
74
  onChange={onChange}
61
75
  selected={emailCreateMode}
62
- label={<FormattedMessage {...messages.createMode} />}
76
+ label={<FormattedMessage {...messages.editorType} />}
63
77
  />
64
78
  </CardContainer>
65
79
  <>
66
80
  {emailCreateMode === EMAIL_CREATE_MODES.UPLOAD && (
67
- <div style={{ marginLeft: '8px' }}>
81
+ <div>
68
82
  <CapUploader onChange={useFileUpload} accept=".zip, .html, .htm" showUploadList={false}>
69
83
  {(isFullMode && isTemplateNameEmpty) && (
70
84
  <CapError type="error">
@@ -98,25 +112,36 @@ ModeSelectionUI.propTypes = {
98
112
  uploadButtonLabel: PropTypes.node.isRequired,
99
113
  };
100
114
 
101
- // Content creation component that handles the email or template selection UI
115
+ // Content creation component
102
116
  const ContentCreationUI = ({
103
117
  isShowEmailCreate,
104
118
  emailProps,
105
119
  cmsTemplatesProps,
106
- }) => (
107
- <>
108
- {isShowEmailCreate ? (
109
- <Email {...emailProps} />
110
- ) : (
111
- <CmsTemplatesComponent {...cmsTemplatesProps} />
112
- )}
113
- </>
114
- );
120
+ isHTMLEditorMode,
121
+ htmlEditorProps,
122
+ }) => {
123
+
124
+ return (
125
+ <>
126
+ {isShowEmailCreate ? (
127
+ isHTMLEditorMode ? (
128
+ <EmailHTMLEditor {...htmlEditorProps} />
129
+ ) : (
130
+ <EmailWithoutSaga {...emailProps} />
131
+ )
132
+ ) : (
133
+ <CmsTemplatesComponent {...cmsTemplatesProps} />
134
+ )}
135
+ </>
136
+ );
137
+ };
115
138
 
116
139
  ContentCreationUI.propTypes = {
117
140
  isShowEmailCreate: PropTypes.bool.isRequired,
118
141
  emailProps: PropTypes.object.isRequired,
119
142
  cmsTemplatesProps: PropTypes.object.isRequired,
143
+ isHTMLEditorMode: PropTypes.bool,
144
+ htmlEditorProps: PropTypes.object,
120
145
  };
121
146
 
122
147
  // Main EmailWrapper presentational component
@@ -137,9 +162,137 @@ const EmailWrapperView = ({
137
162
  isShowEmailCreate,
138
163
  emailProps,
139
164
  cmsTemplatesProps,
165
+ metaEntities,
166
+ loadingTags,
167
+ injectedTags,
168
+ globalActions,
169
+ supportedTags,
170
+ getDefaultTags,
171
+ location,
172
+ currentOrgDetails,
173
+ forwardedTags,
174
+ selectedOfferDetails,
175
+ eventContextTags,
176
+ getFormdata,
177
+ isGetFormData,
178
+ getLiquidTags,
179
+ showLiquidErrorInFooter,
180
+ onValidationFail,
181
+ emailActions,
182
+ Email,
183
+ templateData: templateDataProp,
184
+ params,
185
+ fetchingLiquidTags,
186
+ createTemplateInProgress,
187
+ fetchingCmsData,
188
+ setIsLoadingContent,
189
+ showTestAndPreviewSlidebox,
190
+ handleCloseTestAndPreview,
191
+ showTemplateName,
192
+ onHtmlEditorValidationStateChange,
193
+ moduleType,
140
194
  }) => {
195
+ const htmlEditorRef = useRef(null);
196
+ const supportCKEditor = hasSupportCKEditor();
197
+ const hasParamsIdForEditor = params?.id || location?.query?.id || location?.params?.id || location?.pathname?.includes('/edit/');
198
+ const isEditModeForEditor = hasParamsIdForEditor;
199
+ const isBEEFromProps = emailProps?.editor === 'BEE' && emailProps?.selectedEditorMode === null;
200
+ const isDragDropFromCreateMode = emailCreateMode === EMAIL_CREATE_MODES.DRAG_DROP;
201
+ const isExplicitlyBEEEditor = isBEEFromProps || isDragDropFromCreateMode;
202
+ let isHTMLEditorMode = false;
141
203
 
142
- const isShowTemplateSelection = step === STEPS.MODE_SELECTION || (step === STEPS.TEMPLATE_SELECTION && emailCreateMode === EMAIL_CREATE_MODES.UPLOAD);
204
+ if (supportCKEditor) {
205
+ // Legacy flow: use HTML editor for UPLOAD so zip/HTML content (EmailLayout) is shown; use Email component for EDITOR
206
+ isHTMLEditorMode = emailCreateMode === EMAIL_CREATE_MODES.UPLOAD;
207
+ } else if (isEditModeForEditor) {
208
+ isHTMLEditorMode = !isExplicitlyBEEEditor;
209
+ } else {
210
+ if (isExplicitlyBEEEditor || isBEEFromProps || isDragDropFromCreateMode) {
211
+ isHTMLEditorMode = false;
212
+ } else {
213
+ isHTMLEditorMode = emailProps?.selectedEditorMode === EMAIL_CREATE_MODES.HTML_EDITOR ||
214
+ emailCreateMode === EMAIL_CREATE_MODES.HTML_EDITOR;
215
+ }
216
+ }
217
+
218
+ const isShowTemplateSelection = step === STEPS.MODE_SELECTION;
219
+
220
+ // Create onFormDataChange callback for template name updates (similar to Email component)
221
+ // This allows CreativesContainer to update the template name when user clicks "Edit name"
222
+ // When user edits the name in CreativesContainer header, it calls this callback
223
+ // which updates the template name in EmailWrapper, and then CreativesContainer
224
+ // will call showTemplateName again with the updated formData
225
+ const handleFormDataChange = useCallback((updatedFormData) => {
226
+ const newTemplateName = updatedFormData?.['template-name'] || templateName;
227
+ if (newTemplateName !== templateName && onTemplateNameChange) {
228
+ // Update template name in parent (useEmailWrapper hook)
229
+ onTemplateNameChange({ target: { value: newTemplateName } });
230
+ }
231
+ // Note: CreativesContainer will call showTemplateName again after this callback
232
+ // (it stores the callback in templateContainerDetails and calls it after state updates)
233
+ }, [templateName, onTemplateNameChange]);
234
+
235
+ const htmlEditorProps = isHTMLEditorMode ? {
236
+ // Location and params
237
+ location,
238
+ params,
239
+ // Tag-related props
240
+ getDefaultTags,
241
+ supportedTags,
242
+ metaEntities,
243
+ injectedTags,
244
+ globalActions,
245
+ loadingTags,
246
+ eventContextTags,
247
+ forwardedTags,
248
+ selectedOfferDetails,
249
+ currentOrgDetails,
250
+ // Email Redux state and actions
251
+ Email,
252
+ emailActions,
253
+ // Full mode props
254
+ isFullMode,
255
+ templateName,
256
+ isGetFormData,
257
+ getFormdata,
258
+ // Library mode props
259
+ templateData: templateDataProp,
260
+ // Uploaded content from zip file
261
+ EmailLayout,
262
+ // Liquid validation
263
+ getLiquidTags,
264
+ showLiquidErrorInFooter,
265
+ // Validation state callback
266
+ onHtmlEditorValidationStateChange,
267
+ onValidationFail,
268
+ // Template name
269
+ showTemplateName,
270
+ onFormDataChange: handleFormDataChange,
271
+ // Module type for unsubscribe tag validation
272
+ moduleType,
273
+ // Loading states
274
+ fetchingLiquidTags: fetchingLiquidTags || false,
275
+ createTemplateInProgress: createTemplateInProgress || false,
276
+ fetchingCmsData: fetchingCmsData || false,
277
+ // Parent loading control
278
+ setIsLoadingContent,
279
+ ref: htmlEditorRef,
280
+ } : {};
281
+
282
+ // Get formData for TestAndPreviewSlidebox when needed
283
+ const getFormDataForPreview = () => {
284
+ if (htmlEditorRef.current && htmlEditorRef.current.getFormDataForPreview) {
285
+ return htmlEditorRef.current.getFormDataForPreview();
286
+ }
287
+ return {};
288
+ };
289
+
290
+ const getContentForPreview = () => {
291
+ if (htmlEditorRef.current && htmlEditorRef.current.getContentForPreview) {
292
+ return htmlEditorRef.current.getContentForPreview();
293
+ }
294
+ return '';
295
+ };
143
296
 
144
297
  return (
145
298
  <>
@@ -163,9 +316,22 @@ const EmailWrapperView = ({
163
316
  isShowEmailCreate={isShowEmailCreate}
164
317
  emailProps={emailProps}
165
318
  cmsTemplatesProps={cmsTemplatesProps}
319
+ isHTMLEditorMode={isHTMLEditorMode}
320
+ htmlEditorProps={htmlEditorProps}
166
321
  />
167
322
  )}
168
323
  </CapSpin>
324
+ {/* Render TestAndPreviewSlidebox for HTML Editor (similar to legacy Email component) */}
325
+ {isHTMLEditorMode && showTestAndPreviewSlidebox && (
326
+ <TestAndPreviewSlidebox
327
+ show={showTestAndPreviewSlidebox}
328
+ onClose={handleCloseTestAndPreview}
329
+ formData={getFormDataForPreview()}
330
+ content={getContentForPreview()}
331
+ currentChannel={EMAIL}
332
+ currentTab={1}
333
+ />
334
+ )}
169
335
  </>
170
336
  );
171
337
  };
@@ -175,6 +341,10 @@ EmailWrapperView.propTypes = {
175
341
  emailCreateMode: PropTypes.string,
176
342
  step: PropTypes.string,
177
343
  isFullMode: PropTypes.bool,
344
+ getFormdata: PropTypes.func,
345
+ isGetFormData: PropTypes.bool,
346
+ getLiquidTags: PropTypes.func,
347
+ showLiquidErrorInFooter: PropTypes.func,
178
348
  templateName: PropTypes.string,
179
349
  onTemplateNameChange: PropTypes.func.isRequired,
180
350
  isTemplateNameEmpty: PropTypes.bool,
@@ -187,6 +357,27 @@ EmailWrapperView.propTypes = {
187
357
  isShowEmailCreate: PropTypes.bool.isRequired,
188
358
  emailProps: PropTypes.object.isRequired,
189
359
  cmsTemplatesProps: PropTypes.object.isRequired,
360
+ metaEntities: PropTypes.object,
361
+ loadingTags: PropTypes.bool,
362
+ injectedTags: PropTypes.object,
363
+ globalActions: PropTypes.object,
364
+ supportedTags: PropTypes.array,
365
+ getDefaultTags: PropTypes.string,
366
+ location: PropTypes.object,
367
+ currentOrgDetails: PropTypes.object,
368
+ forwardedTags: PropTypes.object,
369
+ selectedOfferDetails: PropTypes.array,
370
+ eventContextTags: PropTypes.array,
371
+ emailActions: PropTypes.object,
372
+ Email: PropTypes.object,
373
+ templateData: PropTypes.object,
374
+ params: PropTypes.object,
375
+ fetchingLiquidTags: PropTypes.bool,
376
+ createTemplateInProgress: PropTypes.bool,
377
+ fetchingCmsData: PropTypes.bool,
378
+ setIsLoadingContent: PropTypes.func,
379
+ showTestAndPreviewSlidebox: PropTypes.bool,
380
+ handleCloseTestAndPreview: PropTypes.func,
190
381
  };
191
382
 
192
383
  export default EmailWrapperView;
@@ -24,24 +24,20 @@ const HTMLEditorTesting = () => {
24
24
  // Show/Hide editor
25
25
  show: () => {
26
26
  setIsVisible(true);
27
- console.log('✅ HTMLEditor test mode activated');
28
27
  },
29
28
 
30
29
  hide: () => {
31
30
  setIsVisible(false);
32
- console.log('✅ HTMLEditor test mode deactivated');
33
31
  },
34
32
 
35
33
  toggle: () => {
36
- setIsVisible(prev => !prev);
37
- console.log(`✅ HTMLEditor test mode ${!isVisible ? 'activated' : 'deactivated'}`);
34
+ setIsVisible((prev) => !prev);
38
35
  },
39
36
 
40
37
  // Variant control
41
38
  setVariant: (newVariant) => {
42
39
  if (['email', 'inapp'].includes(newVariant)) {
43
40
  setVariant(newVariant);
44
- console.log(`✅ Variant set to: ${newVariant}`);
45
41
  } else {
46
42
  console.error('❌ Invalid variant. Use: "email" or "inapp"');
47
43
  }
@@ -52,7 +48,6 @@ const HTMLEditorTesting = () => {
52
48
  const validLayouts = Object.values(LAYOUT_TYPES);
53
49
  if (validLayouts.includes(layout)) {
54
50
  setLayoutType(layout);
55
- console.log(`✅ Layout set to: ${layout}`);
56
51
  } else {
57
52
  console.error(`❌ Invalid layout. Use: ${validLayouts.join(', ')}`);
58
53
  }
@@ -61,58 +56,22 @@ const HTMLEditorTesting = () => {
61
56
  // Content control
62
57
  setContent: (newContent) => {
63
58
  setContent(newContent);
64
- console.log('✅ Content updated');
65
59
  },
66
60
 
67
61
  getContent: () => {
68
- console.log('Current content:', content);
69
62
  return content;
70
63
  },
71
64
 
72
65
  // Status
73
66
  status: () => {
74
- console.log('📊 HTMLEditor Test Status:');
75
- console.log(` Visible: ${isVisible}`);
76
- console.log(` Variant: ${variant}`);
77
- console.log(` Layout: ${layoutType}`);
78
- console.log(` Content size: ${content.length} chars`);
79
67
  },
80
68
 
81
69
  // Help
82
70
  help: () => {
83
- console.log(`
84
- 🚀 HTMLEditor Testing Console Commands:
85
-
86
- 📱 Basic Controls:
87
- htmlEditorTest.show() - Show the editor
88
- htmlEditorTest.hide() - Hide the editor
89
- htmlEditorTest.toggle() - Toggle editor visibility
90
-
91
- ⚙️ Configuration:
92
- htmlEditorTest.setVariant('email') - Set to email variant
93
- htmlEditorTest.setVariant('inapp') - Set to inapp variant
94
- htmlEditorTest.setLayout('POPUP') - Set layout (inapp only)
95
- - Valid: POPUP, HEADER, FOOTER, FULLSCREEN
96
-
97
- 📝 Content:
98
- htmlEditorTest.setContent('<h1>Test</h1>') - Set editor content
99
- htmlEditorTest.getContent() - Get current content
100
-
101
- 📊 Status:
102
- htmlEditorTest.status() - Show current status
103
- htmlEditorTest.help() - Show this help
104
-
105
- 💡 Example Usage:
106
- htmlEditorTest.show()
107
- htmlEditorTest.setVariant('inapp')
108
- htmlEditorTest.setLayout('HEADER') // Top banner
109
- htmlEditorTest.setLayout('FOOTER') // Bottom banner
110
- `);
111
- }
71
+ },
112
72
  };
113
73
 
114
74
  // Show help on first load
115
- console.log('🚀 HTMLEditor Testing Ready! Type htmlEditorTest.help() for commands');
116
75
 
117
76
  // Cleanup on unmount
118
77
  return () => {
@@ -128,32 +87,40 @@ const HTMLEditorTesting = () => {
128
87
  }
129
88
 
130
89
  return (
131
- <div style={{
132
- position: 'fixed',
133
- top: 0,
134
- left: 0,
135
- right: 0,
136
- bottom: 0,
137
- backgroundColor: 'rgba(0, 0, 0, 0.8)',
138
- zIndex: 9999,
139
- display: 'flex',
140
- flexDirection: 'column',
141
- padding: '20px'
142
- }}>
143
- {/* Header */}
144
- <div style={{
145
- backgroundColor: '#fff',
146
- padding: '10px 20px',
147
- borderRadius: '8px 8px 0 0',
90
+ <div
91
+ style={{
92
+ position: 'fixed',
93
+ top: 0,
94
+ left: 0,
95
+ right: 0,
96
+ bottom: 0,
97
+ backgroundColor: 'rgba(0, 0, 0, 0.8)',
98
+ zIndex: 9999,
148
99
  display: 'flex',
149
- justifyContent: 'space-between',
150
- alignItems: 'center',
151
- borderBottom: '1px solid #ddd'
100
+ flexDirection: 'column',
101
+ padding: '20px',
152
102
  }}>
103
+ {/* Header */}
104
+ <div
105
+ style={{
106
+ backgroundColor: '#fff',
107
+ padding: '10px 20px',
108
+ borderRadius: '8px 8px 0 0',
109
+ display: 'flex',
110
+ justifyContent: 'space-between',
111
+ alignItems: 'center',
112
+ borderBottom: '1px solid #ddd',
113
+ }}>
153
114
  <div>
154
115
  <strong>HTMLEditor Testing Mode</strong>
155
116
  <span style={{ marginLeft: '20px', color: '#666' }}>
156
- Variant: {variant} | Layout: {layoutType}
117
+ Variant:
118
+ {' '}
119
+ {variant}
120
+ {' '}
121
+ | Layout:
122
+ {' '}
123
+ {layoutType}
157
124
  </span>
158
125
  </div>
159
126
  <button
@@ -164,7 +131,7 @@ const HTMLEditorTesting = () => {
164
131
  border: 'none',
165
132
  padding: '5px 15px',
166
133
  borderRadius: '4px',
167
- cursor: 'pointer'
134
+ cursor: 'pointer',
168
135
  }}
169
136
  >
170
137
  Close
@@ -172,12 +139,13 @@ const HTMLEditorTesting = () => {
172
139
  </div>
173
140
 
174
141
  {/* Editor Container */}
175
- <div style={{
176
- flex: 1,
177
- backgroundColor: '#fff',
178
- borderRadius: '0 0 8px 8px',
179
- overflow: 'hidden'
180
- }}>
142
+ <div
143
+ style={{
144
+ flex: 1,
145
+ backgroundColor: '#fff',
146
+ borderRadius: '0 0 8px 8px',
147
+ overflow: 'hidden',
148
+ }}>
181
149
  <IntlProvider locale="en" messages={{}}>
182
150
  <HTMLEditor
183
151
  variant={variant}
@@ -185,10 +153,8 @@ const HTMLEditorTesting = () => {
185
153
  initialContent={content}
186
154
  onContentChange={(newContent) => {
187
155
  setContent(newContent);
188
- console.log('📝 Content changed:', newContent.substring(0, 100) + '...');
189
156
  }}
190
- onSave={(savedContent) => {
191
- console.log('💾 Content saved:', savedContent);
157
+ onSave={() => {
192
158
  }}
193
159
  />
194
160
  </IntlProvider>