@capillarytech/creatives-library 8.0.266-alpha.0 → 8.0.266
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 +0 -2
- package/package.json +1 -1
- package/services/api.js +5 -10
- package/services/tests/api.test.js +0 -34
- package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +35 -17
- package/tests/integration/TemplateCreation/api-response.js +1 -31
- package/tests/integration/TemplateCreation/msw-handler.js +0 -2
- package/utils/common.js +6 -5
- package/utils/commonUtils.js +5 -28
- package/utils/imageUrlUpload.js +141 -0
- package/utils/tests/commonUtil.test.js +0 -224
- package/utils/tests/transformerUtils.test.js +297 -0
- package/utils/transformTemplateConfig.js +10 -0
- package/utils/transformerUtils.js +40 -0
- package/v2Components/CapDeviceContent/index.js +56 -61
- package/v2Components/CapImageUpload/constants.js +2 -0
- package/v2Components/CapImageUpload/index.js +65 -16
- package/v2Components/CapImageUpload/index.scss +4 -1
- package/v2Components/CapImageUpload/messages.js +5 -1
- package/v2Components/CapImageUrlUpload/constants.js +26 -0
- package/v2Components/CapImageUrlUpload/index.js +365 -0
- package/v2Components/CapImageUrlUpload/index.scss +35 -0
- package/v2Components/CapImageUrlUpload/messages.js +47 -0
- package/v2Components/CapTagList/index.js +1 -6
- package/v2Components/CapTagListWithInput/index.js +1 -5
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +0 -5
- package/v2Components/ErrorInfoNote/index.js +72 -402
- package/v2Components/ErrorInfoNote/messages.js +6 -32
- package/v2Components/ErrorInfoNote/style.scss +6 -278
- package/v2Components/FormBuilder/tests/index.test.js +4 -13
- package/v2Components/HtmlEditor/HTMLEditor.js +99 -418
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +133 -1882
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +16 -27
- package/v2Components/HtmlEditor/_htmlEditor.scss +45 -108
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -0
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +102 -23
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +140 -148
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +1 -2
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -9
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +6 -31
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +0 -22
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +7 -4
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +45 -35
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +3 -1
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +6 -7
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +10 -7
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +43 -22
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +152 -0
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/_validationErrorDisplay.scss +0 -18
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +31 -36
- package/v2Components/HtmlEditor/components/ValidationPanel/_validationPanel.scss +34 -46
- package/v2Components/HtmlEditor/components/ValidationPanel/index.js +46 -52
- package/v2Components/HtmlEditor/constants.js +20 -45
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +16 -373
- package/v2Components/HtmlEditor/hooks/__tests__/useValidation.test.js +16 -351
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +2 -5
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +146 -88
- package/v2Components/HtmlEditor/hooks/useValidation.js +56 -213
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +94 -102
- package/v2Components/HtmlEditor/utils/__tests__/htmlValidator.enhanced.test.js +45 -214
- package/v2Components/HtmlEditor/utils/__tests__/validationAdapter.test.js +0 -134
- package/v2Components/HtmlEditor/utils/contentSanitizer.js +41 -40
- package/v2Components/HtmlEditor/utils/htmlValidator.js +72 -71
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +124 -158
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +25 -23
- package/v2Components/HtmlEditor/utils/validationAdapter.js +41 -66
- package/v2Components/MobilePushPreviewV2/index.js +7 -33
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -55
- package/v2Components/TemplatePreview/index.js +32 -47
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +0 -1
- package/v2Containers/App/constants.js +5 -0
- package/v2Containers/BeeEditor/index.js +90 -172
- package/v2Containers/CreativesContainer/SlideBoxContent.js +108 -129
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +13 -163
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +3 -1
- package/v2Containers/CreativesContainer/index.js +214 -240
- package/v2Containers/CreativesContainer/messages.js +4 -8
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +210 -0
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +2 -11
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +354 -38
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +0 -103
- package/v2Containers/Email/actions.js +0 -7
- package/v2Containers/Email/constants.js +1 -5
- package/v2Containers/Email/index.js +29 -234
- package/v2Containers/Email/messages.js +0 -32
- package/v2Containers/Email/reducer.js +1 -12
- package/v2Containers/Email/sagas.js +7 -61
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +0 -2
- package/v2Containers/Email/tests/reducer.test.js +0 -46
- package/v2Containers/Email/tests/sagas.test.js +29 -320
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +21 -211
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +74 -40
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +67 -2
- package/v2Containers/EmailWrapper/constants.js +0 -2
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +77 -629
- package/v2Containers/EmailWrapper/index.js +23 -103
- package/v2Containers/EmailWrapper/messages.js +1 -65
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +214 -0
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +77 -594
- package/v2Containers/InApp/actions.js +0 -7
- package/v2Containers/InApp/constants.js +4 -20
- package/v2Containers/InApp/index.js +359 -802
- package/v2Containers/InApp/index.scss +3 -4
- package/v2Containers/InApp/messages.js +3 -7
- package/v2Containers/InApp/reducer.js +3 -21
- package/v2Containers/InApp/sagas.js +9 -29
- package/v2Containers/InApp/selectors.js +5 -25
- package/v2Containers/InApp/tests/index.test.js +50 -154
- package/v2Containers/InApp/tests/reducer.test.js +0 -34
- package/v2Containers/InApp/tests/sagas.test.js +9 -61
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +0 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +0 -2
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +0 -9
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +0 -12
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/TagList/index.js +19 -62
- package/v2Containers/Templates/ChannelTypeIllustration.js +13 -1
- package/v2Containers/Templates/_templates.scss +202 -56
- package/v2Containers/Templates/actions.js +2 -1
- package/v2Containers/Templates/constants.js +1 -0
- package/v2Containers/Templates/index.js +278 -123
- package/v2Containers/Templates/messages.js +24 -4
- package/v2Containers/Templates/reducer.js +2 -0
- package/v2Containers/Templates/tests/index.test.js +10 -0
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +2 -4
- package/v2Containers/TemplatesV2/index.js +15 -7
- package/v2Containers/TemplatesV2/messages.js +4 -0
- package/v2Containers/WebPush/Create/components/BrandIconSection.js +108 -0
- package/v2Containers/WebPush/Create/components/ButtonForm.js +172 -0
- package/v2Containers/WebPush/Create/components/ButtonItem.js +101 -0
- package/v2Containers/WebPush/Create/components/ButtonList.js +145 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.js +164 -0
- package/v2Containers/WebPush/Create/components/ButtonsLinksSection.test.js +463 -0
- package/v2Containers/WebPush/Create/components/FormActions.js +54 -0
- package/v2Containers/WebPush/Create/components/FormActions.test.js +163 -0
- package/v2Containers/WebPush/Create/components/MediaSection.js +142 -0
- package/v2Containers/WebPush/Create/components/MediaSection.test.js +341 -0
- package/v2Containers/WebPush/Create/components/MessageSection.js +103 -0
- package/v2Containers/WebPush/Create/components/MessageSection.test.js +268 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.js +87 -0
- package/v2Containers/WebPush/Create/components/NotificationTitleSection.test.js +210 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.js +54 -0
- package/v2Containers/WebPush/Create/components/TemplateNameSection.test.js +143 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/ButtonsLinksSection.test.js.snap +86 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/FormActions.test.js.snap +16 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MediaSection.test.js.snap +41 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/MessageSection.test.js.snap +54 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/NotificationTitleSection.test.js.snap +37 -0
- package/v2Containers/WebPush/Create/components/__snapshots__/TemplateNameSection.test.js.snap +21 -0
- package/v2Containers/WebPush/Create/components/_buttons.scss +246 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +554 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +607 -0
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +633 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +666 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +74 -0
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +78 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.js +138 -0
- package/v2Containers/WebPush/Create/hooks/useButtonManagement.test.js +406 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.js +30 -0
- package/v2Containers/WebPush/Create/hooks/useCharacterCount.test.js +151 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.js +104 -0
- package/v2Containers/WebPush/Create/hooks/useImageUpload.test.js +538 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.js +122 -0
- package/v2Containers/WebPush/Create/hooks/useTagManagement.test.js +633 -0
- package/v2Containers/WebPush/Create/index.js +1148 -0
- package/v2Containers/WebPush/Create/index.scss +134 -0
- package/v2Containers/WebPush/Create/messages.js +211 -0
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +228 -0
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +294 -0
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +90 -0
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +305 -0
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +25 -0
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +156 -0
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +53 -0
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +5 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-down.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/android-arrow-up.svg +9 -0
- 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 +106 -0
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +26 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-arrow-down-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/macos-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +18 -0
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +29 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-close-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/assets/windows-triple-dot-icon.svg +9 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +51 -0
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +145 -0
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +45 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +68 -0
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +61 -0
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +99 -0
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +733 -0
- package/v2Containers/WebPush/Create/preview/components/tests/WindowsChromeExpanded.test.js +571 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +85 -0
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/WindowsChromeExpanded.test.js.snap +81 -0
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +50 -0
- package/v2Containers/WebPush/Create/preview/constants.js +637 -0
- package/v2Containers/WebPush/Create/preview/notification-container.scss +79 -0
- package/v2Containers/WebPush/Create/preview/preview.scss +358 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +370 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +12 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +47 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +11 -0
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +207 -0
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +153 -0
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +107 -0
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +101 -0
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +229 -0
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +906 -0
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +1081 -0
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +723 -0
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +1327 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +131 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +112 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +144 -0
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +129 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.js +96 -0
- package/v2Containers/WebPush/Create/utils/payloadBuilder.test.js +396 -0
- package/v2Containers/WebPush/Create/utils/previewUtils.js +89 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.js +115 -0
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +449 -0
- package/v2Containers/WebPush/Create/utils/validation.js +75 -0
- package/v2Containers/WebPush/Create/utils/validation.test.js +283 -0
- package/v2Containers/WebPush/actions.js +60 -0
- package/v2Containers/WebPush/constants.js +132 -0
- package/v2Containers/WebPush/index.js +2 -0
- package/v2Containers/WebPush/reducer.js +104 -0
- package/v2Containers/WebPush/sagas.js +119 -0
- package/v2Containers/WebPush/selectors.js +65 -0
- package/v2Containers/WebPush/tests/reducer.test.js +863 -0
- package/v2Containers/WebPush/tests/sagas.test.js +566 -0
- package/v2Containers/WebPush/tests/selectors.test.js +960 -0
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +0 -34
- package/v2Components/ErrorInfoNote/constants.js +0 -1
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.apiErrors.test.js +0 -870
- package/v2Components/HtmlEditor/components/ValidationPanel/constants.js +0 -6
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +0 -277
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +0 -295
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +0 -51
- package/v2Components/HtmlEditor/utils/validationConstants.js +0 -38
- package/v2Components/MobilePushPreviewV2/constants.js +0 -6
- package/v2Containers/BeePopupEditor/_beePopupEditor.scss +0 -14
- package/v2Containers/BeePopupEditor/constants.js +0 -10
- package/v2Containers/BeePopupEditor/index.js +0 -194
- package/v2Containers/BeePopupEditor/tests/index.test.js +0 -627
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +0 -1246
- package/v2Containers/EmailWrapper/components/__tests__/EmailHTMLEditor.test.js +0 -2472
- package/v2Containers/EmailWrapper/components/__tests__/EmailWrapperView.test.js +0 -520
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.edgeCases.test.js +0 -956
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +0 -376
- package/v2Containers/InApp/__tests__/sagas.test.js +0 -363
- package/v2Containers/InApp/tests/selectors.test.js +0 -612
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +0 -151
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +0 -267
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +0 -23
- package/v2Containers/InAppWrapper/constants.js +0 -16
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +0 -473
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +0 -198
- package/v2Containers/InAppWrapper/index.js +0 -148
- package/v2Containers/InAppWrapper/messages.js +0 -49
- package/v2Containers/InappAdvance/index.js +0 -1099
- package/v2Containers/InappAdvance/index.scss +0 -10
- package/v2Containers/InappAdvance/tests/index.test.js +0 -448
|
@@ -1376,228 +1376,4 @@ describe("validateCarouselCards", () => {
|
|
|
1376
1376
|
expect(result.isValid).toBe(true);
|
|
1377
1377
|
});
|
|
1378
1378
|
});
|
|
1379
|
-
|
|
1380
|
-
describe('extractContent BEE Editor Logic (L404-L412)', () => {
|
|
1381
|
-
it('extracts content from beeHtml as string', () => {
|
|
1382
|
-
const platformData = {
|
|
1383
|
-
title: 'Test Title',
|
|
1384
|
-
isBEEeditor: true,
|
|
1385
|
-
beeHtml: '<p>BEE HTML Content</p>',
|
|
1386
|
-
ctas: [
|
|
1387
|
-
{ text: 'Click Here', actionLink: 'https://example.com' },
|
|
1388
|
-
],
|
|
1389
|
-
};
|
|
1390
|
-
|
|
1391
|
-
const result = extractContent(platformData);
|
|
1392
|
-
|
|
1393
|
-
expect(result).toContain(platformData.title);
|
|
1394
|
-
expect(result).toContain(platformData.beeHtml);
|
|
1395
|
-
expect(result).toContain(platformData.ctas[0].text);
|
|
1396
|
-
});
|
|
1397
|
-
|
|
1398
|
-
it('extracts content from beeHtml as object with value property', () => {
|
|
1399
|
-
const platformData = {
|
|
1400
|
-
title: 'Test Title',
|
|
1401
|
-
isBEEeditor: true,
|
|
1402
|
-
beeHtml: { value: '<p>BEE HTML from Object</p>' },
|
|
1403
|
-
ctas: [
|
|
1404
|
-
{ text: 'Button Text' },
|
|
1405
|
-
],
|
|
1406
|
-
};
|
|
1407
|
-
|
|
1408
|
-
const result = extractContent(platformData);
|
|
1409
|
-
|
|
1410
|
-
expect(result).toContain(platformData.title);
|
|
1411
|
-
expect(result).toContain(platformData.beeHtml.value);
|
|
1412
|
-
expect(result).toContain(platformData.ctas[0].text);
|
|
1413
|
-
});
|
|
1414
|
-
|
|
1415
|
-
it('handles beeHtml as object without value property', () => {
|
|
1416
|
-
const platformData = {
|
|
1417
|
-
title: 'Test Title',
|
|
1418
|
-
isBEEeditor: true,
|
|
1419
|
-
beeHtml: { someOtherProperty: 'data' },
|
|
1420
|
-
ctas: [],
|
|
1421
|
-
};
|
|
1422
|
-
|
|
1423
|
-
const result = extractContent(platformData);
|
|
1424
|
-
|
|
1425
|
-
// Should extract title and empty beeHtml (since value is undefined)
|
|
1426
|
-
expect(result).toContain('Test Title');
|
|
1427
|
-
expect(result).not.toContain('someOtherProperty');
|
|
1428
|
-
});
|
|
1429
|
-
|
|
1430
|
-
it('extracts ctas with text property', () => {
|
|
1431
|
-
const platformData = {
|
|
1432
|
-
title: 'Title',
|
|
1433
|
-
isBEEeditor: true,
|
|
1434
|
-
beeHtml: '<p>Content</p>',
|
|
1435
|
-
ctas: [
|
|
1436
|
-
{ text: 'CTA Text 1' },
|
|
1437
|
-
{ text: 'CTA Text 2' },
|
|
1438
|
-
],
|
|
1439
|
-
};
|
|
1440
|
-
|
|
1441
|
-
const result = extractContent(platformData);
|
|
1442
|
-
|
|
1443
|
-
expect(result).toContain('CTA Text 1');
|
|
1444
|
-
expect(result).toContain('CTA Text 2');
|
|
1445
|
-
});
|
|
1446
|
-
|
|
1447
|
-
it('extracts ctas with actionLink when text is missing', () => {
|
|
1448
|
-
const platformData = {
|
|
1449
|
-
title: 'Title',
|
|
1450
|
-
isBEEeditor: true,
|
|
1451
|
-
beeHtml: '<p>Content</p>',
|
|
1452
|
-
ctas: [
|
|
1453
|
-
{ actionLink: 'https://link1.com' },
|
|
1454
|
-
{ actionLink: 'https://link2.com' },
|
|
1455
|
-
],
|
|
1456
|
-
};
|
|
1457
|
-
|
|
1458
|
-
const result = extractContent(platformData);
|
|
1459
|
-
|
|
1460
|
-
expect(result).toContain('https://link1.com');
|
|
1461
|
-
expect(result).toContain('https://link2.com');
|
|
1462
|
-
});
|
|
1463
|
-
|
|
1464
|
-
it('filters out falsy values with filter(Boolean)', () => {
|
|
1465
|
-
const platformData = {
|
|
1466
|
-
title: '',
|
|
1467
|
-
isBEEeditor: true,
|
|
1468
|
-
beeHtml: null,
|
|
1469
|
-
ctas: [
|
|
1470
|
-
{ text: null, actionLink: null },
|
|
1471
|
-
{ text: 'Valid Text' },
|
|
1472
|
-
],
|
|
1473
|
-
};
|
|
1474
|
-
|
|
1475
|
-
const result = extractContent(platformData);
|
|
1476
|
-
|
|
1477
|
-
// Should only contain 'Valid Text' after filtering
|
|
1478
|
-
expect(result).toBe('Valid Text');
|
|
1479
|
-
});
|
|
1480
|
-
|
|
1481
|
-
it('handles empty ctas array', () => {
|
|
1482
|
-
const platformData = {
|
|
1483
|
-
title: 'Title Only',
|
|
1484
|
-
isBEEeditor: true,
|
|
1485
|
-
beeHtml: '<p>BEE Content</p>',
|
|
1486
|
-
ctas: [],
|
|
1487
|
-
};
|
|
1488
|
-
|
|
1489
|
-
const result = extractContent(platformData);
|
|
1490
|
-
|
|
1491
|
-
expect(result).toContain('Title Only');
|
|
1492
|
-
expect(result).toContain('<p>BEE Content</p>');
|
|
1493
|
-
});
|
|
1494
|
-
|
|
1495
|
-
it('handles undefined ctas', () => {
|
|
1496
|
-
const platformData = {
|
|
1497
|
-
title: 'Title',
|
|
1498
|
-
isBEEeditor: true,
|
|
1499
|
-
beeHtml: '<p>Content</p>',
|
|
1500
|
-
ctas: undefined,
|
|
1501
|
-
};
|
|
1502
|
-
|
|
1503
|
-
const result = extractContent(platformData);
|
|
1504
|
-
|
|
1505
|
-
expect(result).toContain('Title');
|
|
1506
|
-
expect(result).toContain('<p>Content</p>');
|
|
1507
|
-
});
|
|
1508
|
-
|
|
1509
|
-
it('joins all content with spaces', () => {
|
|
1510
|
-
const platformData = {
|
|
1511
|
-
title: 'Title',
|
|
1512
|
-
isBEEeditor: true,
|
|
1513
|
-
beeHtml: 'HTML',
|
|
1514
|
-
ctas: [
|
|
1515
|
-
{ text: 'CTA1' },
|
|
1516
|
-
{ text: 'CTA2' },
|
|
1517
|
-
],
|
|
1518
|
-
};
|
|
1519
|
-
|
|
1520
|
-
const result = extractContent(platformData);
|
|
1521
|
-
|
|
1522
|
-
expect(result).toBe('Title HTML CTA1 CTA2');
|
|
1523
|
-
});
|
|
1524
|
-
|
|
1525
|
-
it('falls back to regular content when not BEE editor', () => {
|
|
1526
|
-
const platformData = {
|
|
1527
|
-
title: 'Title',
|
|
1528
|
-
message: 'Message',
|
|
1529
|
-
isBEEeditor: false,
|
|
1530
|
-
beeHtml: '<p>Should be ignored</p>',
|
|
1531
|
-
ctas: [
|
|
1532
|
-
{ text: 'CTA' },
|
|
1533
|
-
],
|
|
1534
|
-
};
|
|
1535
|
-
|
|
1536
|
-
const result = extractContent(platformData);
|
|
1537
|
-
|
|
1538
|
-
expect(result).toContain('Title');
|
|
1539
|
-
expect(result).toContain('Message');
|
|
1540
|
-
expect(result).toContain('CTA');
|
|
1541
|
-
expect(result).not.toContain('<p>Should be ignored</p>');
|
|
1542
|
-
});
|
|
1543
|
-
|
|
1544
|
-
it('handles null beeHtml', () => {
|
|
1545
|
-
const platformData = {
|
|
1546
|
-
title: 'Title',
|
|
1547
|
-
isBEEeditor: true,
|
|
1548
|
-
beeHtml: null,
|
|
1549
|
-
ctas: [{ text: 'CTA' }],
|
|
1550
|
-
};
|
|
1551
|
-
|
|
1552
|
-
const result = extractContent(platformData);
|
|
1553
|
-
|
|
1554
|
-
expect(result).toContain('Title');
|
|
1555
|
-
expect(result).toContain('CTA');
|
|
1556
|
-
});
|
|
1557
|
-
|
|
1558
|
-
it('handles undefined beeHtml', () => {
|
|
1559
|
-
const platformData = {
|
|
1560
|
-
title: 'Title',
|
|
1561
|
-
isBEEeditor: true,
|
|
1562
|
-
beeHtml: undefined,
|
|
1563
|
-
ctas: [],
|
|
1564
|
-
};
|
|
1565
|
-
|
|
1566
|
-
const result = extractContent(platformData);
|
|
1567
|
-
|
|
1568
|
-
expect(result).toBe('Title');
|
|
1569
|
-
});
|
|
1570
|
-
|
|
1571
|
-
it('handles complex ctas with both text and actionLink', () => {
|
|
1572
|
-
const platformData = {
|
|
1573
|
-
title: 'Title',
|
|
1574
|
-
isBEEeditor: true,
|
|
1575
|
-
beeHtml: 'Content',
|
|
1576
|
-
ctas: [
|
|
1577
|
-
{ text: 'CTA Text', actionLink: 'https://example.com' },
|
|
1578
|
-
],
|
|
1579
|
-
};
|
|
1580
|
-
|
|
1581
|
-
const result = extractContent(platformData);
|
|
1582
|
-
|
|
1583
|
-
// Should prefer text over actionLink
|
|
1584
|
-
expect(result).toContain('CTA Text');
|
|
1585
|
-
expect(result).toContain('Title');
|
|
1586
|
-
expect(result).toContain('Content');
|
|
1587
|
-
});
|
|
1588
|
-
|
|
1589
|
-
it('handles empty string beeHtml', () => {
|
|
1590
|
-
const platformData = {
|
|
1591
|
-
title: 'Title',
|
|
1592
|
-
isBEEeditor: true,
|
|
1593
|
-
beeHtml: '',
|
|
1594
|
-
ctas: [{ text: 'CTA' }],
|
|
1595
|
-
};
|
|
1596
|
-
|
|
1597
|
-
const result = extractContent(platformData);
|
|
1598
|
-
|
|
1599
|
-
expect(result).toBe('Title CTA');
|
|
1600
|
-
});
|
|
1601
|
-
});
|
|
1602
1379
|
});
|
|
1603
|
-
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
RCS,
|
|
16
16
|
LINE,
|
|
17
17
|
VIBER,
|
|
18
|
+
WEBPUSH,
|
|
18
19
|
} from "../../v2Containers/CreativesContainer/constants";
|
|
19
20
|
|
|
20
21
|
describe("transformerUtils", () => {
|
|
@@ -1182,6 +1183,302 @@ describe("transformerUtils", () => {
|
|
|
1182
1183
|
});
|
|
1183
1184
|
});
|
|
1184
1185
|
|
|
1186
|
+
describe("WebPush payload transformation", () => {
|
|
1187
|
+
it("should transform WebPush data correctly with minimal data", () => {
|
|
1188
|
+
const mockData = {
|
|
1189
|
+
channel: WEBPUSH,
|
|
1190
|
+
messageSubject: "test webpush notification"
|
|
1191
|
+
};
|
|
1192
|
+
|
|
1193
|
+
const result = transformChannelPayload(mockData);
|
|
1194
|
+
|
|
1195
|
+
expect(result.centralCommsPayload).toBeDefined();
|
|
1196
|
+
expect(result.centralCommsPayload.channel).toEqual(WEBPUSH);
|
|
1197
|
+
expect(result.centralCommsPayload.webpushMessageContent.messageSubject).toEqual(
|
|
1198
|
+
"test webpush notification"
|
|
1199
|
+
);
|
|
1200
|
+
expect(result.centralCommsPayload.clientName).toEqual("VENENO");
|
|
1201
|
+
});
|
|
1202
|
+
|
|
1203
|
+
it("should transform WebPush data with all options", () => {
|
|
1204
|
+
const mockData = {
|
|
1205
|
+
channel: WEBPUSH,
|
|
1206
|
+
messageSubject: "test webpush notification",
|
|
1207
|
+
messageContent: {
|
|
1208
|
+
content: {
|
|
1209
|
+
accountId: 12345,
|
|
1210
|
+
content: {
|
|
1211
|
+
title: "WebPush Title",
|
|
1212
|
+
message: "WebPush Message",
|
|
1213
|
+
iconImageUrl: "https://example.com/icon.png",
|
|
1214
|
+
cta: {
|
|
1215
|
+
actionLink: "https://example.com/action",
|
|
1216
|
+
actionText: "Click Here"
|
|
1217
|
+
},
|
|
1218
|
+
expandableDetails: {
|
|
1219
|
+
style: "BIG_TEXT",
|
|
1220
|
+
message: "Expanded Message"
|
|
1221
|
+
}
|
|
1222
|
+
},
|
|
1223
|
+
offers: [
|
|
1224
|
+
{ id: "offer-1", title: "Offer 1" },
|
|
1225
|
+
{ id: "offer-2", title: "Offer 2" }
|
|
1226
|
+
]
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
};
|
|
1230
|
+
|
|
1231
|
+
const options = {
|
|
1232
|
+
loyaltyMetaData: {
|
|
1233
|
+
actionId: "action-123",
|
|
1234
|
+
ouId: 456,
|
|
1235
|
+
clientName: "TestClient",
|
|
1236
|
+
module: "TestModule",
|
|
1237
|
+
transformedMessageDetails: {
|
|
1238
|
+
webpushDeliverySettings: {
|
|
1239
|
+
sendDate: "2023-01-01",
|
|
1240
|
+
priority: "HIGH"
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
};
|
|
1245
|
+
|
|
1246
|
+
const result = transformChannelPayload(mockData, options);
|
|
1247
|
+
|
|
1248
|
+
// Check base payload
|
|
1249
|
+
expect(result.centralCommsPayload.sourceEntityId).toEqual("action-123");
|
|
1250
|
+
expect(result.centralCommsPayload.ouId).toEqual(456);
|
|
1251
|
+
expect(result.centralCommsPayload.clientName).toEqual("TestClient");
|
|
1252
|
+
expect(result.centralCommsPayload.module).toEqual("TestModule");
|
|
1253
|
+
|
|
1254
|
+
// Check WebPush-specific content
|
|
1255
|
+
expect(result.centralCommsPayload.webpushMessageContent.channel).toEqual(WEBPUSH);
|
|
1256
|
+
expect(result.centralCommsPayload.webpushMessageContent.accountId).toEqual(12345);
|
|
1257
|
+
expect(result.centralCommsPayload.webpushMessageContent.messageSubject).toEqual(
|
|
1258
|
+
"test webpush notification"
|
|
1259
|
+
);
|
|
1260
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.title).toEqual(
|
|
1261
|
+
"WebPush Title"
|
|
1262
|
+
);
|
|
1263
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.message).toEqual(
|
|
1264
|
+
"WebPush Message"
|
|
1265
|
+
);
|
|
1266
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.iconImageUrl).toEqual(
|
|
1267
|
+
"https://example.com/icon.png"
|
|
1268
|
+
);
|
|
1269
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.cta).toEqual({
|
|
1270
|
+
actionLink: "https://example.com/action",
|
|
1271
|
+
actionText: "Click Here"
|
|
1272
|
+
});
|
|
1273
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.expandableDetails).toEqual({
|
|
1274
|
+
style: "BIG_TEXT",
|
|
1275
|
+
message: "Expanded Message"
|
|
1276
|
+
});
|
|
1277
|
+
expect(result.centralCommsPayload.webpushMessageContent.offers).toEqual([
|
|
1278
|
+
{ id: "offer-1", title: "Offer 1" },
|
|
1279
|
+
{ id: "offer-2", title: "Offer 2" }
|
|
1280
|
+
]);
|
|
1281
|
+
|
|
1282
|
+
// Check delivery settings
|
|
1283
|
+
expect(result.centralCommsPayload.webpushDeliverySettings).toEqual({
|
|
1284
|
+
sendDate: "2023-01-01",
|
|
1285
|
+
priority: "HIGH"
|
|
1286
|
+
});
|
|
1287
|
+
});
|
|
1288
|
+
|
|
1289
|
+
it("should handle missing messageContent structure", () => {
|
|
1290
|
+
const mockData = {
|
|
1291
|
+
channel: WEBPUSH,
|
|
1292
|
+
messageSubject: "test webpush notification"
|
|
1293
|
+
};
|
|
1294
|
+
|
|
1295
|
+
const result = transformChannelPayload(mockData);
|
|
1296
|
+
|
|
1297
|
+
expect(result.centralCommsPayload.webpushMessageContent.accountId).toEqual(0);
|
|
1298
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.title).toEqual("");
|
|
1299
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.message).toEqual("");
|
|
1300
|
+
expect(result.centralCommsPayload.webpushMessageContent.offers).toEqual([]);
|
|
1301
|
+
});
|
|
1302
|
+
|
|
1303
|
+
it("should handle missing content properties", () => {
|
|
1304
|
+
const mockData = {
|
|
1305
|
+
channel: WEBPUSH,
|
|
1306
|
+
messageSubject: "test webpush notification",
|
|
1307
|
+
messageContent: {
|
|
1308
|
+
content: {
|
|
1309
|
+
accountId: 12345,
|
|
1310
|
+
content: {}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
};
|
|
1314
|
+
|
|
1315
|
+
const result = transformChannelPayload(mockData);
|
|
1316
|
+
|
|
1317
|
+
expect(result.centralCommsPayload.webpushMessageContent.accountId).toEqual(12345);
|
|
1318
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.title).toEqual("");
|
|
1319
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.message).toEqual("");
|
|
1320
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.iconImageUrl).toBeUndefined();
|
|
1321
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.cta).toBeUndefined();
|
|
1322
|
+
expect(result.centralCommsPayload.webpushMessageContent.content.expandableDetails).toBeUndefined();
|
|
1323
|
+
});
|
|
1324
|
+
|
|
1325
|
+
it("should conditionally include iconImageUrl only when present", () => {
|
|
1326
|
+
const mockDataWithoutIcon = {
|
|
1327
|
+
channel: WEBPUSH,
|
|
1328
|
+
messageSubject: "test",
|
|
1329
|
+
messageContent: {
|
|
1330
|
+
content: {
|
|
1331
|
+
content: {
|
|
1332
|
+
title: "Title",
|
|
1333
|
+
message: "Message"
|
|
1334
|
+
}
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
};
|
|
1338
|
+
|
|
1339
|
+
const resultWithoutIcon = transformChannelPayload(mockDataWithoutIcon);
|
|
1340
|
+
expect(resultWithoutIcon.centralCommsPayload.webpushMessageContent.content.iconImageUrl).toBeUndefined();
|
|
1341
|
+
|
|
1342
|
+
const mockDataWithIcon = {
|
|
1343
|
+
channel: WEBPUSH,
|
|
1344
|
+
messageSubject: "test",
|
|
1345
|
+
messageContent: {
|
|
1346
|
+
content: {
|
|
1347
|
+
content: {
|
|
1348
|
+
title: "Title",
|
|
1349
|
+
message: "Message",
|
|
1350
|
+
iconImageUrl: "https://example.com/icon.png"
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
|
|
1356
|
+
const resultWithIcon = transformChannelPayload(mockDataWithIcon);
|
|
1357
|
+
expect(resultWithIcon.centralCommsPayload.webpushMessageContent.content.iconImageUrl).toEqual(
|
|
1358
|
+
"https://example.com/icon.png"
|
|
1359
|
+
);
|
|
1360
|
+
});
|
|
1361
|
+
|
|
1362
|
+
it("should conditionally include cta only when present", () => {
|
|
1363
|
+
const mockDataWithoutCta = {
|
|
1364
|
+
channel: WEBPUSH,
|
|
1365
|
+
messageSubject: "test",
|
|
1366
|
+
messageContent: {
|
|
1367
|
+
content: {
|
|
1368
|
+
content: {
|
|
1369
|
+
title: "Title",
|
|
1370
|
+
message: "Message"
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
};
|
|
1375
|
+
|
|
1376
|
+
const resultWithoutCta = transformChannelPayload(mockDataWithoutCta);
|
|
1377
|
+
expect(resultWithoutCta.centralCommsPayload.webpushMessageContent.content.cta).toBeUndefined();
|
|
1378
|
+
|
|
1379
|
+
const mockDataWithCta = {
|
|
1380
|
+
channel: WEBPUSH,
|
|
1381
|
+
messageSubject: "test",
|
|
1382
|
+
messageContent: {
|
|
1383
|
+
content: {
|
|
1384
|
+
content: {
|
|
1385
|
+
title: "Title",
|
|
1386
|
+
message: "Message",
|
|
1387
|
+
cta: {
|
|
1388
|
+
actionLink: "https://example.com",
|
|
1389
|
+
actionText: "Click"
|
|
1390
|
+
}
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
};
|
|
1395
|
+
|
|
1396
|
+
const resultWithCta = transformChannelPayload(mockDataWithCta);
|
|
1397
|
+
expect(resultWithCta.centralCommsPayload.webpushMessageContent.content.cta).toEqual({
|
|
1398
|
+
actionLink: "https://example.com",
|
|
1399
|
+
actionText: "Click"
|
|
1400
|
+
});
|
|
1401
|
+
});
|
|
1402
|
+
|
|
1403
|
+
it("should conditionally include expandableDetails only when present", () => {
|
|
1404
|
+
const mockDataWithoutExpandable = {
|
|
1405
|
+
channel: WEBPUSH,
|
|
1406
|
+
messageSubject: "test",
|
|
1407
|
+
messageContent: {
|
|
1408
|
+
content: {
|
|
1409
|
+
content: {
|
|
1410
|
+
title: "Title",
|
|
1411
|
+
message: "Message"
|
|
1412
|
+
}
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
};
|
|
1416
|
+
|
|
1417
|
+
const resultWithoutExpandable = transformChannelPayload(mockDataWithoutExpandable);
|
|
1418
|
+
expect(resultWithoutExpandable.centralCommsPayload.webpushMessageContent.content.expandableDetails).toBeUndefined();
|
|
1419
|
+
|
|
1420
|
+
const mockDataWithExpandable = {
|
|
1421
|
+
channel: WEBPUSH,
|
|
1422
|
+
messageSubject: "test",
|
|
1423
|
+
messageContent: {
|
|
1424
|
+
content: {
|
|
1425
|
+
content: {
|
|
1426
|
+
title: "Title",
|
|
1427
|
+
message: "Message",
|
|
1428
|
+
expandableDetails: {
|
|
1429
|
+
style: "BIG_TEXT",
|
|
1430
|
+
message: "Expanded"
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
};
|
|
1436
|
+
|
|
1437
|
+
const resultWithExpandable = transformChannelPayload(mockDataWithExpandable);
|
|
1438
|
+
expect(resultWithExpandable.centralCommsPayload.webpushMessageContent.content.expandableDetails).toEqual({
|
|
1439
|
+
style: "BIG_TEXT",
|
|
1440
|
+
message: "Expanded"
|
|
1441
|
+
});
|
|
1442
|
+
});
|
|
1443
|
+
|
|
1444
|
+
it("should handle undefined webpushDeliverySettings", () => {
|
|
1445
|
+
const mockData = {
|
|
1446
|
+
channel: WEBPUSH,
|
|
1447
|
+
messageSubject: "test webpush notification"
|
|
1448
|
+
};
|
|
1449
|
+
|
|
1450
|
+
const options = {
|
|
1451
|
+
loyaltyMetaData: {
|
|
1452
|
+
transformedMessageDetails: {}
|
|
1453
|
+
}
|
|
1454
|
+
};
|
|
1455
|
+
|
|
1456
|
+
const result = transformChannelPayload(mockData, options);
|
|
1457
|
+
|
|
1458
|
+
expect(result.centralCommsPayload.webpushDeliverySettings).toEqual({});
|
|
1459
|
+
});
|
|
1460
|
+
|
|
1461
|
+
it("should handle empty offers array", () => {
|
|
1462
|
+
const mockData = {
|
|
1463
|
+
channel: WEBPUSH,
|
|
1464
|
+
messageSubject: "test",
|
|
1465
|
+
messageContent: {
|
|
1466
|
+
content: {
|
|
1467
|
+
content: {
|
|
1468
|
+
title: "Title",
|
|
1469
|
+
message: "Message"
|
|
1470
|
+
},
|
|
1471
|
+
offers: []
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
};
|
|
1475
|
+
|
|
1476
|
+
const result = transformChannelPayload(mockData);
|
|
1477
|
+
|
|
1478
|
+
expect(result.centralCommsPayload.webpushMessageContent.offers).toEqual([]);
|
|
1479
|
+
});
|
|
1480
|
+
});
|
|
1481
|
+
|
|
1185
1482
|
describe("getTemplateDiffState", () => {
|
|
1186
1483
|
it("should return false for unsupported channel", () => {
|
|
1187
1484
|
const result = getTemplateDiffState("UNSUPPORTED_CHANNEL", {}, {});
|
|
@@ -101,6 +101,7 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
101
101
|
const contentType = detectMediaContentType(templateConfig);
|
|
102
102
|
|
|
103
103
|
if (contentType === MEDIA_CONTENT_TYPE.NONE) {
|
|
104
|
+
console.log('No media content detected, returning original config');
|
|
104
105
|
return templateConfig;
|
|
105
106
|
}
|
|
106
107
|
|
|
@@ -108,19 +109,24 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
108
109
|
let transformDirection;
|
|
109
110
|
if (forceDirection) {
|
|
110
111
|
transformDirection = forceDirection;
|
|
112
|
+
console.log(`Forced transformation direction: ${transformDirection}`);
|
|
111
113
|
} else {
|
|
112
114
|
// Auto-detect based on content
|
|
113
115
|
if (contentType === MEDIA_CONTENT_TYPE.URLS) {
|
|
114
116
|
transformDirection = TRANSFORM_DIRECTION.FORWARD; // URLs → tags
|
|
117
|
+
console.log('Detected URLs, applying forward transformation (URLs → tags)');
|
|
115
118
|
} else if (contentType === MEDIA_CONTENT_TYPE.TAGS) {
|
|
116
119
|
transformDirection = TRANSFORM_DIRECTION.REVERSE; // tags → URLs
|
|
120
|
+
console.log('Detected media_content tags, applying reverse transformation (tags → URLs)');
|
|
117
121
|
} else if (contentType === MEDIA_CONTENT_TYPE.MIXED) {
|
|
118
122
|
transformDirection = TRANSFORM_DIRECTION.SMART; // Handle mixed content intelligently
|
|
123
|
+
console.log('Detected mixed content, applying smart transformation');
|
|
119
124
|
}
|
|
120
125
|
}
|
|
121
126
|
|
|
122
127
|
const newConfig = cloneDeep(templateConfig);
|
|
123
128
|
try {
|
|
129
|
+
console.log(`Fetching media details for ${transformDirection} transformation, ID: ${mediaDetailsId}`);
|
|
124
130
|
|
|
125
131
|
// Fetch media details mapping from API
|
|
126
132
|
const response = await getMediaDetails({ id: mediaDetailsId })
|
|
@@ -139,6 +145,7 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
139
145
|
idToUrlMapping[mediaId] = url;
|
|
140
146
|
});
|
|
141
147
|
|
|
148
|
+
console.log(`Processing ${Object.keys(urlToIdMapping).length} media mappings`);
|
|
142
149
|
|
|
143
150
|
// Apply transformations based on direction
|
|
144
151
|
newConfig?.cards?.forEach(card => {
|
|
@@ -150,6 +157,7 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
150
157
|
// Forward transformation: URL → tag
|
|
151
158
|
const mediaDetailId = urlToIdMapping[currentUrl];
|
|
152
159
|
if (mediaDetailId) {
|
|
160
|
+
console.log(`Forward: ${currentUrl} → {{media_content(${mediaDetailId})}}`);
|
|
153
161
|
card.media.url = `{{media_content(${mediaDetailId})}}`;
|
|
154
162
|
} else {
|
|
155
163
|
console.warn(`No media detail ID found for URL: ${currentUrl}`);
|
|
@@ -161,6 +169,7 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
161
169
|
if (mediaId) {
|
|
162
170
|
const actualUrl = idToUrlMapping[mediaId];
|
|
163
171
|
if (actualUrl) {
|
|
172
|
+
console.log(`Reverse: {{media_content(${mediaId})}} → ${actualUrl}`);
|
|
164
173
|
card.media.url = actualUrl;
|
|
165
174
|
} else {
|
|
166
175
|
console.warn(`No URL found for media ID: ${mediaId}`);
|
|
@@ -176,6 +185,7 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
176
185
|
console.error('Failed to fetch media details for transformation:', error);
|
|
177
186
|
|
|
178
187
|
// Fallback: try to extract/convert what we can without API
|
|
188
|
+
console.log('Falling back to URL extraction method');
|
|
179
189
|
newConfig.cards.forEach(card => {
|
|
180
190
|
if (card.media && card.media.url) {
|
|
181
191
|
if (transformDirection === TRANSFORM_DIRECTION.FORWARD) {
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
RCS,
|
|
11
11
|
LINE,
|
|
12
12
|
VIBER,
|
|
13
|
+
WEBPUSH,
|
|
13
14
|
EMF,
|
|
14
15
|
VENENO,
|
|
15
16
|
TEXT,
|
|
@@ -63,6 +64,8 @@ export const transformChannelPayload = (data, options = {}) => {
|
|
|
63
64
|
return transformLinePayload(data, options);
|
|
64
65
|
case VIBER:
|
|
65
66
|
return transformViberPayload(data, options);
|
|
67
|
+
case WEBPUSH:
|
|
68
|
+
return transformWebpushPayload(data, options);
|
|
66
69
|
default:
|
|
67
70
|
return data; // Return unchanged for unsupported channels
|
|
68
71
|
}
|
|
@@ -317,6 +320,43 @@ const transformViberPayload = (viberData, options = {}) => {
|
|
|
317
320
|
return payload;
|
|
318
321
|
};
|
|
319
322
|
|
|
323
|
+
/**
|
|
324
|
+
* Transforms WebPush data to the required payload format
|
|
325
|
+
* @param {Object} webpushData - Current WebPush data
|
|
326
|
+
* @param {Object} options - Additional options (ouId, sourceEntityId, etc.)
|
|
327
|
+
* @returns {Object} - Transformed WebPush payload
|
|
328
|
+
*/
|
|
329
|
+
const transformWebpushPayload = (webpushData, options = {}) => {
|
|
330
|
+
const { loyaltyMetaData = {} } = options;
|
|
331
|
+
const { transformedMessageDetails = {} } = loyaltyMetaData;
|
|
332
|
+
const { webpushDeliverySettings = {} } = transformedMessageDetails || {};
|
|
333
|
+
|
|
334
|
+
// Get base payload structure
|
|
335
|
+
const payload = createBasePayload(WEBPUSH, loyaltyMetaData);
|
|
336
|
+
|
|
337
|
+
// Extract webpush content from messageContent.content.content structure
|
|
338
|
+
const webpushContent = webpushData?.messageContent?.content?.content || {};
|
|
339
|
+
const accountId = webpushData?.messageContent?.content?.accountId || 0;
|
|
340
|
+
|
|
341
|
+
// Add WebPush-specific properties
|
|
342
|
+
payload.centralCommsPayload.webpushMessageContent = {
|
|
343
|
+
channel: WEBPUSH,
|
|
344
|
+
accountId,
|
|
345
|
+
content: {
|
|
346
|
+
title: webpushContent?.title || '',
|
|
347
|
+
message: webpushContent?.message || '',
|
|
348
|
+
...(webpushContent?.iconImageUrl && { iconImageUrl: webpushContent.iconImageUrl }),
|
|
349
|
+
...(webpushContent?.cta && { cta: webpushContent.cta }),
|
|
350
|
+
...(webpushContent?.expandableDetails && { expandableDetails: webpushContent.expandableDetails }),
|
|
351
|
+
},
|
|
352
|
+
messageSubject: webpushData?.messageSubject || "",
|
|
353
|
+
offers: webpushData?.messageContent?.content?.offers || [],
|
|
354
|
+
};
|
|
355
|
+
payload.centralCommsPayload.webpushDeliverySettings = webpushDeliverySettings;
|
|
356
|
+
|
|
357
|
+
return payload;
|
|
358
|
+
};
|
|
359
|
+
|
|
320
360
|
// Checks if the template has changed
|
|
321
361
|
export const getTemplateDiffState = (channel, oldData, newData) => {
|
|
322
362
|
switch (channel.toUpperCase()) {
|