@capillarytech/creatives-library 8.0.129 → 8.0.130

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 (76) hide show
  1. package/containers/App/constants.js +0 -1
  2. package/containers/Templates/constants.js +10 -1
  3. package/containers/Templates/index.js +45 -45
  4. package/package.json +1 -1
  5. package/services/api.js +9 -7
  6. package/services/tests/haptic-api.test.js +387 -0
  7. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +3 -8
  8. package/tests/integration/TemplateCreation/api-response.js +0 -5
  9. package/tests/integration/TemplateCreation/msw-handler.js +63 -42
  10. package/utils/common.js +0 -7
  11. package/utils/commonUtils.js +6 -2
  12. package/utils/tests/vendorDataTransformers.test.js +512 -0
  13. package/utils/vendorDataTransformers.js +108 -0
  14. package/v2Components/CapDocumentUpload/index.js +2 -2
  15. package/v2Components/CapImageUpload/index.js +46 -59
  16. package/v2Components/CapInAppCTA/index.js +0 -1
  17. package/v2Components/CapTagList/index.js +120 -177
  18. package/v2Components/CapVideoUpload/constants.js +0 -3
  19. package/v2Components/CapVideoUpload/index.js +110 -167
  20. package/v2Components/CapVideoUpload/messages.js +0 -16
  21. package/v2Components/Carousel/index.js +13 -15
  22. package/v2Components/ErrorInfoNote/style.scss +0 -1
  23. package/v2Components/MobilePushPreviewV2/index.js +5 -37
  24. package/v2Components/TemplatePreview/_templatePreview.scss +72 -114
  25. package/v2Components/TemplatePreview/index.js +50 -178
  26. package/v2Components/TemplatePreview/messages.js +0 -4
  27. package/v2Containers/CreativesContainer/SlideBoxContent.js +62 -127
  28. package/v2Containers/CreativesContainer/index.js +136 -191
  29. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +22 -0
  30. package/v2Containers/InApp/constants.js +0 -1
  31. package/v2Containers/InApp/index.js +13 -13
  32. package/v2Containers/MobilePush/Create/index.js +0 -1
  33. package/v2Containers/MobilePush/commonMethods.js +14 -7
  34. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +5 -5
  35. package/v2Containers/TagList/index.js +10 -56
  36. package/v2Containers/Templates/_templates.scss +1 -101
  37. package/v2Containers/Templates/index.js +41 -151
  38. package/v2Containers/Templates/messages.js +0 -8
  39. package/v2Containers/Templates/sagas.js +0 -2
  40. package/v2Containers/Whatsapp/constants.js +32 -1
  41. package/v2Containers/Whatsapp/index.js +104 -25
  42. package/v2Containers/Whatsapp/tests/haptic.test.js +405 -0
  43. package/utils/createPayload.js +0 -405
  44. package/utils/tests/createPayload.test.js +0 -785
  45. package/v2Components/CapMpushCTA/constants.js +0 -25
  46. package/v2Components/CapMpushCTA/index.js +0 -402
  47. package/v2Components/CapMpushCTA/index.scss +0 -95
  48. package/v2Components/CapMpushCTA/messages.js +0 -101
  49. package/v2Components/TemplatePreview/assets/images/Android _ With date and time.svg +0 -29
  50. package/v2Components/TemplatePreview/assets/images/android.svg +0 -9
  51. package/v2Components/TemplatePreview/assets/images/iOS _ With date and time.svg +0 -26
  52. package/v2Components/TemplatePreview/assets/images/ios.svg +0 -9
  53. package/v2Containers/MobilePushNew/actions.js +0 -116
  54. package/v2Containers/MobilePushNew/components/CtaButtons.js +0 -181
  55. package/v2Containers/MobilePushNew/components/MediaUploaders.js +0 -834
  56. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +0 -345
  57. package/v2Containers/MobilePushNew/components/index.js +0 -5
  58. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +0 -798
  59. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +0 -2114
  60. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +0 -343
  61. package/v2Containers/MobilePushNew/constants.js +0 -115
  62. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +0 -1299
  63. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +0 -1223
  64. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +0 -246
  65. package/v2Containers/MobilePushNew/hooks/useUpload.js +0 -726
  66. package/v2Containers/MobilePushNew/index.js +0 -3412
  67. package/v2Containers/MobilePushNew/index.scss +0 -308
  68. package/v2Containers/MobilePushNew/messages.js +0 -242
  69. package/v2Containers/MobilePushNew/reducer.js +0 -160
  70. package/v2Containers/MobilePushNew/sagas.js +0 -198
  71. package/v2Containers/MobilePushNew/selectors.js +0 -55
  72. package/v2Containers/MobilePushNew/tests/reducer.test.js +0 -741
  73. package/v2Containers/MobilePushNew/tests/sagas.test.js +0 -863
  74. package/v2Containers/MobilePushNew/tests/selectors.test.js +0 -425
  75. package/v2Containers/MobilePushNew/tests/utils.test.js +0 -322
  76. package/v2Containers/MobilePushNew/utils.js +0 -33
