@capillarytech/creatives-library 9.0.15-alpha.1 → 9.0.16

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 (132) hide show
  1. package/constants/unified.js +0 -29
  2. package/global-styles.js +1 -1
  3. package/package.json +1 -1
  4. package/services/tests/api.test.js +20 -35
  5. package/utils/commonUtils.js +1 -19
  6. package/v2Components/CapActionButton/constants.js +0 -7
  7. package/v2Components/CapActionButton/index.js +109 -168
  8. package/v2Components/CapActionButton/index.scss +5 -156
  9. package/v2Components/CapActionButton/messages.js +3 -19
  10. package/v2Components/CapActionButton/tests/index.test.js +18 -42
  11. package/v2Components/CapImageUpload/index.js +2 -2
  12. package/v2Components/CapTagList/index.js +0 -10
  13. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +48 -70
  14. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  15. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -214
  16. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  17. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +9 -83
  18. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  19. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -60
  20. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  21. package/v2Components/CommonTestAndPreview/UnifiedPreview/RcsPreviewContent.js +23 -201
  22. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +76 -355
  23. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +8 -155
  24. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  25. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  26. package/v2Components/CommonTestAndPreview/index.js +222 -761
  27. package/v2Components/CommonTestAndPreview/messages.js +3 -45
  28. package/v2Components/CommonTestAndPreview/sagas.js +6 -25
  29. package/v2Components/CommonTestAndPreview/tests/CommonTestAndPreview.addTestCustomer.test.js +0 -1
  30. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +267 -284
  31. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  32. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  33. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  34. package/v2Components/CommonTestAndPreview/tests/PreviewSection.test.js +1 -8
  35. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  36. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/RcsPreviewContent.test.js +283 -281
  37. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  38. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -133
  39. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +24 -31
  40. package/v2Components/TemplatePreview/_templatePreview.scss +22 -41
  41. package/v2Components/TemplatePreview/index.js +31 -143
  42. package/v2Components/TemplatePreview/tests/index.test.js +0 -142
  43. package/v2Components/TestAndPreviewSlidebox/CustomValuesEditor.js +6 -6
  44. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  45. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  46. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  47. package/v2Containers/CommunicationFlow/Tests/CommunicationFlow.test.js +1 -4
  48. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/DeliverySettingsSection.test.js +0 -4
  49. package/v2Containers/CommunicationFlow/steps/DeliverySettingsStep/Tests/SenderDetails.test.js +20 -20
  50. package/v2Containers/CreativesContainer/SlideBoxContent.js +7 -36
  51. package/v2Containers/CreativesContainer/SlideBoxFooter.js +5 -14
  52. package/v2Containers/CreativesContainer/SlideBoxHeader.js +5 -36
  53. package/v2Containers/CreativesContainer/constants.js +0 -11
  54. package/v2Containers/CreativesContainer/index.js +104 -323
  55. package/v2Containers/CreativesContainer/index.scss +1 -83
  56. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -79
  57. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  58. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  59. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +90 -333
  60. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +15 -20
  61. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  62. package/v2Containers/Email/index.js +5 -2
  63. package/v2Containers/MobilePush/Create/test/saga.test.js +2 -2
  64. package/v2Containers/Rcs/constants.js +11 -131
  65. package/v2Containers/Rcs/index.js +810 -2605
  66. package/v2Containers/Rcs/index.scss +8 -289
  67. package/v2Containers/Rcs/messages.js +3 -34
  68. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +38537 -73535
  69. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +8 -0
  70. package/v2Containers/Rcs/tests/index.test.js +36 -147
  71. package/v2Containers/Rcs/tests/mockData.js +0 -38
  72. package/v2Containers/Rcs/tests/utils.test.js +30 -646
  73. package/v2Containers/Rcs/utils.js +11 -478
  74. package/v2Containers/Sms/Create/index.js +48 -115
  75. package/v2Containers/SmsTrai/Create/index.js +4 -9
  76. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  77. package/v2Containers/SmsTrai/Edit/index.js +169 -678
  78. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  79. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2854 -5455
  80. package/v2Containers/SmsWrapper/index.js +8 -37
  81. package/v2Containers/TagList/index.js +0 -6
  82. package/v2Containers/Templates/_templates.scss +12 -171
  83. package/v2Containers/Templates/actions.js +0 -11
  84. package/v2Containers/Templates/constants.js +0 -2
  85. package/v2Containers/Templates/index.js +55 -125
  86. package/v2Containers/Templates/sagas.js +13 -57
  87. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1015 -1060
  88. package/v2Containers/Templates/tests/sagas.test.js +16 -199
  89. package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
  90. package/v2Containers/TemplatesV2/index.js +23 -86
  91. package/v2Containers/WeChat/MapTemplates/test/saga.test.js +9 -9
  92. package/v2Containers/Whatsapp/index.js +20 -3
  93. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  94. package/utils/rcsPayloadUtils.js +0 -92
  95. package/utils/templateVarUtils.js +0 -201
  96. package/utils/tests/rcsPayloadUtils.test.js +0 -226
  97. package/utils/tests/templateVarUtils.test.js +0 -204
  98. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  99. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  100. package/v2Components/CommonTestAndPreview/utils.js +0 -84
  101. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -91
  102. package/v2Components/SmsFallback/constants.js +0 -94
  103. package/v2Components/SmsFallback/index.js +0 -958
  104. package/v2Components/SmsFallback/index.scss +0 -266
  105. package/v2Components/SmsFallback/messages.js +0 -78
  106. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -120
  107. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  108. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  109. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  110. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -208
  111. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -309
  112. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  113. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  114. package/v2Components/TemplatePreview/constants.js +0 -2
  115. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  116. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  117. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  118. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -17
  119. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -79
  120. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  121. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  122. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  123. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -227
  124. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  125. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  126. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  127. package/v2Containers/SmsTrai/Edit/index.scss +0 -126
  128. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  129. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  130. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  131. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  132. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
