@capillarytech/creatives-library 8.0.127-alpha.1 → 8.0.128

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 (67) hide show
  1. package/containers/App/constants.js +0 -1
  2. package/package.json +1 -1
  3. package/services/api.js +1 -1
  4. package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +3 -8
  5. package/tests/integration/TemplateCreation/api-response.js +0 -5
  6. package/tests/integration/TemplateCreation/msw-handler.js +63 -42
  7. package/utils/common.js +0 -7
  8. package/utils/commonUtils.js +6 -2
  9. package/v2Components/CapImageUpload/index.js +46 -59
  10. package/v2Components/CapInAppCTA/index.js +0 -1
  11. package/v2Components/CapTagList/index.js +120 -177
  12. package/v2Components/CapVideoUpload/constants.js +0 -3
  13. package/v2Components/CapVideoUpload/index.js +110 -167
  14. package/v2Components/CapVideoUpload/messages.js +0 -16
  15. package/v2Components/Carousel/index.js +13 -15
  16. package/v2Components/ErrorInfoNote/style.scss +0 -1
  17. package/v2Components/MobilePushPreviewV2/index.js +5 -37
  18. package/v2Components/TemplatePreview/_templatePreview.scss +72 -114
  19. package/v2Components/TemplatePreview/index.js +50 -178
  20. package/v2Components/TemplatePreview/messages.js +0 -4
  21. package/v2Containers/CreativesContainer/SlideBoxContent.js +9 -9
  22. package/v2Containers/CreativesContainer/index.js +136 -191
  23. package/v2Containers/InApp/constants.js +0 -1
  24. package/v2Containers/InApp/index.js +13 -13
  25. package/v2Containers/MobilePush/Create/index.js +0 -1
  26. package/v2Containers/MobilePush/commonMethods.js +14 -7
  27. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +5 -5
  28. package/v2Containers/TagList/index.js +10 -56
  29. package/v2Containers/Templates/_templates.scss +1 -101
  30. package/v2Containers/Templates/index.js +35 -147
  31. package/v2Containers/Templates/messages.js +0 -8
  32. package/v2Containers/Templates/sagas.js +0 -2
  33. package/v2Containers/Whatsapp/constants.js +0 -1
  34. package/utils/createPayload.js +0 -272
  35. package/utils/tests/createPayload.test.js +0 -761
  36. package/v2Components/CapMpushCTA/constants.js +0 -25
  37. package/v2Components/CapMpushCTA/index.js +0 -332
  38. package/v2Components/CapMpushCTA/index.scss +0 -95
  39. package/v2Components/CapMpushCTA/messages.js +0 -89
  40. package/v2Components/TemplatePreview/assets/images/Android _ With date and time.svg +0 -29
  41. package/v2Components/TemplatePreview/assets/images/android.svg +0 -9
  42. package/v2Components/TemplatePreview/assets/images/iOS _ With date and time.svg +0 -26
  43. package/v2Components/TemplatePreview/assets/images/ios.svg +0 -9
  44. package/v2Containers/MobilePushNew/actions.js +0 -116
  45. package/v2Containers/MobilePushNew/components/CtaButtons.js +0 -170
  46. package/v2Containers/MobilePushNew/components/MediaUploaders.js +0 -754
  47. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +0 -279
  48. package/v2Containers/MobilePushNew/components/index.js +0 -5
  49. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +0 -779
  50. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +0 -2114
  51. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +0 -343
  52. package/v2Containers/MobilePushNew/constants.js +0 -115
  53. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +0 -1299
  54. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +0 -1223
  55. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +0 -246
  56. package/v2Containers/MobilePushNew/hooks/useUpload.js +0 -726
  57. package/v2Containers/MobilePushNew/index.js +0 -2280
  58. package/v2Containers/MobilePushNew/index.scss +0 -308
  59. package/v2Containers/MobilePushNew/messages.js +0 -226
  60. package/v2Containers/MobilePushNew/reducer.js +0 -160
  61. package/v2Containers/MobilePushNew/sagas.js +0 -198
  62. package/v2Containers/MobilePushNew/selectors.js +0 -55
  63. package/v2Containers/MobilePushNew/tests/reducer.test.js +0 -741
  64. package/v2Containers/MobilePushNew/tests/sagas.test.js +0 -863
  65. package/v2Containers/MobilePushNew/tests/selectors.test.js +0 -425
  66. package/v2Containers/MobilePushNew/tests/utils.test.js +0 -322
  67. package/v2Containers/MobilePushNew/utils.js +0 -33
