@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.
- package/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +2 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/services/api.js +10 -0
- package/services/tests/api.test.js +34 -0
- package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +17 -35
- package/tests/integration/TemplateCreation/api-response.js +31 -1
- package/tests/integration/TemplateCreation/msw-handler.js +2 -0
- package/utils/common.js +5 -0
- package/utils/commonUtils.js +28 -5
- package/utils/imageUrlUpload.js +13 -14
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/tests/imageUrlUpload.test.js +298 -0
- package/utils/transformTemplateConfig.js +0 -10
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapTagList/index.js +6 -1
- package/v2Components/CapTagListWithInput/index.js +5 -1
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
- package/v2Components/ErrorInfoNote/constants.js +1 -0
- package/v2Components/ErrorInfoNote/index.js +402 -72
- package/v2Components/ErrorInfoNote/messages.js +32 -6
- package/v2Components/ErrorInfoNote/style.scss +278 -6
- package/v2Components/FormBuilder/tests/index.test.js +13 -4
- package/v2Components/HtmlEditor/HTMLEditor.js +418 -99
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +870 -0
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1882 -133
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +27 -16
- package/v2Components/HtmlEditor/_htmlEditor.scss +108 -45
- package/v2Components/HtmlEditor/_index.lazy.scss +0 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +23 -102
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -140
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +9 -1
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +31 -6
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +22 -0
- 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/components/PreviewPane/_previewPane.scss +7 -10
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +22 -43
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +18 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +36 -31
- package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +46 -34
- package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +6 -0
- package/v2Components/HtmlEditor/components/ValidationPanel/index.js +52 -46
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +277 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +295 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
- package/v2Components/HtmlEditor/constants.js +45 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +351 -16
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
- package/v2Components/HtmlEditor/hooks/useValidation.js +213 -56
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +102 -94
- package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +214 -45
- package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +134 -0
- package/v2Components/HtmlEditor/utils/contentSanitizer.js +40 -41
- package/v2Components/HtmlEditor/utils/htmlValidator.js +71 -72
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +158 -124
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
- package/v2Components/HtmlEditor/utils/validationAdapter.js +66 -41
- package/v2Components/HtmlEditor/utils/validationConstants.js +38 -0
- package/v2Components/MobilePushPreviewV2/constants.js +6 -0
- package/v2Components/MobilePushPreviewV2/index.js +33 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +55 -24
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +1 -0
- package/v2Containers/BeeEditor/index.js +172 -90
- package/v2Containers/BeePopupEditor/_beePopupEditor.scss +14 -0
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +194 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +127 -51
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +156 -13
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -1
- package/v2Containers/CreativesContainer/constants.js +1 -0
- package/v2Containers/CreativesContainer/index.js +251 -47
- package/v2Containers/CreativesContainer/messages.js +8 -0
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +103 -0
- package/v2Containers/Email/actions.js +7 -0
- package/v2Containers/Email/constants.js +5 -1
- package/v2Containers/Email/index.js +234 -29
- package/v2Containers/Email/messages.js +32 -0
- package/v2Containers/Email/reducer.js +12 -1
- package/v2Containers/Email/sagas.js +61 -7
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/Email/tests/reducer.test.js +46 -0
- package/v2Containers/Email/tests/sagas.test.js +320 -29
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1246 -0
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +212 -21
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +2614 -0
- package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +520 -0
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
- package/v2Containers/EmailWrapper/constants.js +2 -0
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +627 -79
- package/v2Containers/EmailWrapper/index.js +103 -23
- package/v2Containers/EmailWrapper/messages.js +65 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +955 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +596 -82
- 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 +20 -4
- package/v2Containers/InApp/index.js +802 -360
- 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 +151 -0
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +23 -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 +1099 -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/MobilePush/Create/index.js +1 -1
- package/v2Containers/MobilePush/Edit/index.js +10 -6
- 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 +62 -19
- package/v2Containers/Templates/_templates.scss +60 -1
- package/v2Containers/Templates/index.js +89 -4
- package/v2Containers/Templates/messages.js +4 -0
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +4 -2
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
- 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
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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.
|
|
76
|
+
label={<FormattedMessage {...messages.editorType} />}
|
|
63
77
|
/>
|
|
64
78
|
</CardContainer>
|
|
65
79
|
<>
|
|
66
80
|
{emailCreateMode === EMAIL_CREATE_MODES.UPLOAD && (
|
|
67
|
-
<div
|
|
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
|
|
115
|
+
// Content creation component
|
|
102
116
|
const ContentCreationUI = ({
|
|
103
117
|
isShowEmailCreate,
|
|
104
118
|
emailProps,
|
|
105
119
|
cmsTemplatesProps,
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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:
|
|
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
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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={(
|
|
191
|
-
console.log('💾 Content saved:', savedContent);
|
|
157
|
+
onSave={() => {
|
|
192
158
|
}}
|
|
193
159
|
/>
|
|
194
160
|
</IntlProvider>
|