@@ -126,7 +126,7 @@ import { INAPP_LAYOUT_DETAILS, INAPP_MESSAGE_LAYOUT_TYPES } from '../InApp/const
126
126
  import { ZALO_STATUS_OPTIONS, ZALO_STATUSES } from '../Zalo/constants';
127
127
  import { getWhatsappContent, getWhatsappStatus, getWhatsappCategory, getWhatsappCta, getWhatsappQuickReply, getWhatsappAutoFill, getWhatsappCarouselButtonView, getWhatsappDocPreview } from '../Whatsapp/utils';
128
128
  import { getRCSContent } from '../Rcs/utils';
129
- import { RCS_STATUSES, HOST_INFOBIP } from '../Rcs/constants';
129
+ import {RCS_STATUSES} from '../Rcs/constants';
130
130
  import zaloMessages from '../Zalo/messages';
131
131
  import rcsMessages from '../Rcs/messages';
132
132
  import inAppMessages from '../InApp/messages';
@@ -432,13 +432,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
432
432
  channel = '';
433
433
  }
434
434
  this.setState({ channel, activeMode });
435
- // Always reset archive mode and selection when mounting a new channel.
436
- // Skip for local-template instances (e.g. SmsFallback selector) — SET_ARCHIVED_MODE clears
437
- // Templates.templates in the reducer, which would wipe the background RCS template list.
438
- const useLocalTemplatesOnMount = get(this.props, 'localTemplatesConfig.useLocalTemplates', false);
439
- if (!useLocalTemplatesOnMount) {
440
- this.props.actions.setArchivedMode(false);
441
- }
435
+ // Always reset archive mode and selection when mounting a new channel
436
+ this.props.actions.setArchivedMode(false);
442
437
  this.props.actions.clearTemplateSelection();
443
438
  // Clear templates when entering account selection mode to prevent showing old channel templates