@@ -58,19 +58,14 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
58
58
  dynamicDateValue: '',
59
59
  showModal: false,
60
60
  translationLang: '',
61
- tagsList: [],
62
- selectedContext: 'Outbound',
63
- isLoadingLoyaltyTags: false,
64
- isLoadingContextChange: false,
61
+ tagsList: []
65
62
  };
66
63
  this.renderTags = this.renderTags.bind(this);
67
64
  this.getSearchedExpandedKeys = this.getSearchedExpandedKeys.bind(this);
68
65
  }
69
-
70
66
  getTranslationMappedLocale(locale) {
71
67
  return GET_TRANSLATION_MAPPED?.[locale];
72
68
  }
73
-
74
69
  componentDidMount() {
75
70
  const user = localStorage.getItem('user');
76
71
  let locale = 'en';
@@ -84,36 +79,17 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
84
79
  });
85
80
  }
86
81
 
87
- componentDidUpdate(prevProps, prevState) {
82
+ componentDidUpdate(prevProps, prevState){
88
83
  if (this.props.tags !== prevProps.tags || this.state.searchValue !== prevState.searchValue) {
89
- const temp = this.renderTags(this.props.tags, this.state.searchValue);
90
- this.setState({
91
- tagsList: temp,
92
- });
93
- }
94
-
95
- // Reset loading states when tags are received after context change
96
- if ((this.state.isLoadingLoyaltyTags || this.state.isLoadingContextChange)
97
- && this.props.tags !== prevProps.tags) {
84
+ let temp = this.renderTags(this.props.tags, this.state.searchValue);
98
85
  this.setState({
99
- isLoadingLoyaltyTags: false,
100
- isLoadingContextChange: false,
101
- });
102
- }
103
-
104
- // Backup: Reset loading states if props.loading changed from true to false
105
- // This handles cases where the API doesn't return different tags but injectedTags change
106
- if (prevProps.loading === true && this.props.loading === false
107
- && (this.state.isLoadingLoyaltyTags || this.state.isLoadingContextChange)) {
108
- this.setState({
109
- isLoadingLoyaltyTags: false,
110
- isLoadingContextChange: false,
86
+ tagsList: temp
111
87
  });
112
88
  }
113
89
  }
114
90
 
115
91
  onChange = (e) => {
116
- const {value} = e.target;
92
+ const value = e.target.value;
117
93
  let expandedKeys = this.getSearchedExpandedKeys(this.props.tags, value);
118
94
  if (value === '') {
119
95
  expandedKeys = [];
@@ -124,7 +100,6 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
124
100
  autoExpandParent: true,
125
101
  });
126
102
  };
127
-
128
103
  onExpand = (expandedKeys, info) => {
129
104
  this.handleOnExpand(info.node.props.eventKey);
130
105
  };
@@ -132,25 +107,26 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
132
107
  getSearchedExpandedKeys(tags, value = '') {
133
108
  let list = [];
134
109
  _.forEach(tags, (val = {}, key) => {
135
- const tagName = typeof val?.name === STRING
136
- ? _.toLower(_.get(val, "name", ""))
137
- : _.toLower(_.get(val, "name.props.defaultMessage", ""));
110
+ const tagName =
111
+ typeof val?.name === STRING
112
+ ? _.toLower(_.get(val, "name", ""))
113
+ : _.toLower(_.get(val, "name.props.defaultMessage", ""));
138
114
  const tagNameWithoutUnderscore = tagName.replace(/_/g, " ");
139
115
  const searchStringLower = _.toLower(value);
140
116
  if (_.has(val, "subtags")) {
141
117
  if (
142
- val?.name
143
- && (tagName.includes(searchStringLower)
144
- || tagNameWithoutUnderscore.includes(searchStringLower))
118
+ val?.name &&
119
+ (tagName.includes(searchStringLower) ||
120
+ tagNameWithoutUnderscore.includes(searchStringLower))
145
121
  ) {
146
122
  list.push(key);
147
123
  }
148
124
  const temp = this.getSearchedExpandedKeys(val?.subtags, value);
149
125
  list = list.concat(temp);
150
126
  } else if (
151
- val?.name
152
- && (tagName.includes(searchStringLower)
153
- || tagNameWithoutUnderscore.includes(searchStringLower))
127
+ val?.name &&
128
+ (tagName.includes(searchStringLower) ||
129
+ tagNameWithoutUnderscore.includes(searchStringLower))
154
130
  ) {
155
131
  list.push(key);
156
132
  }
@@ -159,21 +135,7 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
159
135
  }
160
136
 
161
137
  handleOnChange = (data) => {
162
- const { selectedContext } = this.state;
163
-
164
- // Only proceed if the context has actually changed
165
- if (selectedContext !== data) {
166
- // Set loading state for any context change
167
- this.setState({
168
- isLoadingContextChange: true,
169
- selectedContext: data,
170
- // Keep loyalty-specific loading for backward compatibility
171
- isLoadingLoyaltyTags: data === 'Loyalty',
172
- });
173
-
174
- // Call the parent's context change handler
175
- this.props.onContextChange(data);
176
- }
138
+ this.props.onContextChange(data);
177
139
  };
178
140
 
179
141
  handleDynamicDateChange = (data) => {
@@ -230,7 +192,6 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
230
192
  }
231
193
  this.setState({expandedKeys, autoExpandParent: false});
232
194
  };
233
-
234
195
  togglePopoverVisibility = (visible) => {
235
196
  this.setState({visible});
236
197
  };
@@ -239,11 +200,9 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
239
200
  this.setState({showModal: true, visible: false});
240
201
  };
