@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.
Files changed (105) hide show
  1. package/config/app.js +6 -0
  2. package/containers/App/constants.js +0 -1
  3. package/containers/Email/index.js +5 -5
  4. package/containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
  5. package/initialReducer.js +2 -0
  6. package/package.json +1 -1
  7. package/services/api.js +94 -1
  8. package/services/tests/api.test.js +191 -0
  9. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +3 -8
  10. package/tests/integration/TemplateCreation/api-response.js +0 -5
  11. package/tests/integration/TemplateCreation/msw-handler.js +63 -42
  12. package/utils/common.js +0 -7
  13. package/utils/commonUtils.js +6 -2
  14. package/v2Components/CapImageUpload/index.js +45 -51
  15. package/v2Components/CapInAppCTA/index.js +0 -1
  16. package/v2Components/CapTagList/index.js +120 -177
  17. package/v2Components/CapVideoUpload/constants.js +0 -3
  18. package/v2Components/CapVideoUpload/index.js +110 -167
  19. package/v2Components/CapVideoUpload/messages.js +0 -16
  20. package/v2Components/Carousel/index.js +13 -15
  21. package/v2Components/CustomerSearchSection/_customerSearch.scss +309 -0
  22. package/v2Components/CustomerSearchSection/constants.js +5 -0
  23. package/v2Components/CustomerSearchSection/index.js +362 -0
  24. package/v2Components/CustomerSearchSection/messages.js +20 -0
  25. package/v2Components/CustomerSearchSection/tests/utils.test.js +334 -0
  26. package/v2Components/CustomerSearchSection/utils.js +49 -0
  27. package/v2Components/ErrorInfoNote/style.scss +0 -1
  28. package/v2Components/MobilePushPreviewV2/index.js +5 -37
  29. package/v2Components/TemplatePreview/_templatePreview.scss +72 -114
  30. package/v2Components/TemplatePreview/index.js +50 -178
  31. package/v2Components/TemplatePreview/messages.js +0 -4
  32. package/v2Components/TestAndPreviewSlidebox/_testAndPreviewSlidebox.scss +543 -0
  33. package/v2Components/TestAndPreviewSlidebox/actions.js +67 -0
  34. package/v2Components/TestAndPreviewSlidebox/constants.js +67 -0
  35. package/v2Components/TestAndPreviewSlidebox/index.js +771 -0
  36. package/v2Components/TestAndPreviewSlidebox/messages.js +147 -0
  37. package/v2Components/TestAndPreviewSlidebox/reducer.js +233 -0
  38. package/v2Components/TestAndPreviewSlidebox/sagas.js +258 -0
  39. package/v2Components/TestAndPreviewSlidebox/selectors.js +142 -0
  40. package/v2Components/TestAndPreviewSlidebox/tests/actions.test.js +80 -0
  41. package/v2Components/TestAndPreviewSlidebox/tests/reducer.test.js +367 -0
  42. package/v2Components/TestAndPreviewSlidebox/tests/saga.rtl.test.js +192 -0
  43. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +652 -0
  44. package/v2Components/TestAndPreviewSlidebox/tests/selector.test.js +182 -0
  45. package/v2Containers/CreativesContainer/SlideBoxContent.js +21 -9
  46. package/v2Containers/CreativesContainer/SlideBoxFooter.js +23 -2
  47. package/v2Containers/CreativesContainer/index.js +160 -195
  48. package/v2Containers/CreativesContainer/messages.js +4 -0
  49. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +21 -0
  50. package/v2Containers/Email/index.js +18 -6
  51. package/v2Containers/EmailWrapper/hooks/useEmailWrapper.js +10 -0
  52. package/v2Containers/EmailWrapper/index.js +6 -0
  53. package/v2Containers/InApp/constants.js +0 -1
  54. package/v2Containers/InApp/index.js +13 -13
  55. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/content.test.js.snap +3 -0
  56. package/v2Containers/Line/Container/ImageCarousel/tests/__snapshots__/index.test.js.snap +2 -0
  57. package/v2Containers/Line/Container/Wrapper/tests/__snapshots__/index.test.js.snap +2 -0
  58. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +9 -0
  59. package/v2Containers/MobilePush/Create/index.js +0 -1
  60. package/v2Containers/MobilePush/commonMethods.js +14 -7
  61. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +23 -5
  62. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -0
  63. package/v2Containers/TagList/index.js +10 -56
  64. package/v2Containers/Templates/_templates.scss +1 -101
  65. package/v2Containers/Templates/index.js +35 -147
  66. package/v2Containers/Templates/messages.js +0 -8
  67. package/v2Containers/Templates/sagas.js +0 -2
  68. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +1 -1
  69. package/v2Containers/Whatsapp/constants.js +0 -1
  70. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +35 -0
  71. package/utils/createPayload.js +0 -270
  72. package/utils/tests/createPayload.test.js +0 -761
  73. package/v2Components/CapMpushCTA/constants.js +0 -25
  74. package/v2Components/CapMpushCTA/index.js +0 -332
  75. package/v2Components/CapMpushCTA/index.scss +0 -95
  76. package/v2Components/CapMpushCTA/messages.js +0 -89
  77. package/v2Components/TemplatePreview/assets/images/Android _ With date and time.svg +0 -29
  78. package/v2Components/TemplatePreview/assets/images/android.svg +0 -9
  79. package/v2Components/TemplatePreview/assets/images/iOS _ With date and time.svg +0 -26
  80. package/v2Components/TemplatePreview/assets/images/ios.svg +0 -9
  81. package/v2Containers/Email/tests/index.test.js +0 -35
  82. package/v2Containers/MobilePushNew/actions.js +0 -116
  83. package/v2Containers/MobilePushNew/components/CtaButtons.js +0 -170
  84. package/v2Containers/MobilePushNew/components/MediaUploaders.js +0 -686
  85. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +0 -279
  86. package/v2Containers/MobilePushNew/components/index.js +0 -5
  87. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +0 -779
  88. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +0 -2114
  89. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +0 -343
  90. package/v2Containers/MobilePushNew/constants.js +0 -115
  91. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +0 -1299
  92. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +0 -1223
  93. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +0 -246
  94. package/v2Containers/MobilePushNew/hooks/useUpload.js +0 -709
  95. package/v2Containers/MobilePushNew/index.js +0 -2170
  96. package/v2Containers/MobilePushNew/index.scss +0 -308
  97. package/v2Containers/MobilePushNew/messages.js +0 -226
  98. package/v2Containers/MobilePushNew/reducer.js +0 -160
  99. package/v2Containers/MobilePushNew/sagas.js +0 -198
  100. package/v2Containers/MobilePushNew/selectors.js +0 -55
  101. package/v2Containers/MobilePushNew/tests/reducer.test.js +0 -741
  102. package/v2Containers/MobilePushNew/tests/sagas.test.js +0 -863
  103. package/v2Containers/MobilePushNew/tests/selectors.test.js +0 -425
  104. package/v2Containers/MobilePushNew/tests/utils.test.js +0 -322
  105. 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;