@@ -0,0 +1,405 @@
1
+ import {
2
+ HOST_HAPTIC,
3
+ HAPTIC_CATEGORY_OPTIONS,
4
+ CATEGORY_OPTIONS_MAP,
5
+ mediaTypeOptions,
6
+ } from '../constants';
7
+
8
+ // Mock API calls
9
+ jest.mock('../../../services/api', () => ({
10
+ createWhatsappTemplate: jest.fn(),
11
+ uploadFile: jest.fn(),
12
+ getAllTemplates: jest.fn(),
13
+ }));
14
+
15
+ describe('HAPTIC WhatsApp Vendor Integration', () => {
16
+ beforeEach(() => {
17
+ jest.clearAllMocks();
18
+ });
19
+
20
+ describe('Constants and Configuration', () => {
21
+ it('should import HOST_HAPTIC constant', () => {
22
+ expect(HOST_HAPTIC).toBe('hapticwhatsappbulk');
23
+ });
24
+
25
+ it('should have HAPTIC_CATEGORY_OPTIONS defined', () => {
26
+ expect(HAPTIC_CATEGORY_OPTIONS).toBeDefined();
27
+ expect(Array.isArray(HAPTIC_CATEGORY_OPTIONS)).toBe(true);
28
+ expect(HAPTIC_CATEGORY_OPTIONS.length).toBeGreaterThan(0);
29
+ });
30
+
31
+ it('should include HAPTIC vendor in CATEGORY_OPTIONS_MAP', () => {
32
+ expect(CATEGORY_OPTIONS_MAP[HOST_HAPTIC]).toBeDefined();
33
+ expect(CATEGORY_OPTIONS_MAP[HOST_HAPTIC]).toBe(HAPTIC_CATEGORY_OPTIONS);
34
+ });
35
+
36
+ it('should have correct HAPTIC category options', () => {
37
+ const hapticOptions = CATEGORY_OPTIONS_MAP[HOST_HAPTIC];
38
+ expect(hapticOptions).toContainEqual(
39
+ expect.objectContaining({
40
+ value: 'MARKETING',
41
+ })
42
+ );
43
+ expect(hapticOptions).toContainEqual(
44
+ expect.objectContaining({
45
+ value: 'UTILITY',
46
+ })
47
+ );
48
+ });
49
+ });
50
+
51
+ describe('Utility Functions', () => {
52
+ it('should create HAPTIC payload with correct field names', () => {
53
+ const createHapticPayload = (templateData, accountData) => {
54
+ const { selectedWhatsappAccount } = accountData || {};
55
+
56
+ if (!selectedWhatsappAccount) {
57
+ return templateData;
58
+ }
59
+
60
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
61
+ const { accessToken, promotionalMessagingSSID } = configs;
62
+
63
+ const payload = { ...templateData };
64
+
65
+ if (hostName === HOST_HAPTIC) {
66
+ // HAPTIC uses different field names
67
+ payload.wabaId = sourceAccountIdentifier;
68
+ payload.access_token = accessToken;
69
+ payload.PhoneId = promotionalMessagingSSID;
70
+ payload.hostName = hostName;
71
+ } else {
72
+ // Standard vendors
73
+ payload.accountId = sourceAccountIdentifier;
74
+ payload.accessToken = accessToken;
75
+ payload.phoneId = promotionalMessagingSSID;
76
+ payload.hostName = hostName;
77
+ }
78
+
79
+ // Add default status for new templates
80
+ payload.status = payload.status || 'unsubmitted';
81
+
82
+ return payload;
83
+ };
84
+
85
+ const mockHapticAccount = {
86
+ selectedWhatsappAccount: {
87
+ sourceAccountIdentifier: 'waba-123',
88
+ configs: {
89
+ accessToken: 'haptic-token',
90
+ promotionalMessagingSSID: 'phone-456',
91
+ },
92
+ hostName: HOST_HAPTIC,
93
+ },
94
+ };
95
+
96
+ const templateData = {
97
+ name: 'Test Template',
98
+ category: 'MARKETING',
99
+ content: 'Hello {{1}}',
100
+ language: 'en',
101
+ };
102
+
103
+ const payload = createHapticPayload(templateData, mockHapticAccount);
104
+
105
+ expect(payload).toEqual({
106
+ name: 'Test Template',
107
+ category: 'MARKETING',
108
+ content: 'Hello {{1}}',
109
+ language: 'en',
110
+ wabaId: 'waba-123',
111
+ access_token: 'haptic-token',
112
+ PhoneId: 'phone-456',
113
+ hostName: HOST_HAPTIC,
114
+ status: 'unsubmitted',
115
+ });
116
+ });
117
+
118
+ it('should create standard payload with correct field names', () => {
119
+ const createHapticPayload = (templateData, accountData) => {
120
+ const { selectedWhatsappAccount } = accountData || {};
121
+
122
+ if (!selectedWhatsappAccount) {
123
+ return templateData;
124
+ }
125
+
126
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
127
+ const { accessToken, promotionalMessagingSSID } = configs;
128
+
129
+ const payload = { ...templateData };
130
+
131
+ if (hostName === HOST_HAPTIC) {
132
+ // HAPTIC uses different field names
133
+ payload.wabaId = sourceAccountIdentifier;
134
+ payload.access_token = accessToken;
135
+ payload.PhoneId = promotionalMessagingSSID;
136
+ payload.hostName = hostName;
137
+ } else {
138
+ // Standard vendors
139
+ payload.accountId = sourceAccountIdentifier;
140
+ payload.accessToken = accessToken;
141
+ payload.phoneId = promotionalMessagingSSID;
142
+ payload.hostName = hostName;
143
+ }
144
+
145
+ // Add default status for new templates
146
+ payload.status = payload.status || 'unsubmitted';
147
+
148
+ return payload;
149
+ };
150
+
151
+ const mockStandardAccount = {
152
+ selectedWhatsappAccount: {
153
+ sourceAccountIdentifier: 'account-123',
154
+ configs: {
155
+ accessToken: 'standard-token',
156
+ promotionalMessagingSSID: 'phone-456',
157
+ },
158
+ hostName: 'gupshupwhatsappbulk',
159
+ },
160
+ };
161
+
162
+ const templateData = {
163
+ name: 'Test Template',
164
+ category: 'MARKETING',
165
+ content: 'Hello {{1}}',
166
+ language: 'en',
167
+ };
168
+
169
+ const payload = createHapticPayload(templateData, mockStandardAccount);
170
+
171
+ expect(payload).toEqual({
172
+ name: 'Test Template',
173
+ category: 'MARKETING',
174
+ content: 'Hello {{1}}',
175
+ language: 'en',
176
+ accountId: 'account-123',
177
+ accessToken: 'standard-token',
178
+ phoneId: 'phone-456',
179
+ hostName: 'gupshupwhatsappbulk',
180
+ status: 'unsubmitted',
181
+ });
182
+ });
183
+
184
+ it('should handle missing account data', () => {
185
+ const createHapticPayload = (templateData, accountData) => {
186
+ const { selectedWhatsappAccount } = accountData || {};
187
+
188
+ if (!selectedWhatsappAccount) {
189
+ return templateData;
190
+ }
191
+
192
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
193
+ const { accessToken, promotionalMessagingSSID } = configs;
194
+
195
+ const payload = { ...templateData };
196
+
197
+ if (hostName === HOST_HAPTIC) {
198
+ // HAPTIC uses different field names
199
+ payload.wabaId = sourceAccountIdentifier;
200
+ payload.access_token = accessToken;
201
+ payload.PhoneId = promotionalMessagingSSID;
202
+ payload.hostName = hostName;
203
+ } else {
204
+ // Standard vendors
205
+ payload.accountId = sourceAccountIdentifier;
206
+ payload.accessToken = accessToken;
207
+ payload.phoneId = promotionalMessagingSSID;
208
+ payload.hostName = hostName;
209
+ }
210
+
211
+ // Add default status for new templates
212
+ payload.status = payload.status || 'unsubmitted';
213
+
214
+ return payload;
215
+ };
216
+
217
+ const templateData = {
218
+ name: 'Test Template',
219
+ category: 'MARKETING',
220
+ content: 'Hello {{1}}',
221
+ };
222
+
223
+ const payload = createHapticPayload(templateData, null);
224
+
225
+ expect(payload).toEqual({
226
+ name: 'Test Template',
227
+ category: 'MARKETING',
228
+ content: 'Hello {{1}}',
229
+ });
230
+ });
231
+ });
232
+
233
+ describe('Edge Cases', () => {
234
+ it('should handle empty string values', () => {
235
+ const createHapticPayload = (templateData, accountData) => {
236
+ const { selectedWhatsappAccount } = accountData || {};
237
+
238
+ if (!selectedWhatsappAccount) {
239
+ return templateData;
240
+ }
241
+
242
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
243
+ const { accessToken, promotionalMessagingSSID } = configs;
244
+
245
+ const payload = { ...templateData };
246
+
247
+ if (hostName === HOST_HAPTIC) {
248
+ // HAPTIC uses different field names
249
+ payload.wabaId = sourceAccountIdentifier;
250
+ payload.access_token = accessToken;
251
+ payload.PhoneId = promotionalMessagingSSID;
252
+ payload.hostName = hostName;
253
+ } else {
254
+ // Standard vendors
255
+ payload.accountId = sourceAccountIdentifier;
256
+ payload.accessToken = accessToken;
257
+ payload.phoneId = promotionalMessagingSSID;
258
+ payload.hostName = hostName;
259
+ }
260
+
261
+ // Add default status for new templates
262
+ payload.status = payload.status || 'unsubmitted';
263
+
264
+ return payload;
265
+ };
266
+
267
+ const accountDataWithEmptyStrings = {
268
+ selectedWhatsappAccount: {
269
+ sourceAccountIdentifier: '',
270
+ configs: {
271
+ accessToken: '',
272
+ promotionalMessagingSSID: '',
273
+ },
274
+ hostName: HOST_HAPTIC,
275
+ },
276
+ };
277
+
278
+ const templateData = {
279
+ name: 'Test Template',
280
+ category: 'MARKETING',
281
+ content: 'Hello {{1}}',
282
+ };
283
+
284
+ const payload = createHapticPayload(templateData, accountDataWithEmptyStrings);
285
+
286
+ expect(payload.wabaId).toBe('');
287
+ expect(payload.access_token).toBe('');
288
+ expect(payload.PhoneId).toBe('');
289
+ });
290
+
291
+ it('should handle null values', () => {
292
+ const createHapticPayload = (templateData, accountData) => {
293
+ const { selectedWhatsappAccount } = accountData || {};
294
+
295
+ if (!selectedWhatsappAccount) {
296
+ return templateData;
297
+ }
298
+
299
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
300
+ const { accessToken, promotionalMessagingSSID } = configs;
301
+
302
+ const payload = { ...templateData };
303
+
304
+ if (hostName === HOST_HAPTIC) {
305
+ // HAPTIC uses different field names
306
+ payload.wabaId = sourceAccountIdentifier;
307
+ payload.access_token = accessToken;
308
+ payload.PhoneId = promotionalMessagingSSID;
309
+ payload.hostName = hostName;
310
+ } else {
311
+ // Standard vendors
312
+ payload.accountId = sourceAccountIdentifier;
313
+ payload.accessToken = accessToken;
314
+ payload.phoneId = promotionalMessagingSSID;
315
+ payload.hostName = hostName;
316
+ }
317
+
318
+ // Add default status for new templates
319
+ payload.status = payload.status || 'unsubmitted';
320
+
321
+ return payload;
322
+ };
323
+
324
+ const accountDataWithNulls = {
325
+ selectedWhatsappAccount: {
326
+ sourceAccountIdentifier: null,
327
+ configs: {
328
+ accessToken: null,
329
+ promotionalMessagingSSID: null,
330
+ },
331
+ hostName: HOST_HAPTIC,
332
+ },
333
+ };
334
+
335
+ const templateData = {
336
+ name: 'Test Template',
337
+ category: 'MARKETING',
338
+ content: 'Hello {{1}}',
339
+ };
340
+
341
+ const payload = createHapticPayload(templateData, accountDataWithNulls);
342
+
343
+ expect(payload.wabaId).toBeNull();
344
+ expect(payload.access_token).toBeNull();
345
+ expect(payload.PhoneId).toBeNull();
346
+ });
347
+
348
+ it('should handle undefined values', () => {
349
+ const createHapticPayload = (templateData, accountData) => {
350
+ const { selectedWhatsappAccount } = accountData || {};
351
+
352
+ if (!selectedWhatsappAccount) {
353
+ return templateData;
354
+ }
355
+
356
+ const { sourceAccountIdentifier, configs = {}, hostName } = selectedWhatsappAccount;
357
+ const { accessToken, promotionalMessagingSSID } = configs;
358
+
359
+ const payload = { ...templateData };
360
+
361
+ if (hostName === HOST_HAPTIC) {
362
+ // HAPTIC uses different field names
363
+ payload.wabaId = sourceAccountIdentifier;
364
+ payload.access_token = accessToken;
365
+ payload.PhoneId = promotionalMessagingSSID;
366
+ payload.hostName = hostName;
367
+ } else {
368
+ // Standard vendors
369
+ payload.accountId = sourceAccountIdentifier;
370
+ payload.accessToken = accessToken;
371
+ payload.phoneId = promotionalMessagingSSID;
372
+ payload.hostName = hostName;
373
+ }
374
+
375
+ // Add default status for new templates
376
+ payload.status = payload.status || 'unsubmitted';
377
+
378
+ return payload;
379
+ };
380
+
381
+ const accountDataWithUndefined = {
382
+ selectedWhatsappAccount: {
383
+ sourceAccountIdentifier: undefined,
384
+ configs: {
385
+ accessToken: undefined,
386
+ promotionalMessagingSSID: undefined,
387
+ },
388
+ hostName: HOST_HAPTIC,
389
+ },
390
+ };
391
+
392
+ const templateData = {
393
+ name: 'Test Template',
394
+ category: 'MARKETING',
395
+ content: 'Hello {{1}}',
396
+ };
397
+
398
+ const payload = createHapticPayload(templateData, accountDataWithUndefined);
399
+
400
+ expect(payload.wabaId).toBeUndefined();
401
+ expect(payload.access_token).toBeUndefined();
402
+ expect(payload.PhoneId).toBeUndefined();
403
+ });
404
+ });
405
+ });