241
202
 
242
- renderTags = (tags) => {
203
+ renderTags(tags) {
243
204
  const searchString = this.state.searchValue || '';
244
- const {
245
- disableRelatedTags, childTagsToDisable, parentTagstoDisable,
246
- } = this?.props?.disableTagsDetails;
205
+ const { disableRelatedTags, childTagsToDisable, parentTagstoDisable, showCardsRelatedTags } = this?.props?.disableTagsDetails;
247
206
  const { accessibleFeatures = [] } = this?.props?.currentOrgDetails || {};
248
207
  const hideDateTagsForJpLocale = accessibleFeatures.includes(JP_LOCALE_HIDE_FEATURE);
249
208
  const list = [];
@@ -267,14 +226,16 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
267
226
  supportedTagsString += `${supportedTag} ,`;
268
227
  });
269
228
  supportedTagsString = supportedTagsString.replace(/,\s*$/, "");
270
- const tagName = typeof val?.name === STRING
271
- ? _.toLower(_.get(val, "name", ""))
272
- : _.toLower(_.get(val, "name.props.defaultMessage", ""));
229
+ const tagName =
230
+ typeof val?.name === STRING
231
+ ? _.toLower(_.get(val, "name", ""))
232
+ : _.toLower(_.get(val, "name.props.defaultMessage", ""));
273
233
  const tagNameWithoutUnderscore = tagName.replace(/_/g, " ");
274
234
  const searchStringLower = _.toLower(searchString);
275
- const tagContainsSearchedString = searchStringLower
276
- && (tagName.includes(searchStringLower)
277
- || tagNameWithoutUnderscore.includes(searchStringLower));
235
+ const tagContainsSearchedString =
236
+ searchStringLower &&
237
+ (tagName.includes(searchStringLower) ||
238
+ tagNameWithoutUnderscore.includes(searchStringLower));
278
239
  if (_.has(val, 'subtags')) {
279
240
  const disabled = disableRelatedTags ? parentTagstoDisable.includes(key) : false;
280
241
  const temp = this.renderTags(val?.subtags);
@@ -325,8 +286,7 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
325
286
  : `${key}`
326
287
  }
327
288
  disabled={childDisabled}
328
- >
329
- </CapTreeNode>
289
+ ></CapTreeNode>
330
290
  );
331
291
  hidingDateTagsForJpLocale(
332
292
  hideDateTagsForJpLocale,
@@ -361,8 +321,7 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
361
321
  : `${key}`
362
322
  }
363
323
  disabled={childDisabled}
364
- >
365
- </CapTreeNode>
324
+ ></CapTreeNode>
366
325
  );
367
326
  hidingDateTagsForJpLocale(
368
327
  hideDateTagsForJpLocale,
@@ -375,23 +334,14 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
375
334
  });
376
335
  return list;
377
336
  }
378
-
379
337
  openTranslationLink = () => {
380
338
  window.open(TAG_TRANSLATION_DOC, '_blank');
381
339
  }
