@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.10
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/sagas/__tests__/assetPolling.test.js +74 -3
- package/sagas/assetPolling.js +8 -1
- package/services/api.js +10 -5
- package/services/tests/api.test.js +18 -0
- package/translations/en.json +0 -1
- package/utils/common.js +5 -0
- package/utils/commonUtils.js +14 -1
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/transformTemplateConfig.js +0 -10
- package/utils/transformerUtils.js +0 -42
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +14 -54
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +0 -4
- 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/index.js +412 -72
- package/v2Components/ErrorInfoNote/messages.js +22 -0
- package/v2Components/ErrorInfoNote/style.scss +279 -2
- package/v2Components/HtmlEditor/HTMLEditor.js +220 -91
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
- package/v2Components/HtmlEditor/_htmlEditor.scss +107 -45
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
- 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 -0
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- 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 +3 -6
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +70 -72
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
- package/v2Components/HtmlEditor/constants.js +29 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +95 -85
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
- package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
- package/v2Components/MobilePushPreviewV2/index.js +32 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
- package/v2Containers/App/constants.js +0 -5
- package/v2Containers/BeeEditor/index.js +82 -80
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +193 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
- package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +1 -2
- package/v2Containers/CreativesContainer/index.js +173 -193
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
- package/v2Containers/Email/actions.js +7 -0
- package/v2Containers/Email/constants.js +5 -1
- package/v2Containers/Email/index.js +13 -0
- package/v2Containers/Email/messages.js +32 -0
- package/v2Containers/Email/reducer.js +12 -1
- package/v2Containers/Email/sagas.js +41 -6
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
- package/v2Containers/EmailWrapper/constants.js +2 -0
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
- package/v2Containers/EmailWrapper/index.js +99 -23
- package/v2Containers/EmailWrapper/messages.js +61 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
- 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 +801 -357
- 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 +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 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
- package/v2Containers/TagList/index.js +67 -1
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +56 -200
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +124 -277
- package/v2Containers/Templates/messages.js +4 -24
- package/v2Containers/Templates/reducer.js +0 -2
- package/v2Containers/Templates/tests/index.test.js +0 -10
- package/v2Containers/TemplatesV2/index.js +2 -3
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
- package/v2Components/CapImageUrlUpload/constants.js +0 -19
- package/v2Components/CapImageUrlUpload/index.js +0 -455
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
- package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
- package/v2Containers/WebPush/Create/index.js +0 -1755
- package/v2Containers/WebPush/Create/index.scss +0 -123
- package/v2Containers/WebPush/Create/messages.js +0 -199
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
- package/v2Containers/WebPush/Create/preview/constants.js +0 -162
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -108
- package/v2Containers/WebPush/index.js +0 -2
- package/v2Containers/WebPush/reducer.js +0 -104
- package/v2Containers/WebPush/sagas.js +0 -119
- package/v2Containers/WebPush/selectors.js +0 -65
- package/v2Containers/WebPush/tests/reducer.test.js +0 -863
- package/v2Containers/WebPush/tests/sagas.test.js +0 -566
- package/v2Containers/WebPush/tests/selectors.test.js +0 -960
|
@@ -9,6 +9,7 @@ import { connect } from 'react-redux';
|
|
|
9
9
|
import { injectIntl, intlShape } from 'react-intl';
|
|
10
10
|
import { createStructuredSelector } from 'reselect';
|
|
11
11
|
import { bindActionCreators } from 'redux';
|
|
12
|
+
import { compose } from 'redux';
|
|
12
13
|
import { UserIsAuthenticated } from '../../utils/authWrapper';
|
|
13
14
|
import {
|
|
14
15
|
selectEmailLayout,
|
|
@@ -18,10 +19,17 @@ import {
|
|
|
18
19
|
selectCmsTemplatesLoader,
|
|
19
20
|
} from '../Templates/selectors';
|
|
20
21
|
import * as templatesActionsCreators from '../Templates/actions';
|
|
21
|
-
import { selectCurrentOrgDetails } from "../../v2Containers/Cap/selectors";
|
|
22
|
+
import { selectCurrentOrgDetails, makeSelectMetaEntities, isLoadingMetaEntities, setInjectedTags, selectLiquidStateDetails } from "../../v2Containers/Cap/selectors";
|
|
23
|
+
import { makeSelectEmail, selectLoadingStatus, makeSelectFetchingCmsData } from '../Email/selectors';
|
|
24
|
+
import * as emailActionsCreators from '../Email/actions';
|
|
25
|
+
import * as globalActions from '../Cap/actions';
|
|
22
26
|
import EmailWrapperView from './components/EmailWrapperView';
|
|
23
27
|
import useEmailWrapper from './hooks/useEmailWrapper';
|
|
24
28
|
import HTMLEditorTesting from './components/HTMLEditorTesting';
|
|
29
|
+
import injectReducer from '../../utils/injectReducer';
|
|
30
|
+
import injectSaga from '../../utils/injectSaga';
|
|
31
|
+
import v2EmailReducer from '../Email/reducer';
|
|
32
|
+
import { v2EmailSagas } from '../Email/sagas';
|
|
25
33
|
|
|
26
34
|
|
|
27
35
|
const EmailWrapper = (props) => {
|
|
@@ -64,6 +72,18 @@ const EmailWrapper = (props) => {
|
|
|
64
72
|
handleTestAndPreview,
|
|
65
73
|
handleCloseTestAndPreview,
|
|
66
74
|
isTestAndPreviewMode,
|
|
75
|
+
location,
|
|
76
|
+
emailActions,
|
|
77
|
+
Email,
|
|
78
|
+
metaEntities,
|
|
79
|
+
loadingTags,
|
|
80
|
+
injectedTags,
|
|
81
|
+
globalActions: globalActionsProp,
|
|
82
|
+
templateData,
|
|
83
|
+
params,
|
|
84
|
+
fetchingLiquidTags,
|
|
85
|
+
createTemplateInProgress,
|
|
86
|
+
fetchingCmsData,
|
|
67
87
|
} = props;
|
|
68
88
|
|
|
69
89
|
// Pass destructured props to the custom hook
|
|
@@ -117,32 +137,68 @@ const EmailWrapper = (props) => {
|
|
|
117
137
|
handleTestAndPreview,
|
|
118
138
|
handleCloseTestAndPreview,
|
|
119
139
|
isTestAndPreviewMode,
|
|
140
|
+
location,
|
|
141
|
+
emailActions,
|
|
142
|
+
Email,
|
|
143
|
+
templateData,
|
|
144
|
+
params,
|
|
120
145
|
});
|
|
121
146
|
|
|
122
147
|
// Render using the presentation component with data from the hook
|
|
123
148
|
return (
|
|
124
149
|
<div>
|
|
125
150
|
<EmailWrapperView
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
151
|
+
isUploading={isUploading}
|
|
152
|
+
emailCreateMode={emailCreateMode}
|
|
153
|
+
step={step}
|
|
154
|
+
isFullMode={isFullMode}
|
|
155
|
+
templateName={templateName}
|
|
156
|
+
onTemplateNameChange={onTemplateNameChange}
|
|
157
|
+
isTemplateNameEmpty={isTemplateNameEmpty}
|
|
158
|
+
modes={modes}
|
|
159
|
+
onChange={onChange}
|
|
160
|
+
EmailLayout={EmailLayout}
|
|
161
|
+
modeContent={modeContent}
|
|
162
|
+
useFileUpload={useFileUpload}
|
|
163
|
+
uploadButtonLabel={uploadButtonLabel}
|
|
164
|
+
isShowEmailCreate={isShowEmailCreate}
|
|
165
|
+
emailProps={emailProps}
|
|
166
|
+
cmsTemplatesProps={cmsTemplatesProps}
|
|
167
|
+
onPreviewContentClicked={onPreviewContentClicked}
|
|
168
|
+
onTestContentClicked={onTestContentClicked}
|
|
169
|
+
editor={editor}
|
|
170
|
+
// New flow props - only used when supportCKEditor is false
|
|
171
|
+
// These props are needed for EmailHTMLEditor component (tag loading, validation, etc.)
|
|
172
|
+
metaEntities={metaEntities}
|
|
173
|
+
loadingTags={loadingTags}
|
|
174
|
+
injectedTags={injectedTags}
|
|
175
|
+
globalActions={globalActionsProp}
|
|
176
|
+
supportedTags={props.supportedTags}
|
|
177
|
+
getDefaultTags={type}
|
|
178
|
+
location={location}
|
|
179
|
+
currentOrgDetails={currentOrgDetails}
|
|
180
|
+
onValidationFail={onValidationFail}
|
|
181
|
+
forwardedTags={forwardedTags}
|
|
182
|
+
selectedOfferDetails={selectedOfferDetails}
|
|
183
|
+
eventContextTags={eventContextTags}
|
|
184
|
+
getFormdata={getFormdata}
|
|
185
|
+
isGetFormData={isGetFormData}
|
|
186
|
+
getLiquidTags={globalActionsProp?.getLiquidTags}
|
|
187
|
+
showLiquidErrorInFooter={showLiquidErrorInFooter}
|
|
188
|
+
intl={intl}
|
|
189
|
+
emailActions={emailActions}
|
|
190
|
+
showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
|
|
191
|
+
handleTestAndPreview={handleTestAndPreview}
|
|
192
|
+
handleCloseTestAndPreview={handleCloseTestAndPreview}
|
|
193
|
+
Email={Email}
|
|
194
|
+
setIsLoadingContent={setIsLoadingContent}
|
|
195
|
+
templateData={templateData}
|
|
196
|
+
params={params}
|
|
197
|
+
showTemplateName={showTemplateName}
|
|
198
|
+
fetchingLiquidTags={fetchingLiquidTags}
|
|
199
|
+
createTemplateInProgress={createTemplateInProgress}
|
|
200
|
+
fetchingCmsData={fetchingCmsData}
|
|
201
|
+
/>
|
|
146
202
|
|
|
147
203
|
{/* HTMLEditor Testing Component - Console Controlled */}
|
|
148
204
|
<HTMLEditorTesting />
|
|
@@ -159,7 +215,7 @@ EmailWrapper.propTypes = {
|
|
|
159
215
|
templatesActions: PropTypes.object,
|
|
160
216
|
CmsTemplates: PropTypes.arrayOf(PropTypes.object),
|
|
161
217
|
SelectedEdmDefaultTemplate: PropTypes.object,
|
|
162
|
-
step: PropTypes.string,
|
|
218
|
+
step: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
|
163
219
|
showNextStep: PropTypes.func,
|
|
164
220
|
getFormdata: PropTypes.func,
|
|
165
221
|
intl: intlShape,
|
|
@@ -187,6 +243,7 @@ EmailWrapper.propTypes = {
|
|
|
187
243
|
handleTestAndPreview: PropTypes.func,
|
|
188
244
|
handleCloseTestAndPreview: PropTypes.func,
|
|
189
245
|
isTestAndPreviewMode: PropTypes.bool,
|
|
246
|
+
location: PropTypes.object,
|
|
190
247
|
};
|
|
191
248
|
|
|
192
249
|
const mapStateToProps = createStructuredSelector({
|
|
@@ -196,12 +253,31 @@ const mapStateToProps = createStructuredSelector({
|
|
|
196
253
|
isUploading: uploadSelector(),
|
|
197
254
|
cmsTemplatesLoader: selectCmsTemplatesLoader(),
|
|
198
255
|
currentOrgDetails: selectCurrentOrgDetails(),
|
|
256
|
+
Email: makeSelectEmail(),
|
|
257
|
+
metaEntities: makeSelectMetaEntities(),
|
|
258
|
+
loadingTags: isLoadingMetaEntities(),
|
|
259
|
+
injectedTags: setInjectedTags(),
|
|
260
|
+
fetchingLiquidTags: selectLiquidStateDetails(),
|
|
261
|
+
createTemplateInProgress: selectLoadingStatus(),
|
|
262
|
+
fetchingCmsData: makeSelectFetchingCmsData(),
|
|
199
263
|
});
|
|
200
264
|
|
|
201
265
|
function mapDispatchToProps(dispatch) {
|
|
202
266
|
return {
|
|
203
267
|
templatesActions: bindActionCreators(templatesActionsCreators, dispatch),
|
|
268
|
+
emailActions: bindActionCreators(emailActionsCreators, dispatch),
|
|
269
|
+
globalActions: bindActionCreators(globalActions, dispatch),
|
|
204
270
|
};
|
|
205
271
|
}
|
|
206
272
|
|
|
207
|
-
|
|
273
|
+
// Inject Email reducer and saga so that getCmsSetting action can be handled
|
|
274
|
+
const withReducer = injectReducer({ key: 'email', reducer: v2EmailReducer });
|
|
275
|
+
const withEmailSaga = injectSaga({ key: 'email', saga: v2EmailSagas });
|
|
276
|
+
|
|
277
|
+
const ConnectedEmailWrapper = connect(mapStateToProps, mapDispatchToProps)(injectIntl(EmailWrapper));
|
|
278
|
+
|
|
279
|
+
export default compose(
|
|
280
|
+
UserIsAuthenticated,
|
|
281
|
+
withReducer,
|
|
282
|
+
withEmailSaga,
|
|
283
|
+
)(ConnectedEmailWrapper);
|
|
@@ -60,6 +60,66 @@ export default defineMessages({
|
|
|
60
60
|
},
|
|
61
61
|
emptyTemplateName: {
|
|
62
62
|
id: `creatives.containersV2.EmailWrapper.emptyTemplateName`,
|
|
63
|
-
defaultMessage: `Please enter template name
|
|
63
|
+
defaultMessage: `Please enter template name.`,
|
|
64
|
+
},
|
|
65
|
+
htmlEditorTitle: {
|
|
66
|
+
id: 'creatives.EmailWrapper.htmlEditorTitle',
|
|
67
|
+
defaultMessage: 'HTML editor',
|
|
68
|
+
},
|
|
69
|
+
htmlEditorDesc: {
|
|
70
|
+
id: 'creatives.EmailWrapper.htmlEditorDesc',
|
|
71
|
+
defaultMessage: 'Use a basic HTML editor to write and format your content. Suitable if you are familiar with HTML.',
|
|
72
|
+
},
|
|
73
|
+
dragDropEditorTitle: {
|
|
74
|
+
id: 'creatives.EmailWrapper.dragDropEditorTitle',
|
|
75
|
+
defaultMessage: 'Drag & drop editor',
|
|
76
|
+
},
|
|
77
|
+
dragDropEditorDesc: {
|
|
78
|
+
id: 'creatives.EmailWrapper.dragDropEditorDesc',
|
|
79
|
+
defaultMessage: 'Create your content visually by dragging blocks — no coding needed. Great for quick, easy designs.',
|
|
80
|
+
},
|
|
81
|
+
uploadZipTitle: {
|
|
82
|
+
id: 'creatives.EmailWrapper.uploadZipTitle',
|
|
83
|
+
defaultMessage: 'Upload zip file',
|
|
84
|
+
},
|
|
85
|
+
uploadZipDesc: {
|
|
86
|
+
id: 'creatives.EmailWrapper.uploadZipDesc',
|
|
87
|
+
defaultMessage: 'Upload a ZIP containing your custom HTML, images, and assets. Ideal if your content is already built.',
|
|
88
|
+
},
|
|
89
|
+
next: {
|
|
90
|
+
id: 'creatives.EmailWrapper.next',
|
|
91
|
+
defaultMessage: 'Next',
|
|
92
|
+
},
|
|
93
|
+
beeEditorDisabledTooltip: {
|
|
94
|
+
id: 'creatives.EmailWrapper.beeEditorDisabledTooltip',
|
|
95
|
+
defaultMessage: 'Please get the drag & drop editor enabled for your brand',
|
|
96
|
+
},
|
|
97
|
+
emailContent: {
|
|
98
|
+
id: 'creatives.containersV2.Email.emailContent',
|
|
99
|
+
defaultMessage: 'Email content',
|
|
100
|
+
},
|
|
101
|
+
create: {
|
|
102
|
+
id: 'creatives.containersV2.EmailWrapper.create',
|
|
103
|
+
defaultMessage: 'Create',
|
|
104
|
+
},
|
|
105
|
+
update: {
|
|
106
|
+
id: 'creatives.containersV2.EmailWrapper.update',
|
|
107
|
+
defaultMessage: 'Update',
|
|
108
|
+
},
|
|
109
|
+
previewAndTest: {
|
|
110
|
+
id: 'creatives.containersV2.EmailWrapper.previewAndTest',
|
|
111
|
+
defaultMessage: 'Preview and Test',
|
|
112
|
+
},
|
|
113
|
+
required: {
|
|
114
|
+
id: 'creatives.containersV2.EmailWrapper.required',
|
|
115
|
+
defaultMessage: 'Required',
|
|
116
|
+
},
|
|
117
|
+
subject: {
|
|
118
|
+
id: 'creatives.containersV2.EmailWrapper.subject',
|
|
119
|
+
defaultMessage: 'Subject',
|
|
120
|
+
},
|
|
121
|
+
enterEmailSubject: {
|
|
122
|
+
id: 'creatives.containersV2.EmailWrapper.enterEmailSubject',
|
|
123
|
+
defaultMessage: 'Enter Email Subject',
|
|
64
124
|
},
|
|
65
125
|
});
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import useEmailWrapper from '../hooks/useEmailWrapper';
|
|
3
|
-
import { EmailWrapperMockData } from '../mockdata/mockdata';
|
|
4
1
|
import _, { isEmpty, find } from 'lodash';
|
|
5
2
|
import { renderHook, waitFor, act as reactAct } from '@testing-library/react';
|
|
3
|
+
import useEmailWrapper from '../hooks/useEmailWrapper';
|
|
4
|
+
import { EmailWrapperMockData } from '../mockdata/mockdata';
|
|
6
5
|
import { EMAIL_CREATE_MODES, STEPS } from '../constants';
|
|
7
|
-
import { GA } from '@capillarytech/cap-ui-utils';
|
|
8
6
|
import { gtmPush } from '../../../utils/gtmTrackers';
|
|
9
7
|
|
|
10
8
|
// Mock dependencies
|
|
11
9
|
jest.mock('lodash', () => ({
|
|
12
10
|
...jest.requireActual('lodash'),
|
|
13
|
-
isEmpty: jest.fn().mockImplementation(val => {
|
|
11
|
+
isEmpty: jest.fn().mockImplementation((val) => {
|
|
14
12
|
if (val === null || val === undefined) return true;
|
|
15
13
|
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
16
14
|
if (typeof val === 'string') return val.trim().length === 0;
|
|
@@ -31,6 +29,10 @@ jest.mock('../../../utils/gtmTrackers', () => ({
|
|
|
31
29
|
gtmPush: jest.fn(),
|
|
32
30
|
}));
|
|
33
31
|
|
|
32
|
+
jest.mock('../../../utils/common', () => ({
|
|
33
|
+
hasSupportCKEditor: jest.fn(() => true), // Default to legacy flow
|
|
34
|
+
}));
|
|
35
|
+
|
|
34
36
|
const mockStopTimer = jest.fn();
|
|
35
37
|
|
|
36
38
|
jest.mock('@capillarytech/cap-ui-utils', () => ({
|
|
@@ -39,8 +41,8 @@ jest.mock('@capillarytech/cap-ui-utils', () => ({
|
|
|
39
41
|
timeTracker: {
|
|
40
42
|
startTimer: jest.fn(),
|
|
41
43
|
stopTimer: jest.fn(),
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
+
},
|
|
45
|
+
},
|
|
44
46
|
}));
|
|
45
47
|
|
|
46
48
|
describe('useEmailWrapper', () => {
|
|
@@ -54,12 +56,12 @@ describe('useEmailWrapper', () => {
|
|
|
54
56
|
gtmPush.mockClear();
|
|
55
57
|
mockStopTimer.mockClear();
|
|
56
58
|
|
|
57
|
-
isEmpty.mockImplementation(val => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
isEmpty.mockImplementation((val) => {
|
|
60
|
+
if (val === null || val === undefined) return true;
|
|
61
|
+
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
62
|
+
if (typeof val === 'string') return val.trim().length === 0;
|
|
63
|
+
return !val;
|
|
64
|
+
});
|
|
63
65
|
|
|
64
66
|
mockProps = {
|
|
65
67
|
...EmailWrapperMockData,
|
|
@@ -149,7 +151,8 @@ describe('useEmailWrapper', () => {
|
|
|
149
151
|
result.current.onChange({ target: { value: EMAIL_CREATE_MODES.UPLOAD } });
|
|
150
152
|
});
|
|
151
153
|
|
|
152
|
-
|
|
154
|
+
// onEmailModeChange is called with (mappedValue, value) - both are UPLOAD in this case
|
|
155
|
+
expect(mockProps.onEmailModeChange).toHaveBeenCalledWith(EMAIL_CREATE_MODES.UPLOAD, EMAIL_CREATE_MODES.UPLOAD);
|
|
153
156
|
});
|
|
154
157
|
|
|
155
158
|
it('handles zip file upload correctly and calls success callbacks', () => {
|
|
@@ -168,7 +171,7 @@ describe('useEmailWrapper', () => {
|
|
|
168
171
|
const mockFile = {
|
|
169
172
|
name: 'test.zip',
|
|
170
173
|
size: 1024 * 1024,
|
|
171
|
-
originFileObj: new Blob(['test data'], { type: 'application/zip' })
|
|
174
|
+
originFileObj: new Blob(['test data'], { type: 'application/zip' }),
|
|
172
175
|
};
|
|
173
176
|
|
|
174
177
|
reactAct(() => {
|
|
@@ -201,7 +204,7 @@ describe('useEmailWrapper', () => {
|
|
|
201
204
|
const mockFile = {
|
|
202
205
|
name: 'test.zip',
|
|
203
206
|
size: 1024 * 1024,
|
|
204
|
-
originFileObj: new Blob(['test data'], { type: 'application/zip' })
|
|
207
|
+
originFileObj: new Blob(['test data'], { type: 'application/zip' }),
|
|
205
208
|
};
|
|
206
209
|
|
|
207
210
|
reactAct(() => {
|
|
@@ -218,13 +221,13 @@ describe('useEmailWrapper', () => {
|
|
|
218
221
|
const mockFile = {
|
|
219
222
|
name: 'test.html',
|
|
220
223
|
size: 1024,
|
|
221
|
-
originFileObj: new Blob([mockHtmlContent], { type: 'text/html' })
|
|
224
|
+
originFileObj: new Blob([mockHtmlContent], { type: 'text/html' }),
|
|
222
225
|
};
|
|
223
226
|
|
|
224
227
|
const mockReader = {
|
|
225
228
|
onload: null,
|
|
226
229
|
onerror: null,
|
|
227
|
-
readAsText: jest.fn(function() {
|
|
230
|
+
readAsText: jest.fn(function () {
|
|
228
231
|
this.result = mockHtmlContent;
|
|
229
232
|
if (this.onload) {
|
|
230
233
|
this.onload();
|
|
@@ -257,13 +260,13 @@ describe('useEmailWrapper', () => {
|
|
|
257
260
|
it('shows error for invalid file type during upload', () => {
|
|
258
261
|
const { result } = renderHook(() => useEmailWrapper({
|
|
259
262
|
...mockProps,
|
|
260
|
-
isUploading: false
|
|
263
|
+
isUploading: false,
|
|
261
264
|
}));
|
|
262
265
|
|
|
263
266
|
const mockFile = {
|
|
264
267
|
name: 'test.txt',
|
|
265
268
|
size: 1024,
|
|
266
|
-
originFileObj: new Blob(['test data'], { type: 'text/plain' })
|
|
269
|
+
originFileObj: new Blob(['test data'], { type: 'text/plain' }),
|
|
267
270
|
};
|
|
268
271
|
|
|
269
272
|
reactAct(() => {
|
|
@@ -280,13 +283,13 @@ describe('useEmailWrapper', () => {
|
|
|
280
283
|
it('shows error for oversized file during upload', () => {
|
|
281
284
|
const { result } = renderHook(() => useEmailWrapper({
|
|
282
285
|
...mockProps,
|
|
283
|
-
isUploading: false
|
|
286
|
+
isUploading: false,
|
|
284
287
|
}));
|
|
285
288
|
|
|
286
289
|
const mockFile = {
|
|
287
290
|
name: 'large_file.zip',
|
|
288
291
|
size: 6 * 1024 * 1024,
|
|
289
|
-
originFileObj: new Blob(['large data'], { type: 'application/zip' })
|
|
292
|
+
originFileObj: new Blob(['large data'], { type: 'application/zip' }),
|
|
290
293
|
};
|
|
291
294
|
|
|
292
295
|
reactAct(() => {
|
|
@@ -294,7 +297,7 @@ describe('useEmailWrapper', () => {
|
|
|
294
297
|
});
|
|
295
298
|
|
|
296
299
|
expect(mockCapNotificationError).toHaveBeenCalledWith(expect.objectContaining({
|
|
297
|
-
|
|
300
|
+
key: "email-upload-error",
|
|
298
301
|
}));
|
|
299
302
|
expect(mockProps.templatesActions.handleZipUpload).not.toHaveBeenCalled();
|
|
300
303
|
});
|
|
@@ -302,21 +305,21 @@ describe('useEmailWrapper', () => {
|
|
|
302
305
|
it('shows error if no file or originFileObj is provided for upload', () => {
|
|
303
306
|
const { result } = renderHook(() => useEmailWrapper({
|
|
304
307
|
...mockProps,
|
|
305
|
-
isUploading: false
|
|
308
|
+
isUploading: false,
|
|
306
309
|
}));
|
|
307
310
|
|
|
308
311
|
reactAct(() => {
|
|
309
312
|
result.current.useFileUpload({ file: null });
|
|
310
313
|
});
|
|
311
314
|
expect(mockCapNotificationError).toHaveBeenCalledTimes(1);
|
|
312
|
-
expect(mockCapNotificationError).toHaveBeenCalledWith(expect.objectContaining({ key: "email-upload-error"}));
|
|
315
|
+
expect(mockCapNotificationError).toHaveBeenCalledWith(expect.objectContaining({ key: "email-upload-error" }));
|
|
313
316
|
|
|
314
317
|
mockCapNotificationError.mockClear();
|
|
315
318
|
reactAct(() => {
|
|
316
|
-
|
|
319
|
+
result.current.useFileUpload({ file: { name: 'test.zip', size: 100 } });
|
|
317
320
|
});
|
|
318
321
|
expect(mockCapNotificationError).toHaveBeenCalledTimes(1);
|
|
319
|
-
expect(mockCapNotificationError).toHaveBeenCalledWith(expect.objectContaining({ key: "email-upload-error"}));
|
|
322
|
+
expect(mockCapNotificationError).toHaveBeenCalledWith(expect.objectContaining({ key: "email-upload-error" }));
|
|
320
323
|
|
|
321
324
|
expect(mockProps.templatesActions.handleZipUpload).not.toHaveBeenCalled();
|
|
322
325
|
expect(mockProps.templatesActions.handleHtmlUpload).not.toHaveBeenCalled();
|
|
@@ -335,6 +338,10 @@ describe('useEmailWrapper', () => {
|
|
|
335
338
|
});
|
|
336
339
|
|
|
337
340
|
it('calls getDefaultBeeTemplates in useEffect when in EDITOR mode, TEMPLATE_SELECTION step, and no templates', () => {
|
|
341
|
+
// Ensure hasSupportCKEditor returns true for legacy flow
|
|
342
|
+
const { hasSupportCKEditor } = require('../../../utils/common');
|
|
343
|
+
hasSupportCKEditor.mockReturnValue(true);
|
|
344
|
+
|
|
338
345
|
renderHook(() => useEmailWrapper({
|
|
339
346
|
...mockProps,
|
|
340
347
|
step: STEPS.TEMPLATE_SELECTION,
|
|
@@ -367,6 +374,9 @@ describe('useEmailWrapper', () => {
|
|
|
367
374
|
});
|
|
368
375
|
|
|
369
376
|
it('calls setEdmTemplate/setBEETemplate in useEffect when in EDITOR mode and CREATE_TEMPLATE_CONTENT step', async () => {
|
|
377
|
+
// Ensure hasSupportCKEditor returns true for legacy flow
|
|
378
|
+
const { hasSupportCKEditor } = require('../../../utils/common');
|
|
379
|
+
hasSupportCKEditor.mockReturnValue(true);
|
|
370
380
|
// 1. Setup
|
|
371
381
|
const templateId = 'editorTemplate456';
|
|
372
382
|
const mockTemplateData = { _id: templateId, name: 'Selected Editor Template' };
|
|
@@ -397,7 +407,7 @@ describe('useEmailWrapper', () => {
|
|
|
397
407
|
// selectedCreateMode is initially '' from hook's useState
|
|
398
408
|
};
|
|
399
409
|
const { result, rerender } = renderHook((props) => useEmailWrapper(props), {
|
|
400
|
-
|
|
410
|
+
initialProps,
|
|
401
411
|
});
|
|
402
412
|
|
|
403
413
|
// 4. Simulate user selecting a template ID via the exposed callback (useEditor)
|
|
@@ -409,17 +419,21 @@ describe('useEmailWrapper', () => {
|
|
|
409
419
|
expect(result.current.modeContent).toEqual({ id: templateId }); // State updated
|
|
410
420
|
expect(mockProps.showNextStep).toHaveBeenCalledTimes(1); // User action effect
|
|
411
421
|
|
|
422
|
+
// Clear mocks after user action to isolate effect calls
|
|
423
|
+
mockProps.templatesActions.setEdmTemplate.mockClear();
|
|
424
|
+
mockProps.templatesActions.setBEETemplate.mockClear();
|
|
425
|
+
|
|
412
426
|
// 5. Rerender with step changed to CREATE_TEMPLATE_CONTENT
|
|
413
427
|
const createContentProps = {
|
|
414
428
|
...initialProps, // Base props
|
|
415
429
|
step: STEPS.CREATE_TEMPLATE_CONTENT, // *** Change step ***
|
|
416
|
-
SelectedEdmDefaultTemplate: null // *** Ensure this is null ***
|
|
430
|
+
SelectedEdmDefaultTemplate: null, // *** Ensure this is null ***
|
|
417
431
|
// The internal state `modeContent = { id: templateId }` persists
|
|
418
432
|
// The internal state `selectedCreateMode = ''` also persists (not changed yet)
|
|
419
433
|
};
|
|
420
434
|
|
|
421
435
|
// Mock isEmpty just before rerender for the specific check inside the effect
|
|
422
|
-
isEmpty.mockImplementation(val => {
|
|
436
|
+
isEmpty.mockImplementation((val) => {
|
|
423
437
|
// console.log('DEBUG: isEmpty called with', JSON.stringify(val)); // Optional debug
|
|
424
438
|
// Return true ONLY for the 'SelectedEdmDefaultTemplate' check (which is null)
|
|
425
439
|
if (val === null) return true;
|
|
@@ -434,28 +448,48 @@ describe('useEmailWrapper', () => {
|
|
|
434
448
|
|
|
435
449
|
// 6. Wait for effects triggered by the rerender
|
|
436
450
|
await reactAct(async () => {
|
|
437
|
-
//
|
|
438
|
-
await new Promise(resolve => setTimeout(resolve,
|
|
451
|
+
// Allow React to process the rerender and run effects
|
|
452
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
439
453
|
});
|
|
440
454
|
|
|
441
|
-
|
|
442
455
|
// Assert that the template setting actions were called as a result of the effect
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
456
|
+
// Note: The effect may run multiple times in React 18+ StrictMode or due to dependency changes
|
|
457
|
+
// We verify that it was called at least once with the correct data after clearing mocks
|
|
458
|
+
const setEdmTemplateCalls = mockProps.templatesActions.setEdmTemplate.mock.calls;
|
|
459
|
+
const setBEETemplateCalls = mockProps.templatesActions.setBEETemplate.mock.calls;
|
|
460
|
+
|
|
461
|
+
// The effect should call handleEdmDefaultTemplateSelection, which calls both functions
|
|
462
|
+
// We expect at least 1 call each after clearing mocks (the effect call)
|
|
463
|
+
expect(setEdmTemplateCalls.length).toBeGreaterThanOrEqual(1);
|
|
464
|
+
expect(setBEETemplateCalls.length).toBeGreaterThanOrEqual(1);
|
|
465
|
+
|
|
466
|
+
// Verify the first call after clearing was with the correct data
|
|
467
|
+
expect(setEdmTemplateCalls[0]).toEqual([mockTemplateData]);
|
|
468
|
+
expect(setBEETemplateCalls[0]).toEqual([mockTemplateData]);
|
|
469
|
+
|
|
470
|
+
// If there are multiple calls (due to effect running twice), verify all are correct
|
|
471
|
+
if (setEdmTemplateCalls.length > 1) {
|
|
472
|
+
setEdmTemplateCalls.forEach((call) => {
|
|
473
|
+
expect(call).toEqual([mockTemplateData]);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
if (setBEETemplateCalls.length > 1) {
|
|
477
|
+
setBEETemplateCalls.forEach((call) => {
|
|
478
|
+
expect(call).toEqual([mockTemplateData]);
|
|
479
|
+
});
|
|
480
|
+
}
|
|
447
481
|
});
|
|
448
482
|
|
|
449
483
|
it('sets selectedCreateMode in useEffect when in UPLOAD mode and CREATE_TEMPLATE_CONTENT step with EmailLayout', async () => {
|
|
450
484
|
const initialRenderProps = {
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
485
|
+
...mockProps,
|
|
486
|
+
step: STEPS.MODE_SELECTION,
|
|
487
|
+
emailCreateMode: EMAIL_CREATE_MODES.UPLOAD,
|
|
488
|
+
EmailLayout: null,
|
|
489
|
+
};
|
|
456
490
|
|
|
457
491
|
const { result, rerender } = renderHook((props) => useEmailWrapper(props), {
|
|
458
|
-
initialProps: initialRenderProps
|
|
492
|
+
initialProps: initialRenderProps,
|
|
459
493
|
});
|
|
460
494
|
|
|
461
495
|
const rerenderProps = {
|
|
@@ -467,11 +501,11 @@ describe('useEmailWrapper', () => {
|
|
|
467
501
|
|
|
468
502
|
// Reset isEmpty to default before setting the specific mock for the effect
|
|
469
503
|
isEmpty.mockImplementation((val) => {
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
504
|
+
if (val === null || val === undefined) return true;
|
|
505
|
+
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
506
|
+
if (typeof val === 'string') return val.trim().length === 0;
|
|
507
|
+
return !val;
|
|
508
|
+
});
|
|
475
509
|
// Mock isEmpty specifically for the EmailLayout check inside the useEffect
|
|
476
510
|
isEmpty.mockImplementationOnce(() => false); // Mock !isEmpty(EmailLayout) to be true
|
|
477
511
|
|
|
@@ -479,16 +513,16 @@ describe('useEmailWrapper', () => {
|
|
|
479
513
|
|
|
480
514
|
// Wait for the effect to run, set selectedCreateMode, and isShowEmailCreate to update
|
|
481
515
|
await waitFor(() => {
|
|
482
|
-
|
|
516
|
+
expect(result.current.isShowEmailCreate).toBe(true);
|
|
483
517
|
});
|
|
484
518
|
|
|
485
519
|
// Restore default isEmpty behavior after the specific mock is used
|
|
486
520
|
isEmpty.mockImplementation((val) => {
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
521
|
+
if (val === null || val === undefined) return true;
|
|
522
|
+
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
523
|
+
if (typeof val === 'string') return val.trim().length === 0;
|
|
524
|
+
return !val;
|
|
525
|
+
});
|
|
492
526
|
isEmpty.mockClear(); // Clear any remaining mock state if needed
|
|
493
527
|
|
|
494
528
|
expect(mockProps.templatesActions.setEdmTemplate).not.toHaveBeenCalled();
|
|
@@ -533,11 +567,11 @@ describe('useEmailWrapper', () => {
|
|
|
533
567
|
|
|
534
568
|
// Reset isEmpty to default before setting the specific mock for the effect
|
|
535
569
|
isEmpty.mockImplementation((val) => {
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
570
|
+
if (val === null || val === undefined) return true;
|
|
571
|
+
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
572
|
+
if (typeof val === 'string') return val.trim().length === 0;
|
|
573
|
+
return !val;
|
|
574
|
+
});
|
|
541
575
|
// Mock isEmpty specifically for the EmailLayout check inside the useEffect
|
|
542
576
|
isEmpty.mockImplementationOnce(() => false); // Mock !isEmpty(EmailLayout) to be true
|
|
543
577
|
|
|
@@ -545,16 +579,16 @@ describe('useEmailWrapper', () => {
|
|
|
545
579
|
|
|
546
580
|
// Wait for the effect to run, set selectedCreateMode, and isShowEmailCreate to update
|
|
547
581
|
await waitFor(() => {
|
|
548
|
-
|
|
582
|
+
expect(result.current.isShowEmailCreate).toBe(true);
|
|
549
583
|
});
|
|
550
584
|
|
|
551
585
|
// Restore default isEmpty behavior after the specific mock is used
|
|
552
586
|
isEmpty.mockImplementation((val) => {
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
587
|
+
if (val === null || val === undefined) return true;
|
|
588
|
+
if (typeof val === 'object') return Object.keys(val).length === 0;
|
|
589
|
+
if (typeof val === 'string') return val.trim().length === 0;
|
|
590
|
+
return !val;
|
|
591
|
+
});
|
|
558
592
|
isEmpty.mockClear(); // Clear any remaining mock state if needed
|
|
559
593
|
|
|
560
594
|
// --- Case 3: EDITOR mode selected, Template becomes available -> true (via effect) ---
|
|
@@ -563,11 +597,11 @@ describe('useEmailWrapper', () => {
|
|
|
563
597
|
find.mockReturnValue(mockTemplate); // Ensure find is mocked for this case
|
|
564
598
|
|
|
565
599
|
const editorPropsInitial = {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
600
|
+
...mockProps,
|
|
601
|
+
step: STEPS.TEMPLATE_SELECTION,
|
|
602
|
+
emailCreateMode: EMAIL_CREATE_MODES.EDITOR,
|
|
603
|
+
CmsTemplates: [mockTemplate],
|
|
604
|
+
SelectedEdmDefaultTemplate: null,
|
|
571
605
|
};
|
|
572
606
|
rerender(editorPropsInitial);
|
|
573
607
|
|
|
@@ -579,12 +613,12 @@ describe('useEmailWrapper', () => {
|
|
|
579
613
|
expect(result.current.modeContent).toEqual({ id: templateId });
|
|
580
614
|
|
|
581
615
|
const editorPropsFinal = {
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
616
|
+
...mockProps, // Use fresh props base
|
|
617
|
+
step: STEPS.CREATE_TEMPLATE_CONTENT, // Move to the create step
|
|
618
|
+
emailCreateMode: EMAIL_CREATE_MODES.EDITOR,
|
|
619
|
+
CmsTemplates: [mockTemplate],
|
|
620
|
+
SelectedEdmDefaultTemplate: null, // Template not yet selected in props
|
|
621
|
+
// modeContent state ({id: templateId}) should persist internally from the reactAct call
|
|
588
622
|
};
|
|
589
623
|
|
|
590
624
|
// Mock isEmpty specifically for the check within the useEffect triggered by rerender
|
|
@@ -598,4 +632,4 @@ describe('useEmailWrapper', () => {
|
|
|
598
632
|
find.mockClear();
|
|
599
633
|
isEmpty.mockClear();
|
|
600
634
|
});
|
|
601
|
-
});
|
|
635
|
+
});
|