@capillarytech/creatives-library 8.0.242-alpha.0 → 8.0.242-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/Android.png +0 -0
- package/assets/iOS.png +0 -0
- package/constants/unified.js +2 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/sagas/__tests__/assetPolling.test.js +74 -3
- package/sagas/assetPolling.js +8 -1
- package/services/api.js +10 -5
- package/services/tests/api.test.js +18 -0
- package/translations/en.json +0 -1
- package/utils/common.js +5 -0
- package/utils/commonUtils.js +14 -1
- package/utils/tests/commonUtil.test.js +224 -0
- package/utils/transformTemplateConfig.js +0 -10
- package/utils/transformerUtils.js +0 -42
- package/v2Components/CapDeviceContent/index.js +61 -56
- package/v2Components/CapImageUpload/constants.js +0 -2
- package/v2Components/CapImageUpload/index.js +14 -54
- package/v2Components/CapImageUpload/index.scss +1 -4
- package/v2Components/CapImageUpload/messages.js +0 -4
- package/v2Components/CapTagList/index.js +6 -1
- package/v2Components/CapTagListWithInput/index.js +5 -1
- package/v2Components/CapTagListWithInput/messages.js +1 -1
- package/v2Components/CapWhatsappCTA/tests/index.test.js +5 -0
- package/v2Components/ErrorInfoNote/index.js +412 -72
- package/v2Components/ErrorInfoNote/messages.js +22 -0
- package/v2Components/ErrorInfoNote/style.scss +279 -2
- package/v2Components/HtmlEditor/HTMLEditor.js +217 -90
- package/v2Components/HtmlEditor/__tests__/HTMLEditor.test.js +1132 -133
- package/v2Components/HtmlEditor/__tests__/index.lazy.test.js +17 -12
- package/v2Components/HtmlEditor/_htmlEditor.scss +15 -23
- package/v2Components/HtmlEditor/_index.lazy.scss +1 -1
- package/v2Components/HtmlEditor/components/CodeEditorPane/_codeEditorPane.scss +13 -101
- package/v2Components/HtmlEditor/components/CodeEditorPane/index.js +148 -139
- package/v2Components/HtmlEditor/components/DeviceToggle/_deviceToggle.scss +2 -1
- package/v2Components/HtmlEditor/components/DeviceToggle/index.js +3 -3
- package/v2Components/HtmlEditor/components/EditorToolbar/_editorToolbar.scss +1 -0
- package/v2Components/HtmlEditor/components/EditorToolbar/index.js +1 -1
- package/v2Components/HtmlEditor/components/FullscreenModal/_fullscreenModal.scss +1 -0
- package/v2Components/HtmlEditor/components/InAppPreviewPane/DeviceFrame.js +4 -7
- package/v2Components/HtmlEditor/components/InAppPreviewPane/__tests__/DeviceFrame.test.js +35 -45
- package/v2Components/HtmlEditor/components/InAppPreviewPane/_inAppPreviewPane.scss +1 -3
- package/v2Components/HtmlEditor/components/InAppPreviewPane/constants.js +33 -33
- package/v2Components/HtmlEditor/components/InAppPreviewPane/index.js +7 -6
- package/v2Components/HtmlEditor/components/PreviewPane/_previewPane.scss +3 -6
- package/v2Components/HtmlEditor/components/PreviewPane/index.js +10 -11
- package/v2Components/HtmlEditor/components/SplitContainer/_splitContainer.scss +1 -1
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/__tests__/index.test.js +87 -62
- package/v2Components/HtmlEditor/components/ValidationErrorDisplay/index.js +49 -31
- package/v2Components/HtmlEditor/components/ValidationTabs/_validationTabs.scss +254 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/index.js +362 -0
- package/v2Components/HtmlEditor/components/ValidationTabs/messages.js +51 -0
- package/v2Components/HtmlEditor/constants.js +29 -20
- package/v2Components/HtmlEditor/hooks/__tests__/useInAppContent.test.js +373 -16
- package/v2Components/HtmlEditor/hooks/useEditorContent.js +5 -2
- package/v2Components/HtmlEditor/hooks/useInAppContent.js +88 -146
- package/v2Components/HtmlEditor/index.js +1 -1
- package/v2Components/HtmlEditor/messages.js +95 -85
- package/v2Components/HtmlEditor/utils/liquidTemplateSupport.js +99 -101
- package/v2Components/HtmlEditor/utils/properSyntaxHighlighting.js +23 -25
- package/v2Components/HtmlEditor/utils/validationAdapter.js +34 -41
- package/v2Components/MobilePushPreviewV2/index.js +32 -7
- package/v2Components/TemplatePreview/_templatePreview.scss +44 -24
- package/v2Components/TemplatePreview/index.js +47 -32
- package/v2Components/TemplatePreview/messages.js +4 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +31 -25
- package/v2Containers/App/constants.js +0 -5
- package/v2Containers/BeeEditor/index.js +82 -80
- package/v2Containers/BeePopupEditor/constants.js +10 -0
- package/v2Containers/BeePopupEditor/index.js +193 -0
- package/v2Containers/BeePopupEditor/tests/index.test.js +627 -0
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +0 -1
- package/v2Containers/CreativesContainer/SlideBoxContent.js +148 -120
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +9 -3
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +2 -2
- package/v2Containers/CreativesContainer/constants.js +1 -2
- package/v2Containers/CreativesContainer/index.js +173 -193
- package/v2Containers/CreativesContainer/messages.js +4 -4
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +38 -50
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +36 -0
- package/v2Containers/Email/actions.js +7 -0
- package/v2Containers/Email/constants.js +5 -1
- package/v2Containers/Email/index.js +13 -0
- package/v2Containers/Email/messages.js +32 -0
- package/v2Containers/Email/reducer.js +12 -1
- package/v2Containers/Email/sagas.js +41 -6
- package/v2Containers/Email/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/EmailWrapper/components/EmailHTMLEditor.js +1046 -0
- package/v2Containers/EmailWrapper/components/EmailWrapperView.js +193 -7
- package/v2Containers/EmailWrapper/components/HTMLEditorTesting.js +40 -74
- package/v2Containers/EmailWrapper/components/__tests__/HTMLEditorTesting.test.js +2 -67
- package/v2Containers/EmailWrapper/constants.js +2 -0
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +436 -67
- package/v2Containers/EmailWrapper/index.js +99 -23
- package/v2Containers/EmailWrapper/messages.js +61 -1
- package/v2Containers/EmailWrapper/tests/EmailWrapperView.test.js +26 -1
- package/v2Containers/EmailWrapper/tests/useEmailWrapper.test.js +111 -77
- package/v2Containers/InApp/__tests__/InAppHTMLEditor.test.js +376 -0
- package/v2Containers/InApp/__tests__/sagas.test.js +363 -0
- package/v2Containers/InApp/actions.js +7 -0
- package/v2Containers/InApp/constants.js +20 -4
- package/v2Containers/InApp/index.js +800 -357
- package/v2Containers/InApp/index.scss +4 -3
- package/v2Containers/InApp/messages.js +7 -3
- package/v2Containers/InApp/reducer.js +21 -3
- package/v2Containers/InApp/sagas.js +29 -9
- package/v2Containers/InApp/selectors.js +25 -5
- package/v2Containers/InApp/tests/index.test.js +154 -50
- package/v2Containers/InApp/tests/reducer.test.js +34 -0
- package/v2Containers/InApp/tests/sagas.test.js +61 -9
- package/v2Containers/InApp/tests/selectors.test.js +612 -0
- package/v2Containers/InAppWrapper/components/InAppWrapperView.js +162 -0
- package/v2Containers/InAppWrapper/components/__tests__/InAppWrapperView.test.js +267 -0
- package/v2Containers/InAppWrapper/components/inAppWrapperView.scss +9 -0
- package/v2Containers/InAppWrapper/constants.js +16 -0
- package/v2Containers/InAppWrapper/hooks/__tests__/useInAppWrapper.test.js +473 -0
- package/v2Containers/InAppWrapper/hooks/useInAppWrapper.js +198 -0
- package/v2Containers/InAppWrapper/index.js +148 -0
- package/v2Containers/InAppWrapper/messages.js +49 -0
- package/v2Containers/InappAdvance/index.js +1099 -0
- package/v2Containers/InappAdvance/index.scss +10 -0
- package/v2Containers/InappAdvance/tests/index.test.js +448 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -3
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -2
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -25
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -18
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +12 -46
- package/v2Containers/SmsTrai/Create/tests/__snapshots__/index.test.js.snap +0 -4
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -8
- package/v2Containers/TagList/index.js +67 -1
- package/v2Containers/Templates/ChannelTypeIllustration.js +1 -13
- package/v2Containers/Templates/_templates.scss +56 -200
- package/v2Containers/Templates/actions.js +1 -2
- package/v2Containers/Templates/constants.js +0 -1
- package/v2Containers/Templates/index.js +124 -277
- package/v2Containers/Templates/messages.js +4 -24
- package/v2Containers/Templates/reducer.js +0 -2
- package/v2Containers/Templates/tests/index.test.js +0 -10
- package/v2Containers/TemplatesV2/index.js +2 -3
- package/v2Containers/TemplatesV2/messages.js +0 -4
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -132
- package/v2Components/CapImageUrlUpload/constants.js +0 -19
- package/v2Components/CapImageUrlUpload/index.js +0 -455
- package/v2Components/CapImageUrlUpload/index.scss +0 -35
- package/v2Components/CapImageUrlUpload/messages.js +0 -47
- package/v2Containers/WebPush/Create/components/ButtonForm.js +0 -175
- package/v2Containers/WebPush/Create/components/ButtonItem.js +0 -101
- package/v2Containers/WebPush/Create/components/ButtonList.js +0 -144
- package/v2Containers/WebPush/Create/components/_buttons.scss +0 -246
- package/v2Containers/WebPush/Create/components/tests/ButtonForm.test.js +0 -554
- package/v2Containers/WebPush/Create/components/tests/ButtonItem.test.js +0 -607
- package/v2Containers/WebPush/Create/components/tests/ButtonList.test.js +0 -633
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonForm.test.js.snap +0 -666
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonItem.test.js.snap +0 -74
- package/v2Containers/WebPush/Create/components/tests/__snapshots__/ButtonList.test.js.snap +0 -80
- package/v2Containers/WebPush/Create/index.js +0 -1755
- package/v2Containers/WebPush/Create/index.scss +0 -123
- package/v2Containers/WebPush/Create/messages.js +0 -199
- package/v2Containers/WebPush/Create/preview/DevicePreviewContent.js +0 -241
- package/v2Containers/WebPush/Create/preview/NotificationContainer.js +0 -290
- package/v2Containers/WebPush/Create/preview/PreviewContent.js +0 -81
- package/v2Containers/WebPush/Create/preview/PreviewControls.js +0 -240
- package/v2Containers/WebPush/Create/preview/PreviewDisclaimer.js +0 -23
- package/v2Containers/WebPush/Create/preview/WebPushPreview.js +0 -144
- package/v2Containers/WebPush/Create/preview/assets/Light.svg +0 -53
- package/v2Containers/WebPush/Create/preview/assets/Top.svg +0 -5
- package/v2Containers/WebPush/Create/preview/assets/chrome-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/edge-icon.png +0 -0
- package/v2Containers/WebPush/Create/preview/assets/firefox-icon.svg +0 -106
- package/v2Containers/WebPush/Create/preview/assets/iOS.svg +0 -26
- package/v2Containers/WebPush/Create/preview/assets/opera-icon.svg +0 -18
- package/v2Containers/WebPush/Create/preview/assets/safari-icon.svg +0 -29
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileChromeHeader.js +0 -44
- package/v2Containers/WebPush/Create/preview/components/AndroidMobileExpanded.js +0 -110
- package/v2Containers/WebPush/Create/preview/components/IOSHeader.js +0 -45
- package/v2Containers/WebPush/Create/preview/components/NotificationExpandedContent.js +0 -72
- package/v2Containers/WebPush/Create/preview/components/NotificationHeader.js +0 -55
- package/v2Containers/WebPush/Create/preview/components/WindowsChromeExpanded.js +0 -70
- package/v2Containers/WebPush/Create/preview/components/tests/AndroidMobileExpanded.test.js +0 -512
- package/v2Containers/WebPush/Create/preview/components/tests/__snapshots__/AndroidMobileExpanded.test.js.snap +0 -77
- package/v2Containers/WebPush/Create/preview/config/notificationMappings.js +0 -527
- package/v2Containers/WebPush/Create/preview/constants.js +0 -162
- package/v2Containers/WebPush/Create/preview/notification-container.scss +0 -104
- package/v2Containers/WebPush/Create/preview/preview.scss +0 -409
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-chrome.scss +0 -300
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-edge.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-firefox.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-mobile-opera.scss +0 -12
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-chrome.scss +0 -303
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-edge.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-firefox.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_android-tablet-opera.scss +0 -11
- package/v2Containers/WebPush/Create/preview/styles/_base.scss +0 -188
- package/v2Containers/WebPush/Create/preview/styles/_ios.scss +0 -106
- package/v2Containers/WebPush/Create/preview/styles/_ipados.scss +0 -107
- package/v2Containers/WebPush/Create/preview/styles/_macos-chrome.scss +0 -75
- package/v2Containers/WebPush/Create/preview/styles/_windows-chrome.scss +0 -174
- package/v2Containers/WebPush/Create/preview/tests/DevicePreviewContent.test.js +0 -909
- package/v2Containers/WebPush/Create/preview/tests/NotificationContainer.test.js +0 -1077
- package/v2Containers/WebPush/Create/preview/tests/PreviewControls.test.js +0 -723
- package/v2Containers/WebPush/Create/preview/tests/WebPushPreview.test.js +0 -943
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/DevicePreviewContent.test.js.snap +0 -128
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/NotificationContainer.test.js.snap +0 -121
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/PreviewControls.test.js.snap +0 -144
- package/v2Containers/WebPush/Create/preview/tests/__snapshots__/WebPushPreview.test.js.snap +0 -127
- package/v2Containers/WebPush/Create/utils/urlValidation.js +0 -116
- package/v2Containers/WebPush/Create/utils/urlValidation.test.js +0 -449
- package/v2Containers/WebPush/actions.js +0 -60
- package/v2Containers/WebPush/constants.js +0 -108
- package/v2Containers/WebPush/index.js +0 -2
- package/v2Containers/WebPush/reducer.js +0 -104
- package/v2Containers/WebPush/sagas.js +0 -119
- package/v2Containers/WebPush/selectors.js +0 -65
- package/v2Containers/WebPush/tests/reducer.test.js +0 -863
- package/v2Containers/WebPush/tests/sagas.test.js +0 -566
- package/v2Containers/WebPush/tests/selectors.test.js +0 -960
package/assets/Android.png
CHANGED
|
Binary file
|
package/assets/iOS.png
CHANGED
|
Binary file
|
package/constants/unified.js
CHANGED
|
@@ -45,6 +45,7 @@ export const GIFT_CARDS = 'GIFT_CARDS';
|
|
|
45
45
|
export const PROMO_ENGINE = 'PROMO_ENGINE';
|
|
46
46
|
export const LIQUID_SUPPORT = 'ENABLE_LIQUID_SUPPORT';
|
|
47
47
|
export const ENABLE_NEW_MPUSH = 'ENABLE_NEW_MPUSH';
|
|
48
|
+
export const SUPPORT_CK_EDITOR = 'SUPPORT_CK_EDITOR';
|
|
48
49
|
export const CUSTOM_TAG = 'CustomTagMessage';
|
|
49
50
|
export const CUSTOMER_EXTENDED_FIELD = 'Customer extended fields';
|
|
50
51
|
export const EXTENDED_TAG = 'ExtendedTagMessage';
|
|
@@ -168,7 +169,7 @@ export const JAPANESE_HIDE_DATE_TAGS = [
|
|
|
168
169
|
"dd.mm.yy",
|
|
169
170
|
"dd Mon",
|
|
170
171
|
"dd/m/yyyy",
|
|
171
|
-
];
|
|
172
|
+
];
|
|
172
173
|
|
|
173
174
|
export const LIQUID_SUPPORTED_CHANNELS = [EMAIL, SMS, MOBILE_PUSH, INAPP];
|
|
174
175
|
|
package/initialReducer.js
CHANGED
|
@@ -15,6 +15,7 @@ import galleryReducer from './v2Containers/Assets/Gallery/reducer';
|
|
|
15
15
|
import CapCollapsibleLeftNavigationReducer from '@capillarytech/cap-ui-library/CapCollapsibleLeftNavigation/reducer';
|
|
16
16
|
import { AIRA_REDUCER_DOMAIN, askAiraReducer } from '@capillarytech/cap-ui-library/CapAskAira';
|
|
17
17
|
import previewAndTestReducer from './v2Components/TestAndPreviewSlidebox/reducer';
|
|
18
|
+
import inAppReducer from './v2Containers/InApp/reducer';
|
|
18
19
|
|
|
19
20
|
export const initialReducer = {
|
|
20
21
|
language: languageProviderReducer,
|
|
@@ -33,4 +34,5 @@ export const initialReducer = {
|
|
|
33
34
|
gallery: galleryReducer,
|
|
34
35
|
navigationConfig: CapCollapsibleLeftNavigationReducer,
|
|
35
36
|
previewAndTest: previewAndTestReducer,
|
|
37
|
+
inApp: inAppReducer,
|
|
36
38
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { expectSaga, testSaga } from 'redux-saga-test-plan';
|
|
2
2
|
import * as matchers from 'redux-saga-test-plan/matchers';
|
|
3
|
-
import { throwError } from 'redux-saga-test-plan/providers';
|
|
3
|
+
import { throwError, dynamic } from 'redux-saga-test-plan/providers';
|
|
4
4
|
import { call, put } from 'redux-saga/effects';
|
|
5
5
|
import { pollAssetStatus } from '../assetPolling';
|
|
6
6
|
import { getAssetStatus } from '../../services/api';
|
|
@@ -299,15 +299,25 @@ describe('assetPolling saga', () => {
|
|
|
299
299
|
|
|
300
300
|
it('should handle different asset types', () => {
|
|
301
301
|
const videoConfig = createMockConfig({ type: 'video' });
|
|
302
|
+
const videoAsset = {
|
|
303
|
+
...mockAsset,
|
|
304
|
+
type: 'VIDEO',
|
|
305
|
+
metaInfo: {
|
|
306
|
+
video_file_path_preview: 'https://example.com/video-preview.jpg',
|
|
307
|
+
},
|
|
308
|
+
};
|
|
302
309
|
|
|
303
310
|
return expectSaga(pollAssetStatus, videoConfig)
|
|
311
|
+
.provide({
|
|
312
|
+
call: delayProvider,
|
|
313
|
+
})
|
|
304
314
|
.provide([
|
|
305
315
|
[
|
|
306
316
|
matchers.call.fn(getAssetStatus),
|
|
307
317
|
{
|
|
308
318
|
response: {
|
|
309
319
|
status: 'completed',
|
|
310
|
-
asset:
|
|
320
|
+
asset: videoAsset,
|
|
311
321
|
},
|
|
312
322
|
},
|
|
313
323
|
],
|
|
@@ -316,13 +326,74 @@ describe('assetPolling saga', () => {
|
|
|
316
326
|
type: 'ASSET_COMPLETED',
|
|
317
327
|
payload: {
|
|
318
328
|
assetId: mockAssetId,
|
|
319
|
-
asset:
|
|
329
|
+
asset: videoAsset,
|
|
320
330
|
duration: 0, // Date.now() - startTime = 0 when mocked
|
|
321
331
|
},
|
|
322
332
|
})
|
|
323
333
|
.run({ timeout: 15000 });
|
|
324
334
|
});
|
|
325
335
|
|
|
336
|
+
it('should continue polling for video assets without video_file_path_preview even when status is completed', () => {
|
|
337
|
+
const videoConfig = createMockConfig({
|
|
338
|
+
type: 'video',
|
|
339
|
+
maxDuration: 50000, // Longer timeout for multiple polls
|
|
340
|
+
});
|
|
341
|
+
const videoAssetWithoutPreview = {
|
|
342
|
+
...mockAsset,
|
|
343
|
+
type: 'VIDEO',
|
|
344
|
+
metaInfo: {}, // No video_file_path_preview
|
|
345
|
+
};
|
|
346
|
+
const videoAssetWithPreview = {
|
|
347
|
+
...mockAsset,
|
|
348
|
+
type: 'VIDEO',
|
|
349
|
+
metaInfo: {
|
|
350
|
+
video_file_path_preview: 'https://example.com/video-preview.jpg',
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
// Create responses array that will be consumed sequentially
|
|
355
|
+
const responses = [
|
|
356
|
+
{
|
|
357
|
+
response: {
|
|
358
|
+
status: 'completed',
|
|
359
|
+
asset: videoAssetWithoutPreview,
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
response: {
|
|
364
|
+
status: 'completed',
|
|
365
|
+
asset: videoAssetWithPreview,
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
];
|
|
369
|
+
|
|
370
|
+
let callIndex = 0;
|
|
371
|
+
|
|
372
|
+
return expectSaga(pollAssetStatus, videoConfig)
|
|
373
|
+
.provide({
|
|
374
|
+
call: delayProvider,
|
|
375
|
+
})
|
|
376
|
+
.provide([
|
|
377
|
+
[
|
|
378
|
+
matchers.call.fn(getAssetStatus),
|
|
379
|
+
dynamic(() => {
|
|
380
|
+
const response = responses[callIndex] || responses[responses.length - 1];
|
|
381
|
+
callIndex++;
|
|
382
|
+
return response;
|
|
383
|
+
}),
|
|
384
|
+
],
|
|
385
|
+
])
|
|
386
|
+
.put({
|
|
387
|
+
type: 'ASSET_COMPLETED',
|
|
388
|
+
payload: {
|
|
389
|
+
assetId: mockAssetId,
|
|
390
|
+
asset: videoAssetWithPreview,
|
|
391
|
+
duration: 0, // Date.now() - startTime = 0 when mocked
|
|
392
|
+
},
|
|
393
|
+
})
|
|
394
|
+
.run({ timeout: 20000 });
|
|
395
|
+
});
|
|
396
|
+
|
|
326
397
|
it('should handle API response with success: false', () => {
|
|
327
398
|
const config = createMockConfig();
|
|
328
399
|
const errorMessage = 'API request failed';
|
package/sagas/assetPolling.js
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
import { call, put } from 'redux-saga/effects';
|
|
19
19
|
import { getAssetStatus } from '../services/api';
|
|
20
20
|
import { ASSET_STATUS } from '../utils/assetStatusConstants';
|
|
21
|
+
import { VIDEO } from '../constants/unified';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Delay utility function compatible with redux-saga 0.16.2
|
|
@@ -118,7 +119,13 @@ export function* pollAssetStatus(config) {
|
|
|
118
119
|
}
|
|
119
120
|
|
|
120
121
|
if (statusData.status === ASSET_STATUS.COMPLETED) {
|
|
121
|
-
//
|
|
122
|
+
// For video assets, continue polling until video_file_path_preview is available
|
|
123
|
+
// Even though status is COMPLETED, video preview generation may still be in progress
|
|
124
|
+
if (statusData?.asset?.type === VIDEO.toUpperCase() &&
|
|
125
|
+
!statusData?.asset?.metaInfo?.video_file_path_preview) {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
|
|
122
129
|
if (onCompleted) {
|
|
123
130
|
const completedAction = onCompleted({
|
|
124
131
|
assetId,
|
package/services/api.js
CHANGED
|
@@ -287,11 +287,6 @@ export const createMobilePushTemplateV2 = (template) => {
|
|
|
287
287
|
return request(url, getAPICallObject('POST', template));
|
|
288
288
|
};
|
|
289
289
|
|
|
290
|
-
export const createWebPushTemplate = (template) => {
|
|
291
|
-
const url = `${API_ENDPOINT}/templates/WEBPUSH`;
|
|
292
|
-
return request(url, getAPICallObject('POST', template));
|
|
293
|
-
};
|
|
294
|
-
|
|
295
290
|
export const duplicateTemplate = ({id, channel}) => {
|
|
296
291
|
const url = `${API_ENDPOINT}/templates/duplicate/${id}/${channel}`;
|
|
297
292
|
return request(url, getAPICallObject('GET'));
|
|
@@ -470,6 +465,11 @@ export const getCmsTemplateSettingsV2 = (cmsType, projectId, cmsMode, langId, is
|
|
|
470
465
|
return API.get(url);
|
|
471
466
|
};
|
|
472
467
|
|
|
468
|
+
export const getCmsAccounts = (cmsType) => {
|
|
469
|
+
const url = `${API_ENDPOINT}/cms/accounts?type=${cmsType}`;
|
|
470
|
+
return API.get(url);
|
|
471
|
+
};
|
|
472
|
+
|
|
473
473
|
export const getCmsTemplateData = (cmsType, projectId, langId) => {
|
|
474
474
|
const url = `${API_ENDPOINT}/cms/getContent?type=${cmsType}&projectId=${projectId}&langId=${langId}`;
|
|
475
475
|
return API.get(url);
|
|
@@ -725,4 +725,9 @@ export const getAssetStatus = (type, assetId) => {
|
|
|
725
725
|
return request(url, getAPICallObject('GET'));
|
|
726
726
|
};
|
|
727
727
|
|
|
728
|
+
export const getBeePopupBuilderToken = () => {
|
|
729
|
+
const url = `${API_ENDPOINT}/common/getInappTokenData`;
|
|
730
|
+
return request(url, getAPICallObject('GET'));
|
|
731
|
+
};
|
|
732
|
+
|
|
728
733
|
export {request, getAPICallObject};
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
updateMetaConfig,
|
|
27
27
|
getMediaDetails,
|
|
28
28
|
getAssetStatus,
|
|
29
|
+
getBeePopupBuilderToken,
|
|
29
30
|
} from '../api';
|
|
30
31
|
import { mockData } from './mockData';
|
|
31
32
|
import getSchema from '../getSchema';
|
|
@@ -973,3 +974,20 @@ describe('getAssetStatus', () => {
|
|
|
973
974
|
expect(callArgs[0]).toContain('/assets/video/asset-456/status');
|
|
974
975
|
});
|
|
975
976
|
});
|
|
977
|
+
|
|
978
|
+
describe('getBeePopupBuilderToken', () => {
|
|
979
|
+
it('should return correct response', async () => {
|
|
980
|
+
global.fetch.mockReturnValue(Promise.resolve({
|
|
981
|
+
status: 200,
|
|
982
|
+
json: () => Promise.resolve({
|
|
983
|
+
status: 200,
|
|
984
|
+
response: 'test',
|
|
985
|
+
}),
|
|
986
|
+
}));
|
|
987
|
+
const result = await getBeePopupBuilderToken();
|
|
988
|
+
expect(result).toEqual({
|
|
989
|
+
status: 200,
|
|
990
|
+
response: 'test',
|
|
991
|
+
});
|
|
992
|
+
});
|
|
993
|
+
});
|
package/translations/en.json
CHANGED
|
@@ -2022,7 +2022,6 @@
|
|
|
2022
2022
|
"creatives.containersV2.Whatsapp.vietnamese": "Vietnamese",
|
|
2023
2023
|
"creatives.containersV2.Whatsapp.whatsappCreateNotification": "{name} has been sent for approval",
|
|
2024
2024
|
"creatives.containersV2.Whatsapp.zulu": "Zulu",
|
|
2025
|
-
"creatives.containersV2.WebPush.addLabels": "Add labels",
|
|
2026
2025
|
"creatives.containersV2.addLabels": "Add labels",
|
|
2027
2026
|
"creatives.containersV2.appName": "App Name",
|
|
2028
2027
|
"creatives.containersV2.applyNow": "Apply now",
|
package/utils/common.js
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
BADGES_ISSUE,
|
|
23
23
|
ENABLE_WECHAT,
|
|
24
24
|
LIQUID_SUPPORT,
|
|
25
|
+
SUPPORT_CK_EDITOR,
|
|
25
26
|
ENABLE_NEW_MPUSH
|
|
26
27
|
} from '../constants/unified';
|
|
27
28
|
import { apiMessageFormatHandler } from './commonUtils';
|
|
@@ -95,6 +96,10 @@ export const hasLiquidSupportFeature = Auth.hasFeatureAccess.bind(
|
|
|
95
96
|
LIQUID_SUPPORT,
|
|
96
97
|
);
|
|
97
98
|
|
|
99
|
+
export const hasSupportCKEditor = Auth.hasFeatureAccess.bind(
|
|
100
|
+
null,
|
|
101
|
+
SUPPORT_CK_EDITOR,
|
|
102
|
+
);
|
|
98
103
|
|
|
99
104
|
export const hasGiftVoucherFeature = Auth.hasFeatureAccess.bind(
|
|
100
105
|
null,
|
package/utils/commonUtils.js
CHANGED
|
@@ -398,7 +398,20 @@ export const validateMobilePushContent = async (formData, options) => {
|
|
|
398
398
|
// Helper function to extract content for a platform
|
|
399
399
|
export const extractContent = (platformData) => {
|
|
400
400
|
if (!platformData) return '';
|
|
401
|
-
const { title, message, ctas } = platformData;
|
|
401
|
+
const { title, message, ctas, isBEEeditor, beeHtml } = platformData;
|
|
402
|
+
|
|
403
|
+
// For BEE editor, extract content from beeHtml
|
|
404
|
+
if (isBEEeditor && beeHtml) {
|
|
405
|
+
// beeHtml can be an object with value property or a string
|
|
406
|
+
const beeHtmlContent = typeof beeHtml === 'string' ? beeHtml : (beeHtml?.value || '');
|
|
407
|
+
return [
|
|
408
|
+
title,
|
|
409
|
+
beeHtmlContent,
|
|
410
|
+
...((ctas?.map((cta) => cta?.text || cta?.actionLink)) || []),
|
|
411
|
+
].filter(Boolean).join(' ');
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// For regular content
|
|
402
415
|
return [
|
|
403
416
|
title,
|
|
404
417
|
message,
|
|
@@ -1376,4 +1376,228 @@ 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('Test Title');
|
|
1394
|
+
expect(result).toContain('<p>BEE HTML Content</p>');
|
|
1395
|
+
expect(result).toContain('Click Here');
|
|
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('Test Title');
|
|
1411
|
+
expect(result).toContain('<p>BEE HTML from Object</p>');
|
|
1412
|
+
expect(result).toContain('Button 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
|
+
});
|
|
1379
1602
|
});
|
|
1603
|
+
|
|
@@ -101,7 +101,6 @@ 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');
|
|
105
104
|
return templateConfig;
|
|
106
105
|
}
|
|
107
106
|
|
|
@@ -109,24 +108,19 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
109
108
|
let transformDirection;
|
|
110
109
|
if (forceDirection) {
|
|
111
110
|
transformDirection = forceDirection;
|
|
112
|
-
console.log(`Forced transformation direction: ${transformDirection}`);
|
|
113
111
|
} else {
|
|
114
112
|
// Auto-detect based on content
|
|
115
113
|
if (contentType === MEDIA_CONTENT_TYPE.URLS) {
|
|
116
114
|
transformDirection = TRANSFORM_DIRECTION.FORWARD; // URLs → tags
|
|
117
|
-
console.log('Detected URLs, applying forward transformation (URLs → tags)');
|
|
118
115
|
} else if (contentType === MEDIA_CONTENT_TYPE.TAGS) {
|
|
119
116
|
transformDirection = TRANSFORM_DIRECTION.REVERSE; // tags → URLs
|
|
120
|
-
console.log('Detected media_content tags, applying reverse transformation (tags → URLs)');
|
|
121
117
|
} else if (contentType === MEDIA_CONTENT_TYPE.MIXED) {
|
|
122
118
|
transformDirection = TRANSFORM_DIRECTION.SMART; // Handle mixed content intelligently
|
|
123
|
-
console.log('Detected mixed content, applying smart transformation');
|
|
124
119
|
}
|
|
125
120
|
}
|
|
126
121
|
|
|
127
122
|
const newConfig = cloneDeep(templateConfig);
|
|
128
123
|
try {
|
|
129
|
-
console.log(`Fetching media details for ${transformDirection} transformation, ID: ${mediaDetailsId}`);
|
|
130
124
|
|
|
131
125
|
// Fetch media details mapping from API
|
|
132
126
|
const response = await getMediaDetails({ id: mediaDetailsId })
|
|
@@ -145,7 +139,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
145
139
|
idToUrlMapping[mediaId] = url;
|
|
146
140
|
});
|
|
147
141
|
|
|
148
|
-
console.log(`Processing ${Object.keys(urlToIdMapping).length} media mappings`);
|
|
149
142
|
|
|
150
143
|
// Apply transformations based on direction
|
|
151
144
|
newConfig?.cards?.forEach(card => {
|
|
@@ -157,7 +150,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
157
150
|
// Forward transformation: URL → tag
|
|
158
151
|
const mediaDetailId = urlToIdMapping[currentUrl];
|
|
159
152
|
if (mediaDetailId) {
|
|
160
|
-
console.log(`Forward: ${currentUrl} → {{media_content(${mediaDetailId})}}`);
|
|
161
153
|
card.media.url = `{{media_content(${mediaDetailId})}}`;
|
|
162
154
|
} else {
|
|
163
155
|
console.warn(`No media detail ID found for URL: ${currentUrl}`);
|
|
@@ -169,7 +161,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
169
161
|
if (mediaId) {
|
|
170
162
|
const actualUrl = idToUrlMapping[mediaId];
|
|
171
163
|
if (actualUrl) {
|
|
172
|
-
console.log(`Reverse: {{media_content(${mediaId})}} → ${actualUrl}`);
|
|
173
164
|
card.media.url = actualUrl;
|
|
174
165
|
} else {
|
|
175
166
|
console.warn(`No URL found for media ID: ${mediaId}`);
|
|
@@ -185,7 +176,6 @@ export async function transformTemplateConfigWithMediaDetails(templateConfig, ch
|
|
|
185
176
|
console.error('Failed to fetch media details for transformation:', error);
|
|
186
177
|
|
|
187
178
|
// Fallback: try to extract/convert what we can without API
|
|
188
|
-
console.log('Falling back to URL extraction method');
|
|
189
179
|
newConfig.cards.forEach(card => {
|
|
190
180
|
if (card.media && card.media.url) {
|
|
191
181
|
if (transformDirection === TRANSFORM_DIRECTION.FORWARD) {
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
RCS,
|
|
11
11
|
LINE,
|
|
12
12
|
VIBER,
|
|
13
|
-
WEBPUSH,
|
|
14
13
|
EMF,
|
|
15
14
|
VENENO,
|
|
16
15
|
TEXT,
|
|
@@ -64,8 +63,6 @@ export const transformChannelPayload = (data, options = {}) => {
|
|
|
64
63
|
return transformLinePayload(data, options);
|
|
65
64
|
case VIBER:
|
|
66
65
|
return transformViberPayload(data, options);
|
|
67
|
-
case WEBPUSH:
|
|
68
|
-
return transformWebpushPayload(data, options);
|
|
69
66
|
default:
|
|
70
67
|
return data; // Return unchanged for unsupported channels
|
|
71
68
|
}
|
|
@@ -320,45 +317,6 @@ const transformViberPayload = (viberData, options = {}) => {
|
|
|
320
317
|
return payload;
|
|
321
318
|
};
|
|
322
319
|
|
|
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
|
-
isDefault: webpushData?.messageContent?.content?.isDefault || false,
|
|
346
|
-
storeType: webpushData?.messageContent?.content?.storeType || 'REGISTERED_STORE',
|
|
347
|
-
content: {
|
|
348
|
-
title: webpushContent?.title || '',
|
|
349
|
-
message: webpushContent?.message || '',
|
|
350
|
-
...(webpushContent?.iconImageUrl && { iconImageUrl: webpushContent.iconImageUrl }),
|
|
351
|
-
...(webpushContent?.cta && { cta: webpushContent.cta }),
|
|
352
|
-
...(webpushContent?.expandableDetails && { expandableDetails: webpushContent.expandableDetails }),
|
|
353
|
-
},
|
|
354
|
-
messageSubject: webpushData?.messageSubject || "",
|
|
355
|
-
offers: webpushData?.messageContent?.content?.offers || [],
|
|
356
|
-
};
|
|
357
|
-
payload.centralCommsPayload.webpushDeliverySettings = webpushDeliverySettings;
|
|
358
|
-
|
|
359
|
-
return payload;
|
|
360
|
-
};
|
|
361
|
-
|
|
362
320
|
// Checks if the template has changed
|
|
363
321
|
export const getTemplateDiffState = (channel, oldData, newData) => {
|
|
364
322
|
switch (channel.toUpperCase()) {
|