382
-
383
340
  render() {
384
- const {
385
- hidePopover = false, intl = {}, moduleFilterEnabled, label, modalProps, channel, fetchingSchemaError = false,
386
- } = this.props;
341
+ const { hidePopover = false, tags = {}, intl = {}, moduleFilterEnabled, label, modalProps, channel, fetchingSchemaError = false } = this.props;
342
+ const tg = tags;
387
343
  const {formatMessage} = intl;
388
- const {
389
- tagValue, expandedKeys, autoExpandParent, visible, translationLang, selectedContext, isLoadingLoyaltyTags, isLoadingContextChange,
390
- } = this.state;
391
-
392
- // Show loading spinner if general loading OR if specifically loading loyalty tags OR if context change is in progress
393
- const shouldShowLoading = this.props.loading || (selectedContext === 'Loyalty' && isLoadingLoyaltyTags) || isLoadingContextChange;
394
-
344
+ const { tagValue, expandedKeys, autoExpandParent, searchValue, visible, translationLang } = this.state;
395
345
  const options = [
396
346
  {
397
347
  value: "Outbound",
@@ -404,106 +354,99 @@ class CapTagList extends React.Component { // eslint-disable-line react/prefer-s
404
354
  key: 'loyalty',
405
355
  },
406
356
  ];
407
- const contentSection = (
408
- <div>
409
- <CapSpin tip={formatMessage(messages.gettingTags)} spinning={shouldShowLoading}>
410
- <Search
411
- style={{ marginBottom: 8, width: '250px'}}
412
- placeholder={formatMessage(messages.search)}
413
- onChange={this.onChange} />
414
- {moduleFilterEnabled ? (
415
- <CapSelect
416
- getPopupContainer={(triggerNode) => triggerNode.parentNode}
417
- style={{
418
- width: '250px', marginBottom: '16px', minWidth: 'initial', display: 'inherit',
419
- }}
420
- onChange={this.handleOnChange}
421
- value={selectedContext}
422
- options={options}>
423
- </CapSelect>
424
- ) : ''}
425
- <CapTree
426
- styling={{height: '350px', overflow: 'auto'}}
427
- onSelect={this.handleOnSelect}
428
- selectedKeys={tagValue}
429
- expandedKeys={expandedKeys}
430
- autoExpandParent={autoExpandParent}
431
- onExpand={this.onExpand}
432
- >
433
- {/* {this.renderTags(tg, searchValue)} */}
434
- {this.state.tagsList}
435
- </CapTree>
436
- {translationLang === "ja-JP" && (
437
- <div className="tag-list-footer">
438
- <CapIcon
439
- type="help"
440
- size="s"
441
- />
442
- <CapLink>
443
- <CapButton id="translationtagfooter" type="flat" onClick={this.openTranslationLink}>
444
- <div className="tag-list-footer-icon">
445
- <div>{JAPANESE_HELP_TEXT}</div>
446
- <CapIcon
447
- type="open-in-new-light"
448
- size="s"
449
- svgProps={{ color: FONT_COLOR_05 }}
450
- />
451
- </div>
452
- </CapButton>
453
- </CapLink>
454
- </div>
455
- )}
357
+ const contentSection = (<div>
358
+ <CapSpin tip={formatMessage(messages.gettingTags)} spinning={this.props.loading}>
359
+ <Search
360
+ style={{ marginBottom: 8, width: '250px'}}
361
+ placeholder={formatMessage(messages.search)}
362
+ onChange={this.onChange} />
363
+ {moduleFilterEnabled ?
364
+ <CapSelect
365
+ getPopupContainer={(triggerNode) => triggerNode.parentNode}
366
+ style={{width: '250px', marginBottom: '16px', minWidth: 'initial', display: 'inherit'}}
367
+ onChange={this.props.onContextChange}
368
+ defaultValue={'Outbound'}
369
+ options={options}>
370
+ </CapSelect> : ''}
371
+ <CapTree
372
+ styling={{height: '350px', overflow: 'auto'}}
373
+ onSelect={this.handleOnSelect}
374
+ selectedKeys={tagValue}
375
+ expandedKeys={expandedKeys}
376
+ autoExpandParent={autoExpandParent}
377
+ onExpand={this.onExpand}
378
+ >
379
+ {/* {this.renderTags(tg, searchValue)} */}
380
+ {this.state.tagsList}
381
+ </CapTree>
382
+ {translationLang === "ja-JP" &&
383
+ <div className="tag-list-footer">
384
+ <CapIcon
385
+ type="help"
386
+ size="s"
387
+ />
388
+ <CapLink>
389
+ <CapButton id="translationtagfooter" type="flat" onClick={this.openTranslationLink} >
390
+ <div className="tag-list-footer-icon">
391
+ <div>{JAPANESE_HELP_TEXT}</div>
392
+ <CapIcon
393
+ type="open-in-new-light"
394
+ size="s"
395
+ svgProps={{ color: FONT_COLOR_05 }}
396
+ />
397
+ </div>
398
+ </CapButton>
399
+ </CapLink>
400
+ </div>
401
+ }
456
402
 
457
- </CapSpin>
458
- </div>
459
- );
403
+ </CapSpin>
404
+ </div>);
460
405
  return (
461
406
  <>
462
- {hidePopover ? (
463
- <CapModal
464
- visible={this.props.visibleTaglist}
465
- footer={[]}
466
- {...modalProps}
467
- >
468
- {contentSection}
469
- </CapModal>
470
- ) : (
471
- <CapPopover
472
- visible={fetchingSchemaError ? false : visible}
473
- onVisibleChange={this.togglePopoverVisibility}
474
- content={contentSection}
475
- trigger="click"
476
- placement={channel === EMAIL.toUpperCase() ? "leftTop" : "rightTop"}
407
+ {hidePopover ? <CapModal
408
+ visible={this.props.visibleTaglist}
409
+ footer={[]}
410
+ {...modalProps}
411
+ >
412
+ {contentSection}
413
+ </CapModal> :
414
+ <CapPopover
415
+ visible={fetchingSchemaError ? false : visible}
416
+ onVisibleChange={this.togglePopoverVisibility}
417
+ content={contentSection}
418
+ trigger="click"
419
+ placement={channel === EMAIL.toUpperCase() ? "leftTop" : "rightTop"}
420
+ >
421
+ <CapTooltip
422
+ title={
423
+ fetchingSchemaError && (
424
+ <CapRow className="tooltip-text-container">
425
+ <CapLabel className="tooltip-text1">
426
+ {formatMessage(messages.somethingWentWrong)}
427
+ </CapLabel>
428
+ <CapLabel className="tooltip-text2">
429
+ {formatMessage(messages.labelFetchErrorMsg)}
430
+ </CapLabel>
431
+ </CapRow>
432
+ )
433
+ }
434
+ placement="right"
477
435
  >
478
- <CapTooltip
479
- title={
480
- fetchingSchemaError && (
481
- <CapRow className="tooltip-text-container">
482
- <CapLabel className="tooltip-text1">
483
- {formatMessage(messages.somethingWentWrong)}
484
- </CapLabel>
485
- <CapLabel className="tooltip-text2">
486
- {formatMessage(messages.labelFetchErrorMsg)}
487
- </CapLabel>
488
- </CapRow>
489
- )
490
- }
491
- placement="right"
492
- >
493
- <CapRow className="tooltip-add-label-container">
494
- <CapButton
495
- disabled={
496
- this?.props?.disabled || fetchingSchemaError
497
- }
498
- isAddBtn
499
- type="flat"
500
- >
501
- {label || ""}
502
- </CapButton>
503
- </CapRow>
504
- </CapTooltip>
505
- </CapPopover>
506
- )}
436
+ <CapRow className="tooltip-add-label-container">
437
+ <CapButton
438
+ disabled={
439
+ this?.props?.disabled || fetchingSchemaError
440
+ }
441
+ isAddBtn
442
+ type="flat"
443
+ >
444
+ {label || ""}
445
+ </CapButton>
446
+ </CapRow>
447
+ </CapTooltip>
448
+ </CapPopover>
449
+ }
507
450
  <CapModal
508
451
  visible={this.state.showModal}
509
452
  title={this.props.intl.formatMessage(messages["Dynamic Days before Expiry"])}
@@ -1,10 +1,7 @@
1
1
  export const WHATSAPP = 'WHATSAPP';
2
2
  export const DEFAULT = 'DEFAULT';
3
- export const MOBILEPUSH = 'MOBILEPUSH';
4
3
  export const SUPPORTED_FILE_FORMATS = {
5
4
  VIBER: '3GP, MP4, MOV, M4V',
6
5
  DEFAULT: 'MP4',
7
- MOBILEPUSH: '3GP, MP4, MOV, M4V',
8
6
  };
9
7
  export const VIBER_MAX_DURATION = 600; // seconds
10
- export const MAX_DURATION = 600; // seconds for all channels