@capillarytech/creatives-library 8.0.130 → 8.0.131

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 (77) hide show
  1. package/containers/App/constants.js +1 -0
  2. package/containers/Login/index.js +1 -2
  3. package/package.json +1 -1
  4. package/services/api.js +5 -0
  5. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +8 -3
  6. package/tests/integration/TemplateCreation/api-response.js +5 -0
  7. package/tests/integration/TemplateCreation/msw-handler.js +42 -63
  8. package/utils/common.js +7 -0
  9. package/utils/commonUtils.js +2 -6
  10. package/utils/createMobilePushPayload.js +322 -0
  11. package/utils/tests/createMobilePushPayload.test.js +1054 -0
  12. package/v2Components/CapDeviceContent/index.js +1 -1
  13. package/v2Components/CapImageUpload/index.js +57 -44
  14. package/v2Components/CapInAppCTA/index.js +1 -0
  15. package/v2Components/CapMpushCTA/constants.js +25 -0
  16. package/v2Components/CapMpushCTA/index.js +403 -0
  17. package/v2Components/CapMpushCTA/index.scss +95 -0
  18. package/v2Components/CapMpushCTA/messages.js +101 -0
  19. package/v2Components/CapTagList/index.js +178 -121
  20. package/v2Components/CapVideoUpload/constants.js +3 -0
  21. package/v2Components/CapVideoUpload/index.js +182 -115
  22. package/v2Components/CapVideoUpload/messages.js +16 -0
  23. package/v2Components/Carousel/index.js +15 -13
  24. package/v2Components/ErrorInfoNote/style.scss +1 -0
  25. package/v2Components/MobilePushPreviewV2/index.js +57 -12
  26. package/v2Components/TemplatePreview/_templatePreview.scss +218 -74
  27. package/v2Components/TemplatePreview/assets/images/Android_With_date_and_time.svg +29 -0
  28. package/v2Components/TemplatePreview/assets/images/android.svg +9 -0
  29. package/v2Components/TemplatePreview/assets/images/iOS_With_date_and_time.svg +26 -0
  30. package/v2Components/TemplatePreview/assets/images/ios.svg +9 -0
  31. package/v2Components/TemplatePreview/index.js +234 -107
  32. package/v2Components/TemplatePreview/messages.js +4 -0
  33. package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +10 -10
  34. package/v2Containers/CreativesContainer/SlideBoxContent.js +127 -62
  35. package/v2Containers/CreativesContainer/index.js +193 -136
  36. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -22
  37. package/v2Containers/InApp/constants.js +1 -0
  38. package/v2Containers/InApp/index.js +13 -13
  39. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +4748 -4658
  40. package/v2Containers/Login/index.js +1 -2
  41. package/v2Containers/MobilePush/Create/index.js +1 -0
  42. package/v2Containers/MobilePush/commonMethods.js +7 -14
  43. package/v2Containers/MobilePush/tests/commonMethods.test.js +401 -0
  44. package/v2Containers/MobilePushNew/actions.js +116 -0
  45. package/v2Containers/MobilePushNew/components/CtaButtons.js +183 -0
  46. package/v2Containers/MobilePushNew/components/MediaUploaders.js +835 -0
  47. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +346 -0
  48. package/v2Containers/MobilePushNew/components/index.js +5 -0
  49. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +565 -0
  50. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +3180 -0
  51. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +654 -0
  52. package/v2Containers/MobilePushNew/constants.js +116 -0
  53. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +1462 -0
  54. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +1459 -0
  55. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +366 -0
  56. package/v2Containers/MobilePushNew/hooks/useUpload.js +740 -0
  57. package/v2Containers/MobilePushNew/index.js +2158 -0
  58. package/v2Containers/MobilePushNew/index.scss +308 -0
  59. package/v2Containers/MobilePushNew/messages.js +272 -0
  60. package/v2Containers/MobilePushNew/reducer.js +160 -0
  61. package/v2Containers/MobilePushNew/sagas.js +193 -0
  62. package/v2Containers/MobilePushNew/selectors.js +55 -0
  63. package/v2Containers/MobilePushNew/tests/reducer.test.js +741 -0
  64. package/v2Containers/MobilePushNew/tests/sagas.test.js +864 -0
  65. package/v2Containers/MobilePushNew/tests/selectors.test.js +665 -0
  66. package/v2Containers/MobilePushNew/tests/utils.test.js +421 -0
  67. package/v2Containers/MobilePushNew/utils.js +84 -0
  68. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1176 -976
  69. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +684 -424
  70. package/v2Containers/TagList/index.js +56 -10
  71. package/v2Containers/Templates/_templates.scss +100 -1
  72. package/v2Containers/Templates/index.js +170 -31
  73. package/v2Containers/Templates/messages.js +8 -0
  74. package/v2Containers/Templates/sagas.js +1 -0
  75. package/v2Containers/Whatsapp/constants.js +1 -0
  76. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +3992 -3677
  77. package/assets/loading_img.gif +0 -0