444
439
  if (activeMode === ACCOUNT_SELECTION_MODE) {
@@ -471,13 +466,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
471
466
  if (this.props.location.query.type === 'embedded') {
472
467
  this.props.actions.resetAccount();
473
468
  }
474
- // When using local templates (e.g. SMS fallback selector), do not fetch from API or we overwrite global store and break background RCS list
475
- const useLocalTemplates = get(
476
- this.props,
477
- 'localTemplatesConfig.useLocalTemplates',
478
- get(this.props, 'useLocalTemplates', false),
479
- );
480
- if (!useLocalTemplates && [LINE_LOWERCASE, VIBER_CHANNEL, FACEBOOK_CHANNEL, SMS_LOWERCASE, EMAIL_LOWERCASE, EBILL_LOWERCASE].includes((this.state.channel || '').toLowerCase())) {
469
+ if (['line', VIBER_CHANNEL, FACEBOOK_CHANNEL, 'sms', 'email', 'ebill'].includes((this.state.channel || '').toLowerCase())) {
481
470
  const queryParams = {
482
471
  // name: this.state.searchText,
483
472
  // sortBy: this.state.sortBy,
@@ -560,7 +549,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
560
549
  selectedTemplateForPreview: null,
561
550
  testAndPreviewContent: null,
562
551
  }, () => {
563
- if ([LINE_LOWERCASE, VIBER_CHANNEL, FACEBOOK_CHANNEL, SMS_LOWERCASE, EMAIL_LOWERCASE, EBILL_LOWERCASE, RCS_LOWERCASE].includes(this.state.channel.toLowerCase()) || (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(nextProps.Templates.selectedWeChatAccount))) {
552
+ if (['line', VIBER_CHANNEL, FACEBOOK_CHANNEL, 'sms', 'email', 'ebill', RCS_LOWERCASE].includes(this.state.channel.toLowerCase()) || (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(nextProps.Templates.selectedWeChatAccount))) {
564
553
  if (this.state.channel.toLowerCase() === 'wechat' && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
565
554
  params.wecrmId = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_app_id;
566
555
  params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
@@ -1023,16 +1012,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1023
1012
 
1024
1013
  componentWillUnmount() {
1025
1014
  window.removeEventListener("message", this.handleFrameTasks);
1026
- // When using local templates (e.g. SMS fallback selector), do not clear global store or background RCS list is wiped
1027
- const useLocalTemplates = get(
1028
- this.props,
1029
- 'localTemplatesConfig.useLocalTemplates',
1030
- get(this.props, 'useLocalTemplates', false),
1031
- );
1032
- if (!useLocalTemplates) {
1033
- this.props.actions.resetTemplateStoreData();
1034
- this.props.globalActions.clearMetaEntities();
1035
- }
1015
+ this.props.actions.resetTemplateStoreData();
1016
+ this.props.globalActions.clearMetaEntities();
1036
1017
  // Clear any pending timeouts to prevent memory leaks
1037
1018
  if (this._clearEditTimeout) {
1038
1019
  clearTimeout(this._clearEditTimeout);
@@ -1889,20 +1870,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1889
1870
  }
1890
1871
 
1891
1872
  filterRcsTemplates = (templates) => {
1892
- const selectedRcsAccountName = this.props?.Templates?.selectedRcsAccount?.name || '';
1893
- const hostName = this.state?.hostName;
1894
- let nextTemplates = templates || [];
1895
- if (selectedRcsAccountName) {
1896
- nextTemplates = nextTemplates.filter(
1897
- (t) => get(t, 'versions.base.content.RCS.rcsContent.accountName', '') === selectedRcsAccountName
1898
- );
1873
+ let { selectedRcsStatus } = this.state;
1874
+ selectedRcsStatus = !this.props.isFullMode ? RCS_STATUSES.approved : '';
1875
+ if (selectedRcsStatus) {
1876
+ return templates?.filter((template) => template?.versions?.base?.content?.RCS?.rcsContent?.cardContent?.[0]?.Status === selectedRcsStatus);
1899
1877
  }
1900
- if (!this.props.isFullMode && hostName !== HOST_INFOBIP) {
1901
- return nextTemplates.filter(
1902
- (t) => get(t, 'versions.base.content.RCS.rcsContent.cardContent[0].Status', 'unavailable') === RCS_STATUSES.approved
1903
- );
1904
- }
1905
- return nextTemplates;
1878
+ return templates;
1906
1879
  }
1907
1880
 
1908
1881
  filterZaloTemplates = (templates) => {
@@ -2092,7 +2065,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2092
2065
  style={{ marginRight: "16px" }}
2093
2066
  type="eye"
2094
2067
  onClick={() => {
2095
- if (!this.props.isFullMode || this.props.isDltFromRcs || this.props.isSmsFallbackFromRcs) {
2068
+ if (!this.props.isFullMode || this.props.isDltFromRcs) {
2096
2069
  if (!get(template, "versions.base.content.zalo.previewUrl", "")) {
2097
2070
  this.setState({ zaloPreviewItemId: template?._id });
2098
2071
  }
@@ -2575,14 +2548,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2575
2548
  <CapRow type='flex' align="middle" justify="start" gap={12}>
2576
2549
  {isCardArchiveEligible && this.renderCardSelectionCheckbox({ templateId: template._id, selectedIds: selectedIdsArrayForCard, isDisabled: isAnyArchiveInProgress })}
2577
2550
  <CapLabel className="whatsapp-rcs-template-name">{name}</CapLabel>
2578
- {this.state.hostName !== HOST_INFOBIP && <CapColumn type="flex" align="middle" className="rcs-status-container zalo-status-color">
2551
+ <CapColumn type="flex" align="middle" className="rcs-status-container zalo-status-color">
2579
2552
  <CapStatus
2580
2553
  type={statusDisplay}
2581
- text={statusDisplay && this.props.intl.formatMessage(rcsMessages?.[`${statusDisplay}_STATUS`])}
2582
- labelType="label3"
2583
- />
2584
- </CapColumn>
2585
- }
2554
+ text={statusDisplay && this.props.intl.formatMessage(rcsMessages?.[`${statusDisplay}_STATUS`])}
2555
+ labelType="label3"
2556
+ />
2557
+ </CapColumn>
2586
2558
  </CapRow>
2587
2559
  );
2588
2560
 
@@ -3159,7 +3131,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
3159
3131
  let routeParams = {};
3160
3132
  const {fbAdManager} = this.props;
3161
3133
  const isLibraryMode = this.isEnabledInLibraryModule("callCreateFromProps");
3162
-
3163
3134
  if (!isLibraryMode) {
3164
3135
  timeTracker.startTimer(CHANNEL_CREATE_TRACK_MAPPING[channel]);
3165
3136
  }
@@ -3509,13 +3480,6 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
3509
3480
  this.setState({modeType});
3510
3481
  }
3511
3482
  const { _id: id } = template;
3512
- const {
3513
- localTemplatesConfig,
3514
- fbAdManager,
3515
- isDltFromRcs,
3516
- isSmsFallbackFromRcs,
3517
- onSelectTemplate,
3518
- } = this.props;
3519
3483
  const type = this.props.location.query.type;
3520
3484
  const module = this.props.location.query.module;
3521
3485
  const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : false;
@@ -3601,12 +3565,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
3601
3565
  }
3602
3566
  if (this.isEnabledInLibraryModule("callSelectFromProps")) {
3603
3567
  let data = id;
3604
- if (localTemplatesConfig?.useLocalTemplates) {
3605
- data = template;
3606
- } else if (fbAdManager || isDltFromRcs || isSmsFallbackFromRcs) {
3568
+ if (this.props.fbAdManager || this.props.isDltFromRcs) {
3607
3569
  data = this.selectTemplate(id);
3608
3570
  }
3609
- onSelectTemplate(data, fbAdManager);
3571
+ this.props.onSelectTemplate(data, this.props.fbAdManager);
3610
3572
  } else {
3611
3573
  timeTracker.startTimer(CHANNEL_EDIT_TRACK_MAPPING[this.state.channel.toLowerCase()]);
3612
3574
  if (this.state.channel.toLowerCase() === 'ebill') {
@@ -4584,11 +4546,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4584
4546
  const isWechatEmbedded = !this.props.isFullMode && channel.toUpperCase() === WECHAT;
4585
4547
  const channelLowerCase = (channel || '').toLowerCase();
4586
4548
  const isTraiDltFeature = this.checkDLTfeatureEnable();
4549
+
4587
4550
  const createButton =
4588
- (
4589
- [WHATSAPP_LOWERCASE, RCS_LOWERCASE].includes(channelLowerCase)
4590
- && !this.props.isFullMode
4591
- )
4551
+ ( (channelLowerCase === WHATSAPP_LOWERCASE || channelLowerCase === RCS_LOWERCASE) && !this.props.isFullMode )
4592
4552
  ? (
4593
4553
  <CapLink
4594
4554
  onClick={this.openCreativesFullMode}
@@ -4620,22 +4580,17 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4620
4580
  const _renderSelectedIdsArray = _renderSelectedIds && typeof _renderSelectedIds.toJS === 'function' ? _renderSelectedIds.toJS() : (Array.isArray(_renderSelectedIds) ? _renderSelectedIds : []);
4621
4581
  const _renderHasSelection = _isArchivalEnabled && this.props.isFullMode && _renderSelectedIdsArray.length > 0;
4622
4582
 
4623
- const useLocalTemplates = this.props.localTemplatesConfig?.useLocalTemplates;
4624
- const builtFilterContent = ((isfilterContentVisisble || [WECHAT, MOBILE_PUSH, INAPP].includes(this.state.channel.toUpperCase())) && (
4625
- <div className="action-container">
4626
- <div className="action-container__toolbar-row">
4627
- {isfilterContentVisisble ? (
4628
- <CapInput.Search
4629
- className="search-text"
4630
- placeholder={this.props.intl.formatMessage(messages.searchText)}
4631
- value={this.state.searchText}
4632
- onChange={(e) => this.searchTemplate(e.target.value, this.state.channel)}
4633
- onSearch={() => this.searchTemplate(this.state.searchText, this.state.channel)}
4634
- onClear={() => this.searchTemplate('', this.state.channel)}
4635
- onScroll={(e) => e.stopPropagation()}
4636
- disabled={this.checkSearchDisabled()}
4637
- />
4638
- ) : null}
4583
+ const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH, INAPP].includes(this.state.channel.toUpperCase())) && <div className="action-container">
4584
+ {isfilterContentVisisble && <CapInput.Search
4585
+ className="search-text"
4586
+ style={{width: '210px'}}
4587
+ placeholder={_isArchivedMode ? this.props.intl.formatMessage(messages.searchArchivedTemplates) : this.props.intl.formatMessage(messages.searchText)}
4588
+ value={this.state.searchText}
4589
+ onChange={(e) => this.searchTemplate(e.target.value, this.state.channel)}
4590
+ disabled={this.checkSearchDisabled()}
4591
+ onClear={() => this.searchTemplate('', this.state.channel)}
4592
+ onScroll={(e) => e.stopPropagation()}
4593
+ />}
4639
4594
  {
4640
4595
  channel.toUpperCase() === WECHAT && <CapRadio.CapRadioGroup className="wechat-filters" defaultValue={wechatFilter} onChange={this.setWechatFilter}>
4641
4596
  <CapRadio.Button value={WECHAT_FILTERS.ALL}><CapLabel type="label2">
@@ -4782,6 +4737,16 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4782
4737
  )
4783
4738
  }
4784
4739
  <div className="template-listing-header-actions">
4740
+ {!_isArchivedMode && !_renderHasSelection && (
4741
+ this.state?.channel?.toLowerCase() === WHATSAPP_LOWERCASE && (isWhatsappCountExeeded) ? (
4742
+ <CapTooltip title={whatsappCountExceedText}>
4743
+ <div className="button-disabled-tooltip-wrapper">
4744
+ {createButton}
4745
+ </div>
4746
+ </CapTooltip>
4747
+ )
4748
+ : isfilterContentVisisble && !isWechatEmbedded && !this.props.isDltFromRcs && createButton
4749
+ )}
4785
4750
  {/* More (⋯) menu: full mode only, not archived mode, not Zalo (no archive support), not when selection active, archive flag enabled */}
4786
4751
  {commonUtil.hasCreativesArchivalEnabled() && !_isArchivedMode && !_renderHasSelection && this.props.isFullMode && this.props.location.query.type !== EMBEDDED && channelLowerCase !== ZALO_LOWERCASE && (
4787
4752
  <CapDropdown
@@ -4804,28 +4769,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4804
4769
  </CapDropdown>
4805
4770
  )}
4806
4771
  </div>
4807
- </div>
4808
- <div>
4809
- <div className="action-container__create-row">
4810
- {
4811
- isfilterContentVisisble && !isWechatEmbedded && !this.props.isDltFromRcs && !this.props.isSmsFallbackFromRcs && (
4812
- this.state?.channel?.toLowerCase() === WHATSAPP_LOWERCASE && isWhatsappCountExeeded ? (
4813
- <CapTooltip title={whatsappCountExceedText}>
4814
- <div className="button-disabled-tooltip-wrapper">
4815
- {createButton}
4816
- </div>
4817
- </CapTooltip>
4818
- ) : createButton
4819
- )
4820
- }
4821
- </div>
4822
- </div>
4823
- </div>
4824
- ));
4825
- const localTemplatesFilterContent = get(this.props, 'localTemplatesConfig.localTemplatesFilterContent', null);
4826
- const filterContent = (useLocalTemplates && localTemplatesFilterContent) != null
4827
- ? localTemplatesFilterContent
4828
- : builtFilterContent;
4772
+ </div>);
4829
4773
  let htmlPreviewContent = "";
4830
4774
  if (this.state.channel.toLowerCase() === 'ebill') {
4831
4775
  htmlPreviewContent = this.state.previewTemplate && this.state.previewTemplate.versions && this.state.previewTemplate.versions.base && this.state.previewTemplate.versions.base['ebill-editor'];
@@ -4835,10 +4779,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4835
4779
 
4836
4780
 
4837
4781
  const creativesParams = this.getCreativesParams();
4838
- const templates = useLocalTemplates
4839
- ? (this.props.localTemplatesConfig?.localTemplates || [])
4840
- : (this.props.TemplatesList || []);
4841
- const isLoadingWhenLocal = useLocalTemplates && !!this.props.localTemplatesConfig?.localTemplatesLoading;
4782
+ const templates = this.props.TemplatesList || [];
4842
4783
  const {route} = this.props;
4843
4784
  const loadingTipMap = {
4844
4785
  sendingFile: 'uploadingFile',
@@ -4853,11 +4794,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4853
4794
  (deleteRcsTemplateInProgress && 'deletingTemplate') ||
4854
4795
  (this.props.EmailCreate.duplicateTemplateInProgress && 'duplicatingTemplate');
4855
4796
 
4856
- const loadingTip = useLocalTemplates && this.props.localTemplatesConfig?.localTemplatesLoadingTip
4857
- ? this.props.localTemplatesConfig.localTemplatesLoadingTip
4858
- : (messages[loadingTipIntl] ? this.props.intl.formatMessage(messages[loadingTipIntl]) : this.props.intl.formatMessage(messages.gettingAllTemplates));
4797
+ const loadingTip = messages[loadingTipIntl] ? this.props.intl.formatMessage(messages[loadingTipIntl]) : this.props.intl.formatMessage(messages.gettingAllTemplates);
4859
4798
  const showNoTemplatesFoundZalo = this.state.channel.toUpperCase() === ZALO && isEmpty(this.state.searchedZaloTemplates) && this.state.searchingZaloTemplate;
4860
- const showNoTemplatesFoundOther = ![ZALO].includes(this.state.channel.toUpperCase()) && isEmpty(templates) && (useLocalTemplates ? !isLoadingWhenLocal : !this.props.Templates.getAllTemplatesInProgress) && (useLocalTemplates || !isEmpty(this.state.searchText));
4799
+ const showNoTemplatesFoundOther = ![ZALO].includes(this.state.channel.toUpperCase()) && isEmpty(this.props.TemplatesList) && !this.props.Templates.getAllTemplatesInProgress && !isEmpty(this.state.searchText);
4861
4800
  const showNoTemplatesFound = showNoTemplatesFoundZalo || showNoTemplatesFoundOther;
4862
4801
 
4863
4802
  return (
@@ -4901,7 +4840,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4901
4840
  />
4902
4841
  ) : null}
4903
4842
 
4904
- {channel.toLowerCase() === RCS_LOWERCASE && !isFullMode && this.state?.hostName !== HOST_INFOBIP ? (
4843
+ {channel.toLowerCase() === RCS_LOWERCASE && !isFullMode ? (
4905
4844
  <CapInfoNote
4906
4845
  message={formatMessage(messages.rcsOnlyApprovedTemplates)}
4907
4846
  />
@@ -4914,22 +4853,22 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
4914
4853
  ) : null}
4915
4854
  <CapRow useLegacy>
4916
4855
  <Pagination
4917
- templateInProgress={useLocalTemplates ? isLoadingWhenLocal : this.props.Templates.getAllTemplatesInProgress}
4856
+ templateInProgress={
4857
+ this.props.Templates.getAllTemplatesInProgress
4858
+ }
4918
4859
  onPageChange={
4919
- templates.length
4920
- ? (useLocalTemplates ? (this.props.localTemplatesConfig?.localTemplatesOnPageChange || (() => {})) : this.onPaginationChange)
4921
- : () => {}
4860
+ templates.length ? this.onPaginationChange : () => {}
4922
4861
  }
4923
4862
  >
4924
4863
  {this.getTemplateDataForGrid({
4925
4864
  previewTemplateId: this.state.zaloPreviewItemId,
4926
- isLoading: useLocalTemplates ? isLoadingWhenLocal : isLoading,
4927
- isInitialLoading: useLocalTemplates ? isLoadingWhenLocal && templates.length === 0 : isInitialLoading,
4865
+ isLoading,
4866
+ isInitialLoading,
4928
4867
  loadingTip,
4929
4868
  channel: this.state.channel,
4930
4869
  templates: this.state.searchingZaloTemplate
4931
4870
  ? this.state.searchedZaloTemplates
4932
- : templates,
4871
+ : this.props.TemplatesList,
4933
4872
  filterContent,
4934
4873
  handlers: {
4935
4874
  handlePreviewClick: this.handlePreviewClick,
@@ -5113,15 +5052,6 @@ Templates.propTypes = {
5113
5052
  WebPush: PropTypes.object,
5114
5053
  smsRegister: PropTypes.any,
5115
5054
  isDltFromRcs: PropTypes.bool,
5116
- isSmsFallbackFromRcs: PropTypes.bool,
5117
- localTemplatesConfig: PropTypes.shape({
5118
- useLocalTemplates: PropTypes.bool,
5119
- localTemplates: PropTypes.arrayOf(PropTypes.object),
5120
- localTemplatesLoading: PropTypes.bool,
5121
- localTemplatesLoadingTip: PropTypes.string,
5122
- localTemplatesFilterContent: PropTypes.node,
5123
- localTemplatesOnPageChange: PropTypes.func,
5124
- }),
5125
5055
  };
5126
5056
 
5127
5057
  const mapStateToProps = createStructuredSelector({
@@ -1,5 +1,5 @@
1
1
  import {
2
- call, put, takeLatest, takeEvery, all,
2
+ call, put, takeLatest, all,
3
3
  } from 'redux-saga/effects';
4
4
  import get from 'lodash/get';
5
5
  import { CapNotification } from '@capillarytech/cap-ui-library';
@@ -7,70 +7,33 @@ import { CapNotification } from '@capillarytech/cap-ui-library';
7
7
  import * as Api from '../../services/api';
8
8
  import * as types from './constants';
9
9
  import { saveCdnConfigs, removeAllCdnLocalStorageItems, initCdnConfigFromEnv } from '../../utils/cdnTransformation';
10
- import { COPY_OF, SMS as SMS_CHANNEL } from '../../constants/unified';
11
- import { fetchSmsTemplatesFromQuery } from './utils/smsTemplatesListApi';
10
+ import { COPY_OF } from '../../constants/unified';
12
11
  import { ZALO_TEMPLATE_INFO_REQUEST } from '../Zalo/constants';
13
12
  import { getTemplateInfoById } from '../Zalo/saga';
14
13
 
15
- export function* getLocalSmsTemplates(action) {
14
+ // Individual exports for testing
15
+ export function* getAllTemplates(channel, queryParams) {
16
16
  try {
17
- const fetched = yield call(
18
- fetchSmsTemplatesFromQuery,
19
- action.queryParams,
20
- action.intlCopyOf,
21
- );
22
- if (typeof action.onSuccess === 'function') {
23
- yield call(action.onSuccess, fetched);
24
- }
25
- } catch (error) {
26
- if (typeof action.onFailure === 'function') {
27
- yield call(action.onFailure, error);
28
- }
29
- }
30
- }
31
-
32
- export function* getAllTemplates(action) {
33
- try {
34
- if (action.channel && String(action.channel).toLowerCase() === SMS_CHANNEL) {
35
- const fetched = yield call(
36
- fetchSmsTemplatesFromQuery,
37
- action.queryParams,
38
- action.intlCopyOf,
39
- );
40
- yield put({
41
- type: types.GET_ALL_TEMPLATES_SUCCESS,
42
- data: fetched.channelTemplates,
43
- weCRMTemplate: fetched.weCRMTemplate,
44
- isReset: get(action, 'queryParams.page') === 1,
45
- });
46
- return;
47
- }
48
-
49
- const result = yield call(Api.getAllTemplates, action);
50
- const channelTemplates = (action.channel === 'wechat')
51
- ? { templates: [...result.response.mapped, ...result.response.richmedia] }
52
- : result.response;
53
- if (action.channel === 'wechat' && action.queryParams && action.queryParams.sortBy && action.queryParams.sortBy.toLocaleLowerCase() === ("Most Recent").toLocaleLowerCase()) {
17
+ const result = yield call(Api.getAllTemplates, channel, queryParams);
18
+ const channelTemplates = (channel.channel === 'wechat') ? { templates: [...result.response.mapped, ...result.response.richmedia] } : result.response;
19
+ // const sidebar = result.response.sidebar;
20
+ if (channel.channel === 'wechat' && channel.queryParams && channel.queryParams.sortBy && channel.queryParams.sortBy.toLocaleLowerCase() === ("Most Recent").toLocaleLowerCase()) {
54
21
  channelTemplates.templates.sort((a, b) => {
55
22
  const dateA = new Date(a.updatedAt);
56
23
  const dateB = new Date(b.updatedAt);
57
24
  return dateB - dateA;
58
25
  });
59
- } else if (action.channel === 'wechat' && action.queryParams && action.queryParams.sortBy && action.queryParams.sortBy.toLocaleLowerCase() === ("Alphabetically").toLocaleLowerCase()) {
26
+ } else if (channel.channel === 'wechat' && channel.queryParams && channel.queryParams.sortBy && channel.queryParams.sortBy.toLocaleLowerCase() === ("Alphabetically").toLocaleLowerCase()) {
60
27
  channelTemplates.templates.sort((a, b) => b.name - a.name);
61
28
  }
62
- if (action.intlCopyOf && channelTemplates?.templates) {
29
+ // Update the "name" property in each template
30
+ if (channel.intlCopyOf && channelTemplates?.templates) {
63
31
  channelTemplates.templates = channelTemplates.templates.map((template) => ({
64
32
  ...template,
65
- name: template.name.replace(new RegExp(COPY_OF, 'g'), action.intlCopyOf),
33
+ name: template.name.replace(new RegExp(COPY_OF, 'g'), channel.intlCopyOf),
66
34
  }));
67
35
  }
68
- yield put({
69
- type: types.GET_ALL_TEMPLATES_SUCCESS,
70
- data: channelTemplates,
71
- weCRMTemplate: result.response.unMapped,
72
- isReset: get(action, 'queryParams.page') === 1,
73
- });
36
+ yield put({ type: types.GET_ALL_TEMPLATES_SUCCESS, data: channelTemplates, weCRMTemplate: result.response.unMapped, isReset: channel.queryParams.page === 1 });
74
37
  } catch (error) {
75
38
  yield put({ type: types.GET_ALL_TEMPLATES_FAILURE, error });
76
39
  }
@@ -307,11 +270,6 @@ export function* watchGetAllTemplates() {
307
270
  yield takeLatest(types.GET_ALL_TEMPLATES_REQUEST, getAllTemplates);
308
271
  }
309
272
 
310
-
311
- export function* watchGetLocalSmsTemplates() {
312
- yield takeEvery(types.GET_LOCAL_SMS_TEMPLATES_REQUEST, getLocalSmsTemplates);
313
- }
314
-
315
273
  export function* watchDeleteTemplate() {
316
274
  yield takeLatest(types.DELETE_TEMPLATE_REQUEST, deleteTemplate);
317
275
  }
@@ -365,7 +323,6 @@ export function* watchForGetTemplateInfoById() {
365
323
  // All sagas to be loaded
366
324
  export default [
367
325
  watchGetAllTemplates,
368
- watchGetLocalSmsTemplates,
369
326
  watchDeleteTemplate,
370
327
  watchDeleteRcsTemplate,
371
328
  watchGetUserList,
@@ -382,7 +339,6 @@ export default [
382
339
  export function* v2TemplateSaga() {
383
340
  yield all([
384
341
  watchGetAllTemplates(),
385
- watchGetLocalSmsTemplates(),
386
342
  watchDeleteTemplate(),
387
343
  watchDeleteRcsTemplate(),
388
344
  watchGetUserList(),