@capillarytech/creatives-library 8.0.264 → 8.0.266-alpha.0
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 -2
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/services/api.js +10 -5
- 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 -6
- package/utils/commonUtils.js +28 -5
- package/utils/tagValidations.js +1 -2
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/tests/transformerUtils.test.js +0 -297
- package/utils/transformTemplateConfig.js +0 -10
- package/utils/transformerUtils.js +0 -40
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +16 -65
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +1 -5
- 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/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +2 -2
- 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/index.js +8 -8
- 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/App/constants.js +0 -5
- 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 +129 -108
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +163 -13
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +1 -3
- package/v2Containers/CreativesContainer/index.js +240 -214
- package/v2Containers/CreativesContainer/messages.js +8 -4
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +0 -210
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +11 -2
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -354
- 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 +241 -32
- 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 +211 -21
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +2472 -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 +629 -77
- package/v2Containers/EmailWrapper/index.js +103 -23
- package/v2Containers/EmailWrapper/messages.js +65 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +956 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +594 -77
- package/v2Containers/FTP/index.js +1 -1
- 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/Text/index.js +0 -1
- 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/MobilePushNew/index.js +0 -1
- package/v2Containers/Rcs/index.js +0 -3
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -0
- package/v2Containers/SmsTrai/Edit/index.js +0 -1
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
- package/v2Containers/TagList/index.js +62 -19
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +56 -202
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +123 -278
- 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/TemplatesV2.style.js +4 -2
- package/v2Containers/TemplatesV2/index.js +7 -15
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Viber/index.js +0 -1
- package/v2Containers/Whatsapp/index.js +0 -1
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -0
- package/v2Containers/Zalo/index.js +0 -1
- package/v2Containers/Zalo/tests/index.test.js +5 -1
- package/utils/imageUrlUpload.js +0 -141
- package/v2Components/CapImageUrlUpload/constants.js +0 -26
- package/v2Components/CapImageUrlUpload/index.js +0 -365
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +0 -152
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +0 -214
- package/v2Containers/WebPush/Create/components/BrandIconSection.js +0 -108
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -172
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -145
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +0 -164
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +0 -463
- package/v2Containers/WebPush/Create/components/FormActions.js +0 -54
- package/v2Containers/WebPush/Create/components/FormActions.test.js +0 -163
- package/v2Containers/WebPush/Create/components/MediaSection.js +0 -142
- package/v2Containers/WebPush/Create/components/MediaSection.test.js +0 -341
- package/v2Containers/WebPush/Create/components/MessageSection.js +0 -103
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +0 -268
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +0 -87
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +0 -210
- package/v2Containers/WebPush/Create/components/TemplateNameSection.js +0 -54
- package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +0 -143
- package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +0 -86
- package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +0 -16
- package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +0 -41
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +0 -54
- package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +0 -37
- package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +0 -21
- 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 -78
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +0 -138
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +0 -406
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +0 -30
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +0 -151
- package/v2Containers/WebPush/Create/hooks/useImageUpload.js +0 -104
- package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +0 -538
- package/v2Containers/WebPush/Create/hooks/useTagManagement.js +0 -122
- package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +0 -633
- package/v2Containers/WebPush/Create/index.js +0 -1148
- package/v2Containers/WebPush/Create/index.scss +0 -134
- package/v2Containers/WebPush/Create/messages.js +0 -211
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -228
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -294
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -90
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -305
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -25
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -155
- 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/android-arrow-down.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +0 -9
- 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/macos-arrow-down-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +0 -9
- 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/assets/windows-close-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +0 -9
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -51
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -145
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -68
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -61
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -99
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -733
- package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +0 -571
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -85
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +0 -81
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -50
- package/v2Containers/WebPush/Create/preview/constants.js +0 -637
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -79
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -358
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -370
- 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 -47
- 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 -207
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -153
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -101
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -229
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1081
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -1327
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -131
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -112
- 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 -129
- package/v2Containers/WebPush/Create/utils/payloadBuilder.js +0 -96
- package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +0 -396
- package/v2Containers/WebPush/Create/utils/previewUtils.js +0 -89
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -115
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/Create/utils/validation.js +0 -76
- package/v2Containers/WebPush/Create/utils/validation.test.js +0 -283
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -132
- 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
|
@@ -10,6 +10,7 @@ import SmsWrapper from '../SmsWrapper';
|
|
|
10
10
|
import Email from '../Email';
|
|
11
11
|
import EmailWrapper from '../EmailWrapper';
|
|
12
12
|
import MobilepushWrapper from '../MobilepushWrapper';
|
|
13
|
+
import InAppWrapper from '../InAppWrapper';
|
|
13
14
|
import EmailPreviewV2 from '../../v2Components/EmailPreviewV2';
|
|
14
15
|
import MobilePushPreview from '../../v2Components/MobilePushPreviewV2';
|
|
15
16
|
import WechatWrapper from '../WeChat/Wrapper';
|
|
@@ -28,10 +29,6 @@ import { getWhatsappContent } from '../Whatsapp/utils';
|
|
|
28
29
|
import * as commonUtil from '../../utils/common';
|
|
29
30
|
import Zalo from '../Zalo';
|
|
30
31
|
import MobilePushNew from '../MobilePushNew';
|
|
31
|
-
import WebPush from '../WebPush';
|
|
32
|
-
import DevicePreviewContent from '../WebPush/Create/preview/DevicePreviewContent';
|
|
33
|
-
import { LAYOUT_MODE } from '../WebPush/Create/preview/constants';
|
|
34
|
-
import { WEBPUSH_CONTENT_FIELDS, WEBPUSH_TEMPLATE_PATHS } from '../WebPush/constants';
|
|
35
32
|
const CreativesWrapper = styled.div`
|
|
36
33
|
.ant-popover,
|
|
37
34
|
.ant-notification,
|
|
@@ -119,7 +116,11 @@ export function SlideBoxContent(props) {
|
|
|
119
116
|
emailCreateMode,
|
|
120
117
|
onMobilepushModeChange,
|
|
121
118
|
mobilePushCreateMode,
|
|
119
|
+
onInAppEditorTypeChange,
|
|
120
|
+
inAppEditorType,
|
|
122
121
|
templateStep,
|
|
122
|
+
inAppCreateMode,
|
|
123
|
+
onInAppModeChange,
|
|
123
124
|
onEnterTemplateName,
|
|
124
125
|
onRemoveTemplateName,
|
|
125
126
|
onCreateNextStep,
|
|
@@ -133,7 +134,6 @@ export function SlideBoxContent(props) {
|
|
|
133
134
|
onValidationFail,
|
|
134
135
|
channelsToHide,
|
|
135
136
|
forwardedTags,
|
|
136
|
-
supportedTags = [],
|
|
137
137
|
selectedOfferDetails,
|
|
138
138
|
channelsToDisable,
|
|
139
139
|
weChatTemplateType,
|
|
@@ -169,6 +169,7 @@ export function SlideBoxContent(props) {
|
|
|
169
169
|
handleTestAndPreview,
|
|
170
170
|
handleCloseTestAndPreview,
|
|
171
171
|
isTestAndPreviewMode,
|
|
172
|
+
onHtmlEditorValidationStateChange,
|
|
172
173
|
} = props;
|
|
173
174
|
const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
|
|
174
175
|
const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
|
|
@@ -205,7 +206,6 @@ export function SlideBoxContent(props) {
|
|
|
205
206
|
const isCreateRcs = isCreate && channel === constants.RCS;
|
|
206
207
|
const isCreateMPush = isCreate && channel === constants.MOBILE_PUSH;
|
|
207
208
|
const isCreateCallTask = isCreate && channel === constants.CALL_TASK;
|
|
208
|
-
const isCreateWebPush = isCreate && channel === constants.WEBPUSH;
|
|
209
209
|
let isEditSms = false;
|
|
210
210
|
let isEditEmailWithId = false;
|
|
211
211
|
let isEmailEditWithContent = false;
|
|
@@ -213,14 +213,12 @@ export function SlideBoxContent(props) {
|
|
|
213
213
|
let isEmailPreview = false;
|
|
214
214
|
let isMpushPreview = false;
|
|
215
215
|
let isInappPreview = false;
|
|
216
|
-
let isWebPushPreview = false;
|
|
217
216
|
let isEditCallTask = false;
|
|
218
217
|
let isEditMPush = false;
|
|
219
218
|
let isEditFacebook = false;
|
|
220
219
|
let isEditFTP = false;
|
|
221
220
|
let isEditWhatsapp = false;
|
|
222
221
|
let isEditInApp = false;
|
|
223
|
-
let isEditWebPush = false;
|
|
224
222
|
let isEditRcs = false;
|
|
225
223
|
let isEditZalo = false;
|
|
226
224
|
const isEmailCreate = isCreate && channel === constants.EMAIL;
|
|
@@ -234,12 +232,10 @@ export function SlideBoxContent(props) {
|
|
|
234
232
|
isEditFacebook = isEdit && channel === constants.FACEBOOK;
|
|
235
233
|
isEditWhatsapp = isEdit && channel === constants.WHATSAPP;
|
|
236
234
|
isEditRcs = isEdit && channel === constants.RCS;
|
|
237
|
-
isEditWebPush = isEdit && channel === constants.WEBPUSH;
|
|
238
235
|
isPreview = slidBoxContent === 'preview' && [constants.SMS, constants.LINE, constants.WHATSAPP, constants.FACEBOOK, constants.VIBER, constants.RCS].includes(channel);
|
|
239
236
|
isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
|
|
240
237
|
isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
|
|
241
238
|
isInappPreview = slidBoxContent === 'preview' && channel === constants.INAPP;
|
|
242
|
-
isWebPushPreview = slidBoxContent === 'preview' && channel === constants.WEBPUSH;
|
|
243
239
|
isEditFTP = isEdit && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
|
|
244
240
|
isEditZalo = isEdit && channel?.toUpperCase() === constants.ZALO;
|
|
245
241
|
isEditInApp = isEdit && channel === constants.INAPP;
|
|
@@ -487,30 +483,8 @@ export function SlideBoxContent(props) {
|
|
|
487
483
|
templateData={templateData}
|
|
488
484
|
channel={channel}
|
|
489
485
|
forwardedTags={forwardedTags}
|
|
490
|
-
|
|
486
|
+
/>
|
|
491
487
|
)}
|
|
492
|
-
{isWebPushPreview && (() => {
|
|
493
|
-
const webpushContent = get(templateData, WEBPUSH_TEMPLATE_PATHS.CONTENT, {});
|
|
494
|
-
const notificationTitle = webpushContent?.[WEBPUSH_CONTENT_FIELDS.TITLE] || '';
|
|
495
|
-
const notificationBody = webpushContent?.[WEBPUSH_CONTENT_FIELDS.MESSAGE] || '';
|
|
496
|
-
const imageSrc = webpushContent?.[WEBPUSH_CONTENT_FIELDS.IMAGE] || '';
|
|
497
|
-
const brandIconSrc = webpushContent?.[WEBPUSH_CONTENT_FIELDS.BRAND_ICON] || '';
|
|
498
|
-
// Extract URL from onClickAction or use empty string
|
|
499
|
-
const url = webpushContent?.[WEBPUSH_CONTENT_FIELDS.ON_CLICK_ACTION]?.url || '';
|
|
500
|
-
|
|
501
|
-
return (
|
|
502
|
-
<div className="webpush-preview-container">
|
|
503
|
-
<DevicePreviewContent
|
|
504
|
-
notificationTitle={notificationTitle}
|
|
505
|
-
notificationBody={notificationBody}
|
|
506
|
-
url={url}
|
|
507
|
-
imageSrc={imageSrc}
|
|
508
|
-
brandIconSrc={brandIconSrc}
|
|
509
|
-
layoutMode={LAYOUT_MODE.COMPACT}
|
|
510
|
-
/>
|
|
511
|
-
</div>
|
|
512
|
-
);
|
|
513
|
-
})()}
|
|
514
488
|
|
|
515
489
|
{
|
|
516
490
|
(currentChannel === constants.WECHAT && !!slidBoxContent) && <WechatWrapper
|
|
@@ -668,44 +642,95 @@ export function SlideBoxContent(props) {
|
|
|
668
642
|
handleTestAndPreview={handleTestAndPreview}
|
|
669
643
|
handleCloseTestAndPreview={handleCloseTestAndPreview}
|
|
670
644
|
isTestAndPreviewMode={isTestAndPreviewMode}
|
|
645
|
+
location={location}
|
|
646
|
+
onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
|
|
671
647
|
/>
|
|
672
648
|
)}
|
|
673
649
|
{(isEditEmailWithId || isEmailEditWithContent) && (
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
650
|
+
(() => {
|
|
651
|
+
const supportCKEditor = commonUtil.hasSupportCKEditor();
|
|
652
|
+
// When supportCKEditor is true: Always use Email component (legacy flow)
|
|
653
|
+
if (supportCKEditor || templateData?.is_drag_drop) {
|
|
654
|
+
return (
|
|
655
|
+
<Email
|
|
656
|
+
key="cretives-container-email-edit"
|
|
657
|
+
setIsLoadingContent={setIsLoadingContent}
|
|
658
|
+
location={{
|
|
659
|
+
pathname: `/email/edit`,
|
|
660
|
+
query: { type: 'embedded', module: 'library'},
|
|
661
|
+
}}
|
|
662
|
+
route={{ name: 'email' }}
|
|
663
|
+
isGetFormData={isGetFormData}
|
|
664
|
+
getFormdata={getFormData}
|
|
665
|
+
params={{ id: templateData._id }}
|
|
666
|
+
templateData={templateData}
|
|
667
|
+
getFormSubscriptionData={getFormData}
|
|
668
|
+
getDefaultTags={type}
|
|
669
|
+
isFullMode={isFullMode}
|
|
670
|
+
editor={editor}
|
|
671
|
+
cap={cap}
|
|
672
|
+
showTemplateName={showTemplateName}
|
|
673
|
+
onValidationFail={onValidationFail}
|
|
674
|
+
forwardedTags={forwardedTags}
|
|
675
|
+
selectedOfferDetails={selectedOfferDetails}
|
|
676
|
+
onPreviewContentClicked={onPreviewContentClicked}
|
|
677
|
+
onTestContentClicked={onTestContentClicked}
|
|
678
|
+
moduleType={moduleType}
|
|
679
|
+
showLiquidErrorInFooter={showLiquidErrorInFooter}
|
|
680
|
+
eventContextTags={eventContextTags}
|
|
681
|
+
isLoyaltyModule={isLoyaltyModule}
|
|
682
|
+
showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
|
|
683
|
+
handleTestAndPreview={handleTestAndPreview}
|
|
684
|
+
handleCloseTestAndPreview={handleCloseTestAndPreview}
|
|
685
|
+
isTestAndPreviewMode={isTestAndPreviewMode}
|
|
686
|
+
onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
|
|
687
|
+
/>
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
// HTML template: Use EmailWrapper component (which uses EmailWithoutSaga)
|
|
691
|
+
return (
|
|
692
|
+
<EmailWrapper
|
|
693
|
+
key="cretives-container-email-edit-wrapper"
|
|
694
|
+
setIsLoadingContent={setIsLoadingContent}
|
|
695
|
+
onEmailModeChange={onEmailModeChange}
|
|
696
|
+
emailCreateMode="editor"
|
|
697
|
+
isGetFormData={isGetFormData}
|
|
698
|
+
getFormdata={getFormData}
|
|
699
|
+
templateData={templateData}
|
|
700
|
+
type={type}
|
|
701
|
+
step="createTemplateContent"
|
|
702
|
+
showNextStep={onCreateNextStep}
|
|
703
|
+
isFullMode={isFullMode}
|
|
704
|
+
editor={editor}
|
|
705
|
+
cap={cap}
|
|
706
|
+
onResetStep={onResetStep}
|
|
707
|
+
showTemplateName={showTemplateName}
|
|
708
|
+
onEnterTemplateName={onEnterTemplateName}
|
|
709
|
+
onRemoveTemplateName={onRemoveTemplateName}
|
|
710
|
+
onValidationFail={onValidationFail}
|
|
711
|
+
forwardedTags={forwardedTags}
|
|
712
|
+
selectedOfferDetails={selectedOfferDetails}
|
|
713
|
+
onPreviewContentClicked={onPreviewContentClicked}
|
|
714
|
+
onTestContentClicked={onTestContentClicked}
|
|
715
|
+
getCmsTemplatesInProgress={getCmsTemplatesInProgress}
|
|
716
|
+
moduleType={moduleType}
|
|
717
|
+
showLiquidErrorInFooter={showLiquidErrorInFooter}
|
|
718
|
+
eventContextTags={eventContextTags}
|
|
719
|
+
isLoyaltyModule={isLoyaltyModule}
|
|
720
|
+
showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
|
|
721
|
+
handleTestAndPreview={handleTestAndPreview}
|
|
722
|
+
handleCloseTestAndPreview={handleCloseTestAndPreview}
|
|
723
|
+
isTestAndPreviewMode={isTestAndPreviewMode}
|
|
724
|
+
onHtmlEditorValidationStateChange={onHtmlEditorValidationStateChange}
|
|
725
|
+
location={{
|
|
726
|
+
pathname: `/email/edit/${templateData._id}`,
|
|
727
|
+
query: { type: 'embedded', module: 'library', id: templateData._id },
|
|
728
|
+
}}
|
|
729
|
+
params={{ id: templateData._id }}
|
|
730
|
+
/>
|
|
731
|
+
);
|
|
732
|
+
})()
|
|
733
|
+
)}
|
|
709
734
|
{isEditMPush && (
|
|
710
735
|
(isFullMode && !commonUtil.hasNewMobilePushFeatureEnabled()) ||
|
|
711
736
|
(!isFullMode && isLoyaltyModule) ||
|
|
@@ -999,22 +1024,39 @@ export function SlideBoxContent(props) {
|
|
|
999
1024
|
/>
|
|
1000
1025
|
)}
|
|
1001
1026
|
|
|
1002
|
-
{isCreateInApp && (
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1027
|
+
{isCreateInApp && (
|
|
1028
|
+
<InAppWrapper
|
|
1029
|
+
key="creatives-inapp-wrapper"
|
|
1030
|
+
date={new Date().getMilliseconds()}
|
|
1031
|
+
setIsLoadingContent={setIsLoadingContent}
|
|
1032
|
+
onInAppEditorTypeChange={onInAppEditorTypeChange}
|
|
1033
|
+
inAppEditorType={inAppEditorType}
|
|
1034
|
+
isGetFormData={isGetFormData}
|
|
1035
|
+
getFormdata={getFormData}
|
|
1036
|
+
templateData={templateData}
|
|
1037
|
+
type={type}
|
|
1038
|
+
step={templateStep}
|
|
1039
|
+
showNextStep={onCreateNextStep}
|
|
1040
|
+
isFullMode={isFullMode}
|
|
1041
|
+
cap={cap}
|
|
1042
|
+
onResetStep={onResetStep}
|
|
1043
|
+
showTemplateName={showTemplateName}
|
|
1044
|
+
onEnterTemplateName={onEnterTemplateName}
|
|
1045
|
+
onRemoveTemplateName={onRemoveTemplateName}
|
|
1046
|
+
onValidationFail={onValidationFail}
|
|
1047
|
+
forwardedTags={forwardedTags}
|
|
1048
|
+
selectedOfferDetails={selectedOfferDetails}
|
|
1049
|
+
onPreviewContentClicked={onPreviewContentClicked}
|
|
1050
|
+
onTestContentClicked={onTestContentClicked}
|
|
1051
|
+
moduleType={moduleType}
|
|
1052
|
+
showLiquidErrorInFooter={showLiquidErrorInFooter}
|
|
1053
|
+
eventContextTags={eventContextTags}
|
|
1054
|
+
onCreateComplete={onCreateComplete}
|
|
1055
|
+
handleClose={handleClose}
|
|
1056
|
+
getDefaultTags={type}
|
|
1057
|
+
onInAppModeChange={onInAppModeChange}
|
|
1058
|
+
inAppCreateMode={inAppCreateMode}
|
|
1059
|
+
showTestAndPreviewSlidebox={showTestAndPreviewSlidebox}
|
|
1018
1060
|
handleTestAndPreview={handleTestAndPreview}
|
|
1019
1061
|
handleCloseTestAndPreview={handleCloseTestAndPreview}
|
|
1020
1062
|
isTestAndPreviewMode={isTestAndPreviewMode}
|
|
@@ -1046,28 +1088,6 @@ export function SlideBoxContent(props) {
|
|
|
1046
1088
|
/>
|
|
1047
1089
|
)}
|
|
1048
1090
|
|
|
1049
|
-
{(isCreateWebPush || isEditWebPush) && (
|
|
1050
|
-
<WebPush
|
|
1051
|
-
isFullMode={isFullMode}
|
|
1052
|
-
handleClose={handleClose}
|
|
1053
|
-
onCreateComplete={onCreateComplete}
|
|
1054
|
-
getFormData={getFormData}
|
|
1055
|
-
isGetFormData={isGetFormData}
|
|
1056
|
-
templateData={isEditWebPush ? templateData : undefined}
|
|
1057
|
-
creativesMode={creativesMode}
|
|
1058
|
-
params={isEditWebPush && templateData ? { id: templateData._id } : undefined}
|
|
1059
|
-
location={{
|
|
1060
|
-
pathname: isEditWebPush ? '/webpush/edit' : '/webpush/create',
|
|
1061
|
-
query,
|
|
1062
|
-
search: '',
|
|
1063
|
-
}}
|
|
1064
|
-
getDefaultTags={type}
|
|
1065
|
-
forwardedTags={forwardedTags}
|
|
1066
|
-
supportedTags={supportedTags}
|
|
1067
|
-
selectedOfferDetails={selectedOfferDetails}
|
|
1068
|
-
eventContextTags={eventContextTags}
|
|
1069
|
-
/>
|
|
1070
|
-
)}
|
|
1071
1091
|
{isCreateRcs && (<Rcs
|
|
1072
1092
|
{...rcsCommonProps}
|
|
1073
1093
|
showLiquidErrorInFooter={showLiquidErrorInFooter}
|
|
@@ -1105,6 +1125,8 @@ SlideBoxContent.propTypes = {
|
|
|
1105
1125
|
onSelectTemplate: PropTypes.func,
|
|
1106
1126
|
onPreviewTemplate: PropTypes.func,
|
|
1107
1127
|
templateData: PropTypes.object,
|
|
1128
|
+
onInAppEditorTypeChange: PropTypes.func,
|
|
1129
|
+
inAppEditorType: PropTypes.object,
|
|
1108
1130
|
location: PropTypes.object,
|
|
1109
1131
|
isGetFormData: PropTypes.bool,
|
|
1110
1132
|
getFormData: PropTypes.func,
|
|
@@ -1130,7 +1152,6 @@ SlideBoxContent.propTypes = {
|
|
|
1130
1152
|
onValidationFail: PropTypes.func,
|
|
1131
1153
|
channelsToHide: PropTypes.array,
|
|
1132
1154
|
forwardedTags: PropTypes.object,
|
|
1133
|
-
supportedTags: PropTypes.array,
|
|
1134
1155
|
selectedOfferDetails: PropTypes.array,
|
|
1135
1156
|
channelsToDisable: PropTypes.array,
|
|
1136
1157
|
weChatTemplateType: PropTypes.string,
|
|
@@ -1146,7 +1167,7 @@ SlideBoxContent.propTypes = {
|
|
|
1146
1167
|
onFTPSubmit: PropTypes.func,
|
|
1147
1168
|
messageStrategy: PropTypes.string,
|
|
1148
1169
|
fbAdManager: PropTypes.string,
|
|
1149
|
-
showDisabledFBInfo: PropTypes.
|
|
1170
|
+
showDisabledFBInfo: PropTypes.boolean,
|
|
1150
1171
|
orgUnitId: PropTypes.any,
|
|
1151
1172
|
smsRegister: PropTypes.any,
|
|
1152
1173
|
getCmsTemplatesInProgress: PropTypes.bool,
|
|
@@ -7,12 +7,15 @@ import PropTypes from 'prop-types';
|
|
|
7
7
|
import messages from './messages';
|
|
8
8
|
import ErrorInfoNote from '../../v2Components/ErrorInfoNote';
|
|
9
9
|
import { PREVIEW } from './constants';
|
|
10
|
+
import { EMAIL_CREATE_MODES } from '../EmailWrapper/constants';
|
|
10
11
|
|
|
11
|
-
function getFullModeSaveBtn(slidBoxContent) {
|
|
12
|
-
|
|
13
|
-
<FormattedMessage {...messages.
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
function getFullModeSaveBtn(slidBoxContent, isCreatingTemplate) {
|
|
13
|
+
if (isCreatingTemplate) {
|
|
14
|
+
return <FormattedMessage {...messages.creativesTemplatesDone} />;
|
|
15
|
+
}
|
|
16
|
+
return slidBoxContent === "editTemplate"
|
|
17
|
+
? <FormattedMessage {...messages.creativesTemplatesUpdate} />
|
|
18
|
+
: <FormattedMessage {...messages.creativesTemplatesSaveFullMode} />;
|
|
16
19
|
}
|
|
17
20
|
function SlideBoxFooter(props) {
|
|
18
21
|
const {
|
|
@@ -24,18 +27,119 @@ function SlideBoxFooter(props) {
|
|
|
24
27
|
fetchingCmsData,
|
|
25
28
|
isTemplateNameEmpty,
|
|
26
29
|
errorMessages,
|
|
27
|
-
|
|
30
|
+
// eslint-disable-next-line no-unused-vars
|
|
31
|
+
isLiquidValidationError, // Legacy prop, kept for PropTypes compatibility
|
|
28
32
|
currentTab,
|
|
29
33
|
onTestAndPreview,
|
|
30
34
|
// isEmptyContent,
|
|
31
35
|
showTestAndPreviewButton,
|
|
32
36
|
shouldShowDoneFooter,
|
|
33
37
|
shouldShowContinueFooter,
|
|
38
|
+
isContinueButtonDisabled,
|
|
39
|
+
continueButtonLabel,
|
|
40
|
+
htmlEditorValidationState,
|
|
41
|
+
isCreatingTemplate,
|
|
42
|
+
currentChannel,
|
|
43
|
+
emailCreateMode,
|
|
44
|
+
selectedEmailCreateMode,
|
|
34
45
|
} = props;
|
|
35
46
|
|
|
47
|
+
// Calculate if buttons should be disabled
|
|
48
|
+
// Only apply validation state checks for EMAIL channel in HTML Editor mode (not BEE/DragDrop)
|
|
49
|
+
// For other channels, BEE editor, or when htmlEditorValidationState is not provided, don't disable based on validation
|
|
50
|
+
const isEmailChannel = currentChannel?.toUpperCase() === 'EMAIL';
|
|
51
|
+
const isEditMode = slidBoxContent === 'editTemplate';
|
|
52
|
+
|
|
53
|
+
// Use selectedEmailCreateMode for accurate mode detection in create mode (emailCreateMode is mapped for backwards compatibility)
|
|
54
|
+
// In edit mode: htmlEditorValidationState is initialized as {} but only updated by HTML Editor
|
|
55
|
+
// If it's still in initial state (validationComplete === false, issueCounts.total === 0), it's BEE editor
|
|
56
|
+
// Upload mode also uses HTML Editor, so include it in HTML Editor mode check
|
|
57
|
+
const isUploadMode = emailCreateMode === EMAIL_CREATE_MODES.UPLOAD;
|
|
58
|
+
const isHTMLEditorModeInCreate = selectedEmailCreateMode === EMAIL_CREATE_MODES.HTML_EDITOR || isUploadMode;
|
|
59
|
+
// In edit mode: Check if htmlEditorValidationState has been updated by HTML Editor
|
|
60
|
+
// HTML Editor will call updateHtmlEditorValidationState, setting validationComplete to true at some point
|
|
61
|
+
// If validationComplete is false and issueCounts.total === 0, it's likely still in initial state (BEE editor)
|
|
62
|
+
const isHtmlEditorValidationStateActive = htmlEditorValidationState && (
|
|
63
|
+
htmlEditorValidationState.validationComplete === true
|
|
64
|
+
|| (htmlEditorValidationState.issueCounts && htmlEditorValidationState.issueCounts.total > 0)
|
|
65
|
+
|| htmlEditorValidationState.hasErrors === true
|
|
66
|
+
);
|
|
67
|
+
const isHTMLEditorModeInEdit = isEditMode && isHtmlEditorValidationStateActive;
|
|
68
|
+
const isHTMLEditorMode = isHTMLEditorModeInCreate || isHTMLEditorModeInEdit;
|
|
69
|
+
console.log('***isHTMLEditorMode', isHTMLEditorMode, 'isHTMLEditorModeInCreate', isHTMLEditorModeInCreate, 'isHTMLEditorModeInEdit', isHTMLEditorModeInEdit, 'isHtmlEditorValidationStateActive', isHtmlEditorValidationStateActive);
|
|
70
|
+
|
|
71
|
+
// BEE editor detection: drag_drop mode OR (editor mode AND not HTML Editor)
|
|
72
|
+
// In edit mode: if htmlEditorValidationState is in initial state (not updated by HTML Editor), it's BEE editor
|
|
73
|
+
const isBEEEditor = selectedEmailCreateMode === EMAIL_CREATE_MODES.DRAG_DROP
|
|
74
|
+
|| (emailCreateMode === EMAIL_CREATE_MODES.EDITOR && !isHTMLEditorMode)
|
|
75
|
+
|| (isEditMode && !isHtmlEditorValidationStateActive);
|
|
76
|
+
// Only check validation for HTML Editor mode, not for BEE/DragDrop editor
|
|
77
|
+
const shouldCheckValidation = isEmailChannel && htmlEditorValidationState && isHTMLEditorMode && !isBEEEditor;
|
|
78
|
+
const isContentEmpty = shouldCheckValidation ? (htmlEditorValidationState?.isContentEmpty ?? true) : false;
|
|
79
|
+
// Check if validation has completed
|
|
80
|
+
const validationComplete = shouldCheckValidation ? (htmlEditorValidationState?.validationComplete ?? false) : true;
|
|
81
|
+
// Only Rule Group #1 (Input & Sanitization) blocks; hasErrors is set by HTMLEditor from hasBlockingErrors.
|
|
82
|
+
// hasErrors should always be set (defaults to false), so we only check for explicit true value.
|
|
83
|
+
// Warnings (label issues, HTML/CSS compatibility) do NOT block buttons.
|
|
84
|
+
const hasValidationErrors = shouldCheckValidation && htmlEditorValidationState?.hasErrors === true;
|
|
85
|
+
console.log('***hasValidationErrors', hasValidationErrors);
|
|
86
|
+
const errorsAcknowledged = shouldCheckValidation ? (htmlEditorValidationState?.errorsAcknowledged ?? false) : true;
|
|
87
|
+
console.log('***errorsAcknowledged', errorsAcknowledged);
|
|
88
|
+
|
|
89
|
+
// IMPORTANT: In both modes, if validation finds errors, buttons must stay disabled until user acknowledges by clicking redirection icon
|
|
90
|
+
let shouldDisableButtons = false;
|
|
91
|
+
if (shouldCheckValidation) {
|
|
92
|
+
if (isEditMode) {
|
|
93
|
+
// Edit mode: Disable if validation has completed AND found errors AND errors not acknowledged
|
|
94
|
+
shouldDisableButtons = validationComplete && hasValidationErrors && !errorsAcknowledged;
|
|
95
|
+
} else {
|
|
96
|
+
// Create mode:
|
|
97
|
+
// 1. Disable until validation completes
|
|
98
|
+
// 2. Disable if content is empty
|
|
99
|
+
// 3. Disable if validation finds errors AND errors not acknowledged (user must click redirection icon)
|
|
100
|
+
shouldDisableButtons = !validationComplete || isContentEmpty || (hasValidationErrors && !errorsAcknowledged);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Show ErrorInfoNote for API validation errors (from validateLiquidTemplateContent)
|
|
105
|
+
// For HTML Editor: API validation errors are shown in ValidationErrorDisplay (inside CodeEditorPane), not here
|
|
106
|
+
const hasStandardErrors = errorMessages && errorMessages.STANDARD_ERROR_MSG && errorMessages.STANDARD_ERROR_MSG.length > 0;
|
|
107
|
+
const hasLiquidErrors = errorMessages && errorMessages.LIQUID_ERROR_MSG && errorMessages.LIQUID_ERROR_MSG.length > 0;
|
|
108
|
+
|
|
109
|
+
// Check if htmlEditorValidationState has actual validation errors
|
|
110
|
+
// If htmlEditorValidationState exists but has no errors (total === 0), and we have STANDARD/LIQUID errors,
|
|
111
|
+
// then those errors are from BEE editor (FormBuilder validation), not HTML Editor
|
|
112
|
+
const htmlEditorHasErrors = htmlEditorValidationState && htmlEditorValidationState.issueCounts && htmlEditorValidationState.issueCounts.total > 0;
|
|
113
|
+
|
|
114
|
+
// BEE editor errors: We have STANDARD/LIQUID errors AND either:
|
|
115
|
+
// 1. No htmlEditorValidationState exists, OR
|
|
116
|
+
// 2. htmlEditorValidationState exists but has no actual errors (meaning errors are from FormBuilder/BEE editor)
|
|
117
|
+
// IMPORTANT: Only check for BEE editor errors when NOT in HTML Editor mode (upload or html_editor)
|
|
118
|
+
// Upload mode uses HTML Editor, so BEE editor errors don't apply
|
|
119
|
+
// IMPORTANT: BEE editor doesn't have real-time content updates,
|
|
120
|
+
// so we should NOT disable buttons based on validation errors
|
|
121
|
+
// In edit mode: Check if htmlEditorValidationState is in initial state (not updated by HTML Editor)
|
|
122
|
+
// In edit mode with BEE editor, htmlEditorValidationState will remain in initial state
|
|
123
|
+
// In create mode, check selectedEmailCreateMode or emailCreateMode
|
|
124
|
+
const isBEEEditorModeInEdit = isEditMode && !isHtmlEditorValidationStateActive;
|
|
125
|
+
console.log('***isBEEEditorModeInEdit', isBEEEditorModeInEdit, 'isHtmlEditorValidationStateActive', isHtmlEditorValidationStateActive);
|
|
126
|
+
const isBEEEditorModeInCreate = !isHTMLEditorMode && !isEditMode;
|
|
127
|
+
console.log('***isBEEEditorModeInCreate', isBEEEditorModeInCreate);
|
|
128
|
+
const isBEEEditorMode = isBEEEditorModeInEdit || isBEEEditorModeInCreate;
|
|
129
|
+
console.log('***isBEEEditorMode', isBEEEditorMode);
|
|
130
|
+
const hasBEEEditorErrors = isEmailChannel && isBEEEditorMode && (hasStandardErrors || hasLiquidErrors) && (!htmlEditorValidationState || !htmlEditorHasErrors);
|
|
131
|
+
console.log('***hasBEEEditorErrors', hasBEEEditorErrors);
|
|
132
|
+
|
|
133
|
+
const shouldShowErrorInfoNote = hasBEEEditorErrors;
|
|
36
134
|
return (
|
|
37
|
-
<div className=
|
|
38
|
-
{
|
|
135
|
+
<div className="template-footer-width">
|
|
136
|
+
{shouldShowErrorInfoNote && (
|
|
137
|
+
<ErrorInfoNote
|
|
138
|
+
errorMessages={errorMessages}
|
|
139
|
+
currentTab={currentTab?.toUpperCase()}
|
|
140
|
+
useLegacyDisplay // Use simple list display for BEE Editor (not tabbed interface)
|
|
141
|
+
/>
|
|
142
|
+
)}
|
|
39
143
|
<div>
|
|
40
144
|
{shouldShowDoneFooter() && (
|
|
41
145
|
<div>
|
|
@@ -47,10 +151,10 @@ function SlideBoxFooter(props) {
|
|
|
47
151
|
<CapRow>
|
|
48
152
|
<CapButton
|
|
49
153
|
onClick={onSave}
|
|
50
|
-
disabled={isTemplateNameEmpty || fetchingCmsData ||
|
|
154
|
+
disabled={isTemplateNameEmpty || fetchingCmsData || shouldDisableButtons}
|
|
51
155
|
>
|
|
52
156
|
{isFullMode ? (
|
|
53
|
-
getFullModeSaveBtn(slidBoxContent)
|
|
157
|
+
getFullModeSaveBtn(slidBoxContent, isCreatingTemplate)
|
|
54
158
|
) : (
|
|
55
159
|
<FormattedMessage {...messages.creativesTemplatesSave} />
|
|
56
160
|
)}
|
|
@@ -59,7 +163,7 @@ function SlideBoxFooter(props) {
|
|
|
59
163
|
<CapButton
|
|
60
164
|
type="secondary"
|
|
61
165
|
onClick={onTestAndPreview}
|
|
62
|
-
|
|
166
|
+
disabled={shouldDisableButtons}
|
|
63
167
|
style={{ marginLeft: '8px' }}
|
|
64
168
|
>
|
|
65
169
|
<FormattedMessage {...messages.testAndPreview} />
|
|
@@ -70,8 +174,11 @@ function SlideBoxFooter(props) {
|
|
|
70
174
|
</div>
|
|
71
175
|
)}
|
|
72
176
|
{shouldShowContinueFooter() && (
|
|
73
|
-
<CapButton
|
|
74
|
-
|
|
177
|
+
<CapButton
|
|
178
|
+
onClick={onCreateNextStep}
|
|
179
|
+
disabled={isContinueButtonDisabled || false}
|
|
180
|
+
>
|
|
181
|
+
<FormattedMessage {...(continueButtonLabel || messages.continue)} />
|
|
75
182
|
</CapButton>
|
|
76
183
|
)}
|
|
77
184
|
{slidBoxContent === PREVIEW && (
|
|
@@ -99,5 +206,48 @@ SlideBoxFooter.propTypes = {
|
|
|
99
206
|
onTestAndPreview: PropTypes.func,
|
|
100
207
|
isEmptyContent: PropTypes.bool,
|
|
101
208
|
showTestAndPreviewButton: PropTypes.bool,
|
|
209
|
+
isContinueButtonDisabled: PropTypes.bool,
|
|
210
|
+
continueButtonLabel: PropTypes.object,
|
|
211
|
+
htmlEditorValidationState: PropTypes.shape({
|
|
212
|
+
isContentEmpty: PropTypes.bool,
|
|
213
|
+
issueCounts: PropTypes.shape({
|
|
214
|
+
html: PropTypes.number,
|
|
215
|
+
label: PropTypes.number,
|
|
216
|
+
liquid: PropTypes.number,
|
|
217
|
+
total: PropTypes.number,
|
|
218
|
+
}),
|
|
219
|
+
validationComplete: PropTypes.bool,
|
|
220
|
+
/** Only Rule Group #1 (Input & Sanitization) blocks; warnings do not block */
|
|
221
|
+
hasErrors: PropTypes.bool,
|
|
222
|
+
}),
|
|
223
|
+
isCreatingTemplate: PropTypes.bool,
|
|
224
|
+
currentChannel: PropTypes.string,
|
|
225
|
+
emailCreateMode: PropTypes.string,
|
|
226
|
+
selectedEmailCreateMode: PropTypes.string,
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
SlideBoxFooter.defaultProps = {
|
|
230
|
+
slidBoxContent: '',
|
|
231
|
+
onSave: () => {},
|
|
232
|
+
onEditTemplate: () => {},
|
|
233
|
+
onCreateNextStep: () => {},
|
|
234
|
+
shouldShowContinueFooter: () => {},
|
|
235
|
+
shouldShowDoneFooter: () => {},
|
|
236
|
+
isFullMode: false,
|
|
237
|
+
fetchingCmsData: false,
|
|
238
|
+
isTemplateNameEmpty: false,
|
|
239
|
+
errorMessages: [],
|
|
240
|
+
isLiquidValidationError: false,
|
|
241
|
+
currentTab: '',
|
|
242
|
+
onTestAndPreview: () => {},
|
|
243
|
+
isEmptyContent: false,
|
|
244
|
+
showTestAndPreviewButton: false,
|
|
245
|
+
isContinueButtonDisabled: false,
|
|
246
|
+
continueButtonLabel: {},
|
|
247
|
+
htmlEditorValidationState: {},
|
|
248
|
+
isCreatingTemplate: false,
|
|
249
|
+
currentChannel: '',
|
|
250
|
+
emailCreateMode: '',
|
|
251
|
+
selectedEmailCreateMode: '',
|
|
102
252
|
};
|
|
103
253
|
export default SlideBoxFooter;
|
|
@@ -45,6 +45,7 @@ export function SlideBoxHeader(props) {
|
|
|
45
45
|
const isZaloEdit = channel.toLowerCase() === ZALO && slidBoxContent === 'editTemplate';
|
|
46
46
|
const zaloOverview = isZaloEdit && isFullMode;
|
|
47
47
|
const whatsappOverview = isWhatsappEdit && isFullMode;
|
|
48
|
+
const shouldShowInAppEditHeader = isInAppEdit && !isFullMode;
|
|
48
49
|
const headerMessage = whatsappOverview ? messages.whatsappOverview : zaloOverview ? messages.zaloOverview : messages.editMessageContent;
|
|
49
50
|
const {
|
|
50
51
|
whatsappTemplateName,
|
|
@@ -71,7 +72,6 @@ export function SlideBoxHeader(props) {
|
|
|
71
72
|
rcs: <FormattedMessage {...messages.rcsCreative} />,
|
|
72
73
|
zalo: <FormattedMessage {...messages.zaloTemplate} />,
|
|
73
74
|
viber: <FormattedMessage {...messages.viberTemplate} />,
|
|
74
|
-
webpush: <FormattedMessage {...messages.webPushTemplate} />,
|
|
75
75
|
};
|
|
76
76
|
return labels[currentChannel.toLowerCase()];
|
|
77
77
|
};
|
|
@@ -110,7 +110,7 @@ export function SlideBoxHeader(props) {
|
|
|
110
110
|
}
|
|
111
111
|
/>
|
|
112
112
|
)}
|
|
113
|
-
{!showTemplateNameHeader && slidBoxContent === 'editTemplate' && (
|
|
113
|
+
{!showTemplateNameHeader && slidBoxContent === 'editTemplate' && (shouldShowInAppEditHeader || !isInAppCreate) && (
|
|
114
114
|
<CapHeader
|
|
115
115
|
className="support-video-elements"
|
|
116
116
|
title={<FormattedMessage {...headerMessage} values={{ channel: getChannelLabel(channel) }} />}
|
|
@@ -21,11 +21,10 @@ export const PUSH = "PUSH";
|
|
|
21
21
|
export const RCS = "RCS";
|
|
22
22
|
export const ZALO = "ZALO";
|
|
23
23
|
export const INAPP = "INAPP";
|
|
24
|
-
export const WEBPUSH = "WEBPUSH";
|
|
25
|
-
export const WEBPUSH_BRAND_ICON = "WEBPUSH_BRAND_ICON";
|
|
26
24
|
export const PREVIEW = "preview";
|
|
27
25
|
export const EDIT_TEMPLATE = "editTemplate";
|
|
28
26
|
export const JOURNEY = "journey";
|
|
27
|
+
export const HTML = "HTML";
|
|
29
28
|
|
|
30
29
|
export const LOYALTY_SUPPORTED_ACTION = "SEND_COMMUNICATION_ACTION";
|
|
31
30
|
|
|
@@ -50,4 +49,3 @@ export const BIG_TEXT = "BIG_TEXT";
|
|
|
50
49
|
export const GENERIC = "GENERIC";
|
|
51
50
|
export const LIQUID_ERROR_MSG = "LIQUID_ERROR_MSG";
|
|
52
51
|
export const STANDARD_ERROR_MSG = "STANDARD_ERROR_MSG";
|
|
53
|
-
export const COMMON_CHANNELS = ['sms', 'email', 'wechat', 'mobilepush', 'webpush', 'line', 'viber', 'facebook', 'call_task', 'ftp', 'assets'];
|