@@ -0,0 +1,346 @@
1
+ import React, { useCallback } from "react";
2
+ import PropTypes from "prop-types";
3
+ import { FormattedMessage } from "react-intl";
4
+ import CapRow from "@capillarytech/cap-ui-library/CapRow";
5
+ import CapInput from "@capillarytech/cap-ui-library/CapInput";
6
+ import CapColumn from "@capillarytech/cap-ui-library/CapColumn";
7
+ import CapHeading from "@capillarytech/cap-ui-library/CapHeading";
8
+ import CapError from "@capillarytech/cap-ui-library/CapError";
9
+ import CapDivider from "@capillarytech/cap-ui-library/CapDivider";
10
+ import CapSelect from "@capillarytech/cap-ui-library/CapSelect";
11
+ import CapCheckbox from "@capillarytech/cap-ui-library/CapCheckbox";
12
+ import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
13
+ import CapInfoNote from "@capillarytech/cap-ui-library/CapInfoNote";
14
+ import TagList from "../../TagList";
15
+ import {
16
+ ANDROID,
17
+ IOS,
18
+ MEDIA_TYPES_OPTIONS,
19
+ LINK_TYPE_OPTIONS,
20
+ DEEP_LINK,
21
+ EXTERNAL_LINK,
22
+ CAROUSEL,
23
+ } from "../constants";
24
+ import messages from "../messages";
25
+ import MediaUploaders from "./MediaUploaders";
26
+ import CtaButtons from "./CtaButtons";
27
+
28
+ const PlatformContentFields = ({
29
+ deviceType,
30
+ content,
31
+ errors,
32
+ handlers,
33
+ tagListProps,
34
+ mediaUploaderProps,
35
+ ctaButtonProps,
36
+ linkProps,
37
+ sameContent,
38
+ formatMessage,
39
+ }) => {
40
+ const { title: titleError, message: messageError } = errors;
41
+ const {
42
+ handleTitleChange,
43
+ handleMessageChange,
44
+ handleMediaTypeChange,
45
+ handleActionOnClickChange,
46
+ handleLinkTypeChange,
47
+ handleDeepLinkChange,
48
+ handleDeepLinkKeysChange,
49
+ handleExternalLinkChange,
50
+ onTagSelect,
51
+ handleOnTagsContextChange,
52
+ } = handlers;
53
+
54
+ const {
55
+ deepLink,
56
+ deepLinkValue,
57
+ deepLinkKeysValue,
58
+ externalLinkValue,
59
+ } = linkProps;
60
+
61
+ // Debug logging removed - issue identified and fixed
62
+
63
+ // Get the selected deep link object to extract keys
64
+ const selectedDeepLink = deepLink?.find((link) => link?.value === deepLinkValue);
65
+ const deepLinkKeysFromSelection = selectedDeepLink?.keys;
66
+
67
+ // Handle deep link keys value - could be array or string
68
+ let deepLinkKeysArray = [];
69
+ if (Array.isArray(deepLinkKeysValue)) {
70
+ deepLinkKeysArray = deepLinkKeysValue;
71
+ } else if (deepLinkKeysValue) {
72
+ deepLinkKeysArray = [deepLinkKeysValue];
73
+ }
74
+
75
+ let deepLinkKeysFromSelectionArray = [];
76
+ if (Array.isArray(deepLinkKeysFromSelection)) {
77
+ deepLinkKeysFromSelectionArray = deepLinkKeysFromSelection;
78
+ } else if (deepLinkKeysFromSelection) {
79
+ deepLinkKeysFromSelectionArray = [deepLinkKeysFromSelection];
80
+ }
81
+
82
+ const onTitleChange = useCallback(
83
+ ({ target: { value } }) => {
84
+ handleTitleChange(deviceType, value);
85
+ },
86
+ [handleTitleChange, deviceType]
87
+ );
88
+
89
+ const onMessageChange = useCallback(
90
+ ({ target: { value } }) => {
91
+ handleMessageChange(deviceType, value);
92
+ },
93
+ [handleMessageChange, deviceType]
94
+ );
95
+
96
+ const onMediaTypeChange = useCallback(
97
+ (value) => {
98
+ handleMediaTypeChange(deviceType, value);
99
+ },
100
+ [handleMediaTypeChange, deviceType]
101
+ );
102
+
103
+ const onActionOnClickChange = useCallback(
104
+ (e) => handleActionOnClickChange(deviceType, e.target.checked),
105
+ [handleActionOnClickChange, deviceType]
106
+ );
107
+
108
+ const onLinkTypeChange = useCallback(
109
+ (value) => handleLinkTypeChange(deviceType, value),
110
+ [handleLinkTypeChange, deviceType]
111
+ );
112
+
113
+ const onDeepLinkChange = useCallback((value) => handleDeepLinkChange(value), [
114
+ handleDeepLinkChange,
115
+ ]);
116
+
117
+ const onDeepLinkKeysChange = useCallback(
118
+ ({ target: { value } }) => {
119
+ // Parse comma-separated values into array
120
+ const keysArray = value?.split(',')?.map((key) => key?.trim())?.filter((key) => key?.length > 0);
121
+ handleDeepLinkKeysChange(keysArray);
122
+ },
123
+ [handleDeepLinkKeysChange]
124
+ );
125
+
126
+ const onExternalLinkChange = useCallback(
127
+ (e) => handleExternalLinkChange(e.target.value),
128
+ [handleExternalLinkChange]
129
+ );
130
+
131
+ const getTagList = useCallback(
132
+ (index) => (
133
+ <TagList
134
+ {...tagListProps}
135
+ onTagSelect={(value) => onTagSelect(value, index)}
136
+ onContextChange={handleOnTagsContextChange}
137
+ />
138
+ ),
139
+ [tagListProps, onTagSelect, handleOnTagsContextChange]
140
+ );
141
+
142
+ return (
143
+ <>
144
+ {sameContent && (
145
+ <CapInfoNote message={formatMessage(messages.sameContentNote)} />
146
+ )}
147
+ <CapRow className="content-fields">
148
+ <CapRow className="creatives-mpush-title">
149
+ <CapColumn className="mpush-title-main">
150
+ <CapHeading type="h4" className="mpush-title">
151
+ <FormattedMessage {...messages.title} />
152
+ </CapHeading>
153
+ {getTagList(0)}
154
+ </CapColumn>
155
+ <CapInput
156
+ id={`mobile-push-title-name-input-${deviceType}`}
157
+ onChange={onTitleChange}
158
+ placeholder={formatMessage(messages.titlePlaceholder)}
159
+ value={content.title}
160
+ size="default"
161
+ isRequired
162
+ errorMessage={
163
+ titleError && (
164
+ <CapError className="mobile-push-template-title-error">
165
+ {titleError}
166
+ </CapError>
167
+ )
168
+ }
169
+ />
170
+ </CapRow>
171
+
172
+ <CapRow className="creatives-mpush-message">
173
+ <CapColumn className="mpush-message-main">
174
+ <CapHeading type="h4" className="mpush-message">
175
+ <FormattedMessage {...messages.message} />
176
+ </CapHeading>
177
+ {getTagList(1)}
178
+ </CapColumn>
179
+ <CapInput
180
+ id={`mobile-push-message-name-input-${deviceType}`}
181
+ onChange={onMessageChange}
182
+ placeholder={formatMessage(messages.messagePlaceholder)}
183
+ value={content.message}
184
+ size="default"
185
+ isRequired
186
+ errorMessage={
187
+ messageError && (
188
+ <CapError className="mobile-push-template-message-error">
189
+ {messageError}
190
+ </CapError>
191
+ )
192
+ }
193
+ />
194
+ </CapRow>
195
+ <CapDivider />
196
+ <CapRow className="creatives-mpush-media">
197
+ <CapHeading type="h4" className="mpush-media-type">
198
+ <FormattedMessage {...messages.mediaType} />
199
+ </CapHeading>
200
+ <CapSelect.CapCustomSelect
201
+ width="100%"
202
+ className="margin-t-4"
203
+ options={MEDIA_TYPES_OPTIONS}
204
+ value={content.mediaType}
205
+ onChange={onMediaTypeChange}
206
+ />
207
+ <MediaUploaders
208
+ mediaType={content.mediaType}
209
+ {...mediaUploaderProps}
210
+ formatMessage={formatMessage}
211
+ />
212
+ </CapRow>
213
+ {content?.mediaType !== CAROUSEL && (
214
+ <>
215
+ <CapDivider />
216
+ <CapRow className="creatives-mpush-actions">
217
+ <CapRow className="mpush-actions-main">
218
+ <CapHeading type="h4" className="mpush-actions">
219
+ <FormattedMessage {...messages.buttonsAndLinks} />
220
+ </CapHeading>
221
+ <CapLabel className="optional-text">
222
+ <FormattedMessage {...messages.optionalText} />
223
+ </CapLabel>
224
+ </CapRow>
225
+ <CapCheckbox
226
+ checked={content.actionOnClick}
227
+ onChange={onActionOnClickChange}
228
+ className="action-on-click-checkbox"
229
+ >
230
+ <FormattedMessage {...messages.actionOnClickBody} />
231
+ </CapCheckbox>
232
+ <CapRow>
233
+ <CapLabel className="action-description">
234
+ <FormattedMessage {...messages.actionDescription} />
235
+ </CapLabel>
236
+ </CapRow>
237
+ {content.actionOnClick && (
238
+ <CapRow style={{ display: "flex", justifyContent: "space-around" }}>
239
+ <CapColumn span={6}>
240
+ <CapHeading type="h4" className="buttons-heading">
241
+ <FormattedMessage {...messages.linkType} />
242
+ </CapHeading>
243
+ <CapSelect.CapCustomSelect
244
+ options={LINK_TYPE_OPTIONS}
245
+ value={content.linkType}
246
+ onChange={onLinkTypeChange}
247
+ key="mobile-push-link-type"
248
+ selectPlaceholder={formatMessage(messages.selectDeepLink)}
249
+ />
250
+ </CapColumn>
251
+ {content.linkType === DEEP_LINK && (
252
+ <CapColumn span={14}>
253
+ <CapHeading type="h4" className="buttons-heading">
254
+ {formatMessage(messages.deepLink)}
255
+ </CapHeading>
256
+ <CapSelect.CapCustomSelect
257
+ options={deepLink || []}
258
+ value={deepLinkValue}
259
+ onChange={onDeepLinkChange}
260
+ key="mobile-push-deep-link-type"
261
+ placeholder={formatMessage(messages.selectDeepLink)}
262
+ style={{ marginTop: "10px" }}
263
+ />
264
+ </CapColumn>
265
+ )}
266
+ {content.linkType === EXTERNAL_LINK && (
267
+ <CapColumn span={14}>
268
+ <CapHeading type="h4" className="buttons-heading">
269
+ {formatMessage(messages.externalLink)}
270
+ </CapHeading>
271
+ <CapInput
272
+ id="mobile-push-external-link-input"
273
+ onChange={onExternalLinkChange}
274
+ placeholder={formatMessage(messages.enterExternalLink)}
275
+ value={externalLinkValue}
276
+ size="default"
277
+ isRequired
278
+ errorMessage={
279
+ errors.externalLink && (
280
+ <CapError className="mobile-push-external-link-error">
281
+ {errors.externalLink}
282
+ </CapError>
283
+ )
284
+ }
285
+ />
286
+ </CapColumn>
287
+ )}
288
+ </CapRow>
289
+ )}
290
+ {content?.actionOnClick && content?.linkType === DEEP_LINK && deepLinkValue && deepLinkKeysFromSelectionArray?.length > 0 && (
291
+ <CapRow style={{ marginTop: "10px", left: "6%", width: '115%'}}>
292
+ <CapColumn span={7}>
293
+ <CapHeading type="h4" className="deep-link-keys-heading">
294
+ {formatMessage(messages.deepLinkKeys)}
295
+ </CapHeading>
296
+ <CapLabel type="label2" className="deep-link-keys-value">
297
+ {(() => {
298
+ if (deepLinkKeysFromSelectionArray?.length > 0) {
299
+ return deepLinkKeysFromSelectionArray?.join(', ');
300
+ }
301
+ if (deepLinkKeysArray?.length > 0) {
302
+ return deepLinkKeysArray?.join(', ');
303
+ }
304
+ return '';
305
+ })()}
306
+ </CapLabel>
307
+ <CapInput
308
+ id="mobile-push-deep-link-keys-input"
309
+ onChange={onDeepLinkKeysChange}
310
+ placeholder={formatMessage(messages.deepLinkKeysPlaceholder, { key: deepLinkKeysFromSelectionArray?.join(', ')})}
311
+ value={Array.isArray(deepLinkKeysValue) ? deepLinkKeysValue?.join(', ') : (deepLinkKeysValue || "")}
312
+ size="default"
313
+ style={{ marginTop: "10px" }}
314
+ error={errors?.deepLinkKeys}
315
+ />
316
+ </CapColumn>
317
+ </CapRow>
318
+ )}
319
+ </CapRow>
320
+ <CtaButtons {...ctaButtonProps} />
321
+ </>
322
+ )}
323
+ </CapRow>
324
+ </>
325
+ );
326
+ };
327
+
328
+ PlatformContentFields.propTypes = {
329
+ deviceType: PropTypes.oneOf([ANDROID, IOS]).isRequired,
330
+ content: PropTypes.object.isRequired,
331
+ errors: PropTypes.shape({
332
+ title: PropTypes.string,
333
+ message: PropTypes.string,
334
+ externalLink: PropTypes.string,
335
+ deepLinkKeys: PropTypes.string,
336
+ }).isRequired,
337
+ handlers: PropTypes.object.isRequired,
338
+ tagListProps: PropTypes.object.isRequired,
339
+ mediaUploaderProps: PropTypes.object.isRequired,
340
+ ctaButtonProps: PropTypes.object.isRequired,
341
+ linkProps: PropTypes.object.isRequired,
342
+ sameContent: PropTypes.bool.isRequired,
343
+ formatMessage: PropTypes.func.isRequired,
344
+ };
345
+
346
+ export default PlatformContentFields;
@@ -0,0 +1,5 @@
1
+ import CtaButtons from './CtaButtons';
2
+ import MediaUploaders from './MediaUploaders';
3
+ import PlatformContentFields from './PlatformContentFields';
4
+
5
+ export { CtaButtons, MediaUploaders, PlatformContentFields };