@capillarytech/creatives-library 8.0.125-alpha.6 → 8.0.126
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/config/app.js +6 -0
- package/containers/App/constants.js +0 -1
- package/containers/Email/index.js +5 -5
- package/containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
- package/initialReducer.js +2 -0
- package/package.json +1 -1
- package/services/api.js +94 -1
- package/services/tests/api.test.js +191 -0
- package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +3 -8
- package/tests/integration/TemplateCreation/api-response.js +0 -5
- package/tests/integration/TemplateCreation/msw-handler.js +63 -42
- package/utils/common.js +0 -7
- package/utils/commonUtils.js +6 -2
- package/v2Components/CapImageUpload/index.js +45 -51
- package/v2Components/CapInAppCTA/index.js +0 -1
- package/v2Components/CapTagList/index.js +120 -177
- package/v2Components/CapVideoUpload/constants.js +0 -3
- package/v2Components/CapVideoUpload/index.js +110 -167
- package/v2Components/CapVideoUpload/messages.js +0 -16
- package/v2Components/Carousel/index.js +13 -15
- package/v2Components/CustomerSearchSection/_customerSearch.scss +309 -0
- package/v2Components/CustomerSearchSection/constants.js +5 -0
- package/v2Components/CustomerSearchSection/index.js +362 -0
- package/v2Components/CustomerSearchSection/messages.js +20 -0
- package/v2Components/CustomerSearchSection/tests/utils.test.js +334 -0
- package/v2Components/CustomerSearchSection/utils.js +49 -0
- package/v2Components/ErrorInfoNote/style.scss +0 -1
- package/v2Components/MobilePushPreviewV2/index.js +5 -37
- package/v2Components/TemplatePreview/_templatePreview.scss +72 -114
- package/v2Components/TemplatePreview/index.js +50 -178
- package/v2Components/TemplatePreview/messages.js +0 -4
- package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +543 -0
- package/v2Components/TestAndPreviewSlidebox/actions.js +67 -0
- package/v2Components/TestAndPreviewSlidebox/constants.js +67 -0
- package/v2Components/TestAndPreviewSlidebox/index.js +771 -0
- package/v2Components/TestAndPreviewSlidebox/messages.js +147 -0
- package/v2Components/TestAndPreviewSlidebox/reducer.js +233 -0
- package/v2Components/TestAndPreviewSlidebox/sagas.js +258 -0
- package/v2Components/TestAndPreviewSlidebox/selectors.js +142 -0
- package/v2Components/TestAndPreviewSlidebox/tests/actions.test.js +80 -0
- package/v2Components/TestAndPreviewSlidebox/tests/reducer.test.js +367 -0
- package/v2Components/TestAndPreviewSlidebox/tests/saga.rtl.test.js +192 -0
- package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +652 -0
- package/v2Components/TestAndPreviewSlidebox/tests/selector.test.js +182 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +21 -9
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +23 -2
- package/v2Containers/CreativesContainer/index.js +160 -195
- package/v2Containers/CreativesContainer/messages.js +4 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +21 -0
- package/v2Containers/Email/index.js +18 -6
- package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +10 -0
- package/v2Containers/EmailWrapper/index.js +6 -0
- package/v2Containers/InApp/constants.js +0 -1
- package/v2Containers/InApp/index.js +13 -13
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
- package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
- package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
- package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
- package/v2Containers/MobilePush/Create/index.js +0 -1
- package/v2Containers/MobilePush/commonMethods.js +14 -7
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +23 -5
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
- package/v2Containers/TagList/index.js +10 -56
- package/v2Containers/Templates/_templates.scss +1 -101
- package/v2Containers/Templates/index.js +35 -147
- package/v2Containers/Templates/messages.js +0 -8
- package/v2Containers/Templates/sagas.js +0 -2
- package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
- package/v2Containers/Whatsapp/constants.js +0 -1
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -0
- package/utils/createPayload.js +0 -270
- package/utils/tests/createPayload.test.js +0 -761
- package/v2Components/CapMpushCTA/constants.js +0 -25
- package/v2Components/CapMpushCTA/index.js +0 -332
- package/v2Components/CapMpushCTA/index.scss +0 -95
- package/v2Components/CapMpushCTA/messages.js +0 -89
- package/v2Components/TemplatePreview/assets/images/Android _ With date and time.svg +0 -29
- package/v2Components/TemplatePreview/assets/images/android.svg +0 -9
- package/v2Components/TemplatePreview/assets/images/iOS _ With date and time.svg +0 -26
- package/v2Components/TemplatePreview/assets/images/ios.svg +0 -9
- package/v2Containers/Email/tests/index.test.js +0 -35
- package/v2Containers/MobilePushNew/actions.js +0 -116
- package/v2Containers/MobilePushNew/components/CtaButtons.js +0 -170
- package/v2Containers/MobilePushNew/components/MediaUploaders.js +0 -686
- package/v2Containers/MobilePushNew/components/PlatformContentFields.js +0 -279
- package/v2Containers/MobilePushNew/components/index.js +0 -5
- package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +0 -779
- package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +0 -2114
- package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +0 -343
- package/v2Containers/MobilePushNew/constants.js +0 -115
- package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +0 -1299
- package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +0 -1223
- package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +0 -246
- package/v2Containers/MobilePushNew/hooks/useUpload.js +0 -709
- package/v2Containers/MobilePushNew/index.js +0 -2170
- package/v2Containers/MobilePushNew/index.scss +0 -308
- package/v2Containers/MobilePushNew/messages.js +0 -226
- package/v2Containers/MobilePushNew/reducer.js +0 -160
- package/v2Containers/MobilePushNew/sagas.js +0 -198
- package/v2Containers/MobilePushNew/selectors.js +0 -55
- package/v2Containers/MobilePushNew/tests/reducer.test.js +0 -741
- package/v2Containers/MobilePushNew/tests/sagas.test.js +0 -863
- package/v2Containers/MobilePushNew/tests/selectors.test.js +0 -425
- package/v2Containers/MobilePushNew/tests/utils.test.js +0 -322
- package/v2Containers/MobilePushNew/utils.js +0 -33
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
// eslint-disable-next-line jsx-a11y/href-no-hash
|
|
2
|
-
import { useCallback, useEffect, useRef } from 'react';
|
|
3
|
-
import {
|
|
4
|
-
ANDROID, GIF, IMAGE, IOS, VIDEO,
|
|
5
|
-
} from '../constants';
|
|
6
|
-
import { NONE } from '../../Whatsapp/constants';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Custom hook to manage content synchronization between Android and iOS platforms
|
|
10
|
-
* @param {Object} params Configuration parameters
|
|
11
|
-
* @param {boolean} params.sameContent Whether sync is enabled
|
|
12
|
-
* @param {Function} params.setAndroidContent Android content setter
|
|
13
|
-
* @param {Function} params.setIosContent iOS content setter
|
|
14
|
-
* @param {Function} params.validateTitle Title validation function
|
|
15
|
-
* @param {Function} params.validateMessage Message validation function
|
|
16
|
-
* @param {Function} params.setAndroidTitleError Android title error setter
|
|
17
|
-
* @param {Function} params.setAndroidMessageError Android message error setter
|
|
18
|
-
* @param {Function} params.setIosTitleError iOS title error setter
|
|
19
|
-
* @param {Function} params.setIosMessageError iOS message error setter
|
|
20
|
-
* @param {Object} params.androidContent Current Android content
|
|
21
|
-
* @param {Object} params.iosContent Current iOS content
|
|
22
|
-
* @param {Function} params.updateOnMpushImageReUpload Image re-upload handler
|
|
23
|
-
* @param {Function} params.updateOnMpushVideoReUpload Video re-upload handler
|
|
24
|
-
* @param {Object} params.changeSourceRef Ref to track last changed platform
|
|
25
|
-
*/
|
|
26
|
-
const DEBOUNCE_DELAY = 500;
|
|
27
|
-
|
|
28
|
-
const usePlatformSync = ({
|
|
29
|
-
setAndroidContent,
|
|
30
|
-
setIosContent,
|
|
31
|
-
validateTitle,
|
|
32
|
-
validateMessage,
|
|
33
|
-
setAndroidTitleError,
|
|
34
|
-
setAndroidMessageError,
|
|
35
|
-
setIosTitleError,
|
|
36
|
-
setIosMessageError,
|
|
37
|
-
androidContent,
|
|
38
|
-
iosContent,
|
|
39
|
-
updateOnMpushImageReUpload,
|
|
40
|
-
updateOnMpushVideoReUpload,
|
|
41
|
-
sameContent,
|
|
42
|
-
changeSourceRef,
|
|
43
|
-
}) => {
|
|
44
|
-
// Debounce refs
|
|
45
|
-
const debounceTimeoutRef = useRef(null);
|
|
46
|
-
|
|
47
|
-
// Debounced sync effect
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
if (!sameContent || !changeSourceRef?.current) return undefined;
|
|
50
|
-
if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);
|
|
51
|
-
debounceTimeoutRef.current = setTimeout(() => {
|
|
52
|
-
if (changeSourceRef.current === 'android') {
|
|
53
|
-
setIosContent(androidContent);
|
|
54
|
-
} else if (changeSourceRef.current === 'ios') {
|
|
55
|
-
setAndroidContent(iosContent);
|
|
56
|
-
}
|
|
57
|
-
}, DEBOUNCE_DELAY);
|
|
58
|
-
return () => {
|
|
59
|
-
if (debounceTimeoutRef.current) clearTimeout(debounceTimeoutRef.current);
|
|
60
|
-
};
|
|
61
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
62
|
-
}, [androidContent, iosContent, sameContent]);
|
|
63
|
-
|
|
64
|
-
// Utility to deeply sync content between platforms (except platform-specific fields)
|
|
65
|
-
const deepSyncContent = useCallback((sourceContent, targetContent, targetPlatform) => {
|
|
66
|
-
// Deep copy all fields except platform-specific ones
|
|
67
|
-
const synced = {
|
|
68
|
-
...targetContent,
|
|
69
|
-
...sourceContent,
|
|
70
|
-
// For buttons, remap platform property
|
|
71
|
-
buttons: Array.isArray(sourceContent.buttons)
|
|
72
|
-
? sourceContent.buttons.map((btn) => ({
|
|
73
|
-
...btn,
|
|
74
|
-
platform: targetPlatform,
|
|
75
|
-
}))
|
|
76
|
-
: [],
|
|
77
|
-
};
|
|
78
|
-
return synced;
|
|
79
|
-
}, []);
|
|
80
|
-
|
|
81
|
-
// Handle title changes
|
|
82
|
-
const handleTitleChange = useCallback((platform, value) => {
|
|
83
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
84
|
-
const setError = platform === ANDROID ? setAndroidTitleError : setIosTitleError;
|
|
85
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
86
|
-
const otherSetError = platform === ANDROID ? setIosTitleError : setAndroidTitleError;
|
|
87
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
88
|
-
const refObj = changeSourceRef;
|
|
89
|
-
if (refObj && Object.prototype.hasOwnProperty.call(refObj, 'current')) {
|
|
90
|
-
refObj.current = platform === ANDROID ? 'android' : 'ios';
|
|
91
|
-
}
|
|
92
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
93
|
-
const newContent = { ...currentContent, title: value };
|
|
94
|
-
setContent(newContent);
|
|
95
|
-
setError(validateTitle(value));
|
|
96
|
-
if (sameContent) {
|
|
97
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
98
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
99
|
-
otherSetContent(synced);
|
|
100
|
-
otherSetError(validateTitle(value));
|
|
101
|
-
}
|
|
102
|
-
}, [setAndroidContent, setIosContent, setAndroidTitleError, setIosTitleError, validateTitle, changeSourceRef, sameContent, androidContent, iosContent, deepSyncContent]);
|
|
103
|
-
|
|
104
|
-
// Handle message changes
|
|
105
|
-
const handleMessageChange = useCallback((platform, value) => {
|
|
106
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
107
|
-
const setError = platform === ANDROID ? setAndroidMessageError : setIosMessageError;
|
|
108
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
109
|
-
const otherSetError = platform === ANDROID ? setIosMessageError : setAndroidMessageError;
|
|
110
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
111
|
-
const refObj = changeSourceRef;
|
|
112
|
-
if (refObj && Object.prototype.hasOwnProperty.call(refObj, 'current')) {
|
|
113
|
-
refObj.current = platform === ANDROID ? 'android' : 'ios';
|
|
114
|
-
}
|
|
115
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
116
|
-
const newContent = { ...currentContent, message: value };
|
|
117
|
-
setContent(newContent);
|
|
118
|
-
setError(validateMessage(value));
|
|
119
|
-
if (sameContent) {
|
|
120
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
121
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
122
|
-
otherSetContent(synced);
|
|
123
|
-
otherSetError(validateMessage(value));
|
|
124
|
-
}
|
|
125
|
-
}, [setAndroidContent, setIosContent, setAndroidMessageError, setIosMessageError, validateMessage, changeSourceRef, sameContent, androidContent, iosContent, deepSyncContent]);
|
|
126
|
-
|
|
127
|
-
// Handle media type changes
|
|
128
|
-
const handleMediaTypeChange = useCallback((platform, value) => {
|
|
129
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
130
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
131
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
132
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
133
|
-
const previousMediaType = currentContent.mediaType;
|
|
134
|
-
if (previousMediaType !== value) {
|
|
135
|
-
if ((previousMediaType === VIDEO || previousMediaType === GIF)
|
|
136
|
-
&& (value === IMAGE || value === NONE)) {
|
|
137
|
-
updateOnMpushVideoReUpload();
|
|
138
|
-
} else if ((previousMediaType === VIDEO && value === GIF)
|
|
139
|
-
|| (previousMediaType === GIF && value === VIDEO)) {
|
|
140
|
-
updateOnMpushVideoReUpload();
|
|
141
|
-
} else if (previousMediaType === IMAGE
|
|
142
|
-
&& (value === VIDEO || value === GIF)) {
|
|
143
|
-
updateOnMpushImageReUpload();
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
const newContent = { ...currentContent, mediaType: value };
|
|
147
|
-
setContent(newContent);
|
|
148
|
-
if (sameContent) {
|
|
149
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
150
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
151
|
-
otherSetContent(synced);
|
|
152
|
-
}
|
|
153
|
-
}, [sameContent, setAndroidContent, setIosContent, updateOnMpushImageReUpload, updateOnMpushVideoReUpload, androidContent, iosContent, deepSyncContent]);
|
|
154
|
-
|
|
155
|
-
// Handle tag selection
|
|
156
|
-
const handleTagSelect = useCallback((platform, tag, isTitle) => {
|
|
157
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
158
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
159
|
-
const otherSetError = platform === ANDROID ? setIosTitleError : setAndroidTitleError;
|
|
160
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
161
|
-
const field = isTitle ? 'title' : 'message';
|
|
162
|
-
let setError;
|
|
163
|
-
let validate;
|
|
164
|
-
if (isTitle) {
|
|
165
|
-
setError = platform === ANDROID ? setAndroidTitleError : setIosTitleError;
|
|
166
|
-
validate = validateTitle;
|
|
167
|
-
} else {
|
|
168
|
-
setError = platform === ANDROID ? setAndroidMessageError : setIosMessageError;
|
|
169
|
-
validate = validateMessage;
|
|
170
|
-
}
|
|
171
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
172
|
-
const newValue = `${(currentContent[field] || '')}{{${tag}}}`;
|
|
173
|
-
const newContent = { ...currentContent, [field]: newValue };
|
|
174
|
-
setContent(newContent);
|
|
175
|
-
setError(validate(newValue));
|
|
176
|
-
if (sameContent) {
|
|
177
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
178
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
179
|
-
otherSetContent(synced);
|
|
180
|
-
otherSetError(validate(newValue));
|
|
181
|
-
}
|
|
182
|
-
}, [androidContent, iosContent, setAndroidContent, setIosContent, setAndroidTitleError, setIosTitleError, setAndroidMessageError, setIosMessageError, validateTitle, validateMessage, sameContent, deepSyncContent]);
|
|
183
|
-
|
|
184
|
-
// Handle CTA/button changes
|
|
185
|
-
const handleButtonChange = useCallback((platform, buttons) => {
|
|
186
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
187
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
188
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
189
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
190
|
-
const newContent = { ...currentContent, buttons };
|
|
191
|
-
setContent(newContent);
|
|
192
|
-
if (sameContent) {
|
|
193
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
194
|
-
const mappedButtons = Array.isArray(buttons)
|
|
195
|
-
? buttons.map((btn) => ({
|
|
196
|
-
...btn,
|
|
197
|
-
platform: targetPlatform,
|
|
198
|
-
}))
|
|
199
|
-
: [];
|
|
200
|
-
const synced = deepSyncContent({ ...newContent, buttons: mappedButtons }, otherContent, targetPlatform);
|
|
201
|
-
otherSetContent(synced);
|
|
202
|
-
}
|
|
203
|
-
}, [androidContent, iosContent, setAndroidContent, setIosContent, sameContent, deepSyncContent]);
|
|
204
|
-
|
|
205
|
-
// Handle action on click changes
|
|
206
|
-
const handleActionOnClickChange = useCallback((platform, checked) => {
|
|
207
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
208
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
209
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
210
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
211
|
-
const newContent = { ...currentContent, actionOnClick: checked };
|
|
212
|
-
setContent(newContent);
|
|
213
|
-
if (sameContent) {
|
|
214
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
215
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
216
|
-
otherSetContent(synced);
|
|
217
|
-
}
|
|
218
|
-
}, [androidContent, iosContent, setAndroidContent, setIosContent, sameContent, deepSyncContent]);
|
|
219
|
-
|
|
220
|
-
// Handle link type changes
|
|
221
|
-
const handleLinkTypeChange = useCallback((platform, linkType) => {
|
|
222
|
-
const setContent = platform === ANDROID ? setAndroidContent : setIosContent;
|
|
223
|
-
const otherSetContent = platform === ANDROID ? setIosContent : setAndroidContent;
|
|
224
|
-
const otherContent = platform === ANDROID ? iosContent : androidContent;
|
|
225
|
-
const currentContent = platform === ANDROID ? androidContent : iosContent;
|
|
226
|
-
const newContent = { ...currentContent, linkType, deepLinkValue: '', externalLinkValue: '' };
|
|
227
|
-
setContent(newContent);
|
|
228
|
-
if (sameContent) {
|
|
229
|
-
const targetPlatform = platform === ANDROID ? IOS : ANDROID;
|
|
230
|
-
const synced = deepSyncContent(newContent, otherContent, targetPlatform);
|
|
231
|
-
otherSetContent(synced);
|
|
232
|
-
}
|
|
233
|
-
}, [androidContent, iosContent, setAndroidContent, setIosContent, sameContent, deepSyncContent]);
|
|
234
|
-
|
|
235
|
-
return {
|
|
236
|
-
handleTitleChange,
|
|
237
|
-
handleMessageChange,
|
|
238
|
-
handleTagSelect,
|
|
239
|
-
handleMediaTypeChange,
|
|
240
|
-
handleButtonChange,
|
|
241
|
-
handleActionOnClickChange,
|
|
242
|
-
handleLinkTypeChange,
|
|
243
|
-
};
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
export default usePlatformSync;
|