@capillarytech/creatives-library 8.0.330-alpha.0 → 8.0.331-alpha.0

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 (111) hide show
  1. package/constants/unified.js +0 -18
  2. package/package.json +1 -1
  3. package/services/tests/api.test.js +0 -13
  4. package/utils/commonUtils.js +1 -19
  5. package/v2Components/CapTagList/index.js +0 -10
  6. package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +49 -70
  7. package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
  8. package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -207
  9. package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
  10. package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +10 -85
  11. package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
  12. package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -79
  13. package/v2Components/CommonTestAndPreview/ExistingCustomerModal.js +1 -0
  14. package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
  15. package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +1 -20
  16. package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +4 -133
  17. package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
  18. package/v2Components/CommonTestAndPreview/constants.js +2 -38
  19. package/v2Components/CommonTestAndPreview/index.js +176 -672
  20. package/v2Components/CommonTestAndPreview/messages.js +3 -41
  21. package/v2Components/CommonTestAndPreview/reducer.js +3 -1
  22. package/v2Components/CommonTestAndPreview/sagas.js +8 -16
  23. package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -308
  24. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
  25. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
  26. package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
  27. package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
  28. package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
  29. package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -132
  30. package/v2Components/CommonTestAndPreview/tests/sagas.test.js +2 -2
  31. package/v2Components/FormBuilder/index.js +1 -7
  32. package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
  33. package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
  34. package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
  35. package/v2Containers/CreativesContainer/SlideBoxContent.js +4 -36
  36. package/v2Containers/CreativesContainer/SlideBoxFooter.js +1 -10
  37. package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -29
  38. package/v2Containers/CreativesContainer/constants.js +0 -9
  39. package/v2Containers/CreativesContainer/index.js +93 -292
  40. package/v2Containers/CreativesContainer/index.scss +1 -51
  41. package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -78
  42. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
  43. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
  44. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -357
  45. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +10 -20
  46. package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
  47. package/v2Containers/Rcs/constants.js +3 -40
  48. package/v2Containers/Rcs/index.js +895 -1145
  49. package/v2Containers/Rcs/index.scss +6 -85
  50. package/v2Containers/Rcs/messages.js +2 -12
  51. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1432 -40783
  52. package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +5 -0
  53. package/v2Containers/Rcs/tests/index.test.js +38 -41
  54. package/v2Containers/Rcs/tests/mockData.js +0 -38
  55. package/v2Containers/Rcs/tests/utils.test.js +1 -435
  56. package/v2Containers/Rcs/utils.js +10 -405
  57. package/v2Containers/Sms/Create/index.js +38 -100
  58. package/v2Containers/SmsTrai/Create/index.js +4 -9
  59. package/v2Containers/SmsTrai/Edit/constants.js +0 -2
  60. package/v2Containers/SmsTrai/Edit/index.js +128 -636
  61. package/v2Containers/SmsTrai/Edit/messages.js +4 -14
  62. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2296 -4249
  63. package/v2Containers/SmsWrapper/index.js +8 -37
  64. package/v2Containers/TagList/index.js +11 -21
  65. package/v2Containers/Templates/_templates.scss +2 -63
  66. package/v2Containers/Templates/actions.js +0 -11
  67. package/v2Containers/Templates/constants.js +0 -2
  68. package/v2Containers/Templates/index.js +40 -90
  69. package/v2Containers/Templates/sagas.js +12 -57
  70. package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1079 -1043
  71. package/v2Containers/Templates/tests/sagas.test.js +123 -193
  72. package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
  73. package/v2Containers/TemplatesV2/index.js +23 -86
  74. package/v2Containers/WebPush/Create/index.js +1 -1
  75. package/v2Containers/Whatsapp/index.js +20 -3
  76. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
  77. package/utils/templateVarUtils.js +0 -201
  78. package/utils/tests/templateVarUtils.test.js +0 -204
  79. package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
  80. package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
  81. package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -87
  82. package/v2Components/SmsFallback/constants.js +0 -73
  83. package/v2Components/SmsFallback/index.js +0 -955
  84. package/v2Components/SmsFallback/index.scss +0 -265
  85. package/v2Components/SmsFallback/messages.js +0 -78
  86. package/v2Components/SmsFallback/smsFallbackUtils.js +0 -118
  87. package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
  88. package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
  89. package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
  90. package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -197
  91. package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -277
  92. package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
  93. package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
  94. package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
  95. package/v2Components/VarSegmentMessageEditor/index.js +0 -125
  96. package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
  97. package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -43
  98. package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -67
  99. package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
  100. package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
  101. package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
  102. package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -225
  103. package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
  104. package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
  105. package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
  106. package/v2Containers/SmsTrai/Edit/index.scss +0 -121
  107. package/v2Containers/Templates/TemplatesActionBar.js +0 -101
  108. package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
  109. package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
  110. package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
  111. package/v2Containers/TemplatesV2/tests/TemplatesV2.localTemplates.test.js +0 -131
@@ -21,8 +21,6 @@ export const DELIVERY_SETTING_KEY_SENDER_LABEL = 'senderLabel';
21
21
  export const DELIVERY_SETTING_KEY_SENDER_REPLY_TO = 'senderReplyTo';
22
22
  export const DELIVERY_SETTING_KEY_SOURCE_ACCOUNT_IDENTIFIER = 'sourceAccountIdentifier';
23
23
  export const DELIVERY_SETTING_KEY_SENDER_MOB_NUM = 'senderMobNum';
24
- /** RCS: SMS fallback domain (separate from primary RCS domainId) */
25
- export const DELIVERY_SETTING_KEY_SMS_FALLBACK_DOMAIN_ID = 'smsFallbackDomainId';
26
24
 
27
25
  /** data-testid for delivery settings edit icon */
28
26
  export const TEST_ID_DELIVERY_SETTINGS_EDIT = 'delivery-settings-edit';
@@ -34,7 +32,6 @@ export const CHANNELS_WITH_DELIVERY_SETTINGS = [
34
32
  CHANNELS.SMS,
35
33
  CHANNELS.EMAIL,
36
34
  CHANNELS.WHATSAPP,
37
- CHANNELS.RCS,
38
35
  ];
39
36
 
40
37
  /** Default empty delivery setting per channel (campaigns-style shape) */
@@ -59,21 +56,8 @@ export const DEFAULT_DELIVERY_SETTING_WHATSAPP = {
59
56
  sourceAccountIdentifier: '',
60
57
  };
61
58
 
62
- /** RCS: gsmSenderId = RCS sender, cdmaSenderId = SMS fallback sender (reuse same keys) */
63
- export const DEFAULT_DELIVERY_SETTING_RCS = {
64
- domainId: null,
65
- domainGatewayMapId: null,
66
- gsmSenderId: '',
67
- smsFallbackDomainId: null,
68
- cdmaSenderId: '',
69
- };
70
-
71
59
  export const DEFAULT_DELIVERY_SETTINGS_BY_CHANNEL = {
72
60
  [CHANNELS.SMS]: DEFAULT_DELIVERY_SETTING_SMS,
73
61
  [CHANNELS.EMAIL]: DEFAULT_DELIVERY_SETTING_EMAIL,
74
62
  [CHANNELS.WHATSAPP]: DEFAULT_DELIVERY_SETTING_WHATSAPP,
75
- [CHANNELS.RCS]: DEFAULT_DELIVERY_SETTING_RCS,
76
63
  };
77
-
78
- /** API `contactInfo.type` keys that map to RCS-style GSM sender rows (env-specific naming). */
79
- export const RCS_CONTACT_INFO_GSM_TYPE_KEYS = ['gsm_sender_id', 'rcs_sender_id', 'rcs_sender'];
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * DeliverySettings — summary row + CapSlideBox trigger for Test and Preview.
3
- * Rendered for SMS, Email, WhatsApp, RCS (ModifyDeliverySettings). RCS uses gsmSenderId + cdmaSenderId (SMS fallback).
3
+ * Rendered only for SMS, Email, WhatsApp. Uses cap-ui-library only.
4
4
  *
5
5
  * Reference: cap-campaigns-v2 DeliverySettingsV2 (summary + modify panel).
6
6
  */
7
7
 
8
- import React, { useState, useCallback, useMemo } from "react";
8
+ import React, { useState, useCallback } from "react";
9
9
  import PropTypes from "prop-types";
10
10
  import CapRow from "@capillarytech/cap-ui-library/CapRow";
11
11
  import CapHeading from "@capillarytech/cap-ui-library/CapHeading";
@@ -22,7 +22,6 @@ import {
22
22
  SUMMARY_EMPTY_PLACEHOLDER,
23
23
  DELIVERY_SETTING_KEY_DOMAIN_ID,
24
24
  DELIVERY_SETTING_KEY_GSM_SENDER_ID,
25
- DELIVERY_SETTING_KEY_CDMA_SENDER_ID,
26
25
  DELIVERY_SETTING_KEY_SENDER_EMAIL,
27
26
  DELIVERY_SETTING_KEY_SENDER_LABEL,
28
27
  DELIVERY_SETTING_KEY_SENDER_REPLY_TO,
@@ -36,7 +35,7 @@ const DeliverySettings = (props) => {
36
35
  const {
37
36
  channel,
38
37
  deliverySettings = {},
39
- senderDetailsByChannel = {},
38
+ senderDetailsOptions = [],
40
39
  wecrmAccounts = [],
41
40
  onSaveDeliverySettings,
42
41
  isLoadingSenderDetails,
@@ -44,7 +43,6 @@ const DeliverySettings = (props) => {
44
43
  smsTraiDltEnabled,
45
44
  registeredSenderIds,
46
45
  whatsappAccountFromForm,
47
- isChannelSmsFallbackPreviewEnabled,
48
46
  } = props;
49
47
 
50
48
  const [isSlideBoxOpen, setSlideBoxOpen] = useState(false);
@@ -60,68 +58,17 @@ const DeliverySettings = (props) => {
60
58
  [onSaveDeliverySettings, closeSlideBox]
61
59
  );
62
60
 
63
- const senderDetailsOptions = useMemo(
64
- () => (senderDetailsByChannel[channel] || []),
65
- [senderDetailsByChannel, channel],
66
- );
67
- const smsDomainsForRcs = useMemo(
68
- () => (channel === CHANNELS.RCS ? (senderDetailsByChannel[CHANNELS.SMS] || []) : []),
69
- [channel, senderDetailsByChannel],
70
- );
71
-
72
61
  if (!CHANNELS_WITH_DELIVERY_SETTINGS.includes(channel)) {
73
62
  return null;
74
63
  }
75
64
 
76
65
  const notConfiguredLabel = formatMessage(messages.notConfigured);
77
66
 
78
- const getDisplayFromDomains = (domains, compositeValue) => {
79
- if (!compositeValue || !domains?.length) return compositeValue || SUMMARY_EMPTY_PLACEHOLDER;
80
- for (const senderDomain of domains) {
81
- for (const gsmSenderRow of senderDomain.gsmSenders || []) {
82
- const value = senderDomain.domainId != null && gsmSenderRow.value != null
83
- ? `${senderDomain.domainId}|${gsmSenderRow.value}`
84
- : gsmSenderRow.value;
85
- if (value === compositeValue && (senderDomain.domainName || gsmSenderRow.value)) {
86
- return [senderDomain.domainName, gsmSenderRow.value].filter(Boolean).join(' · ');
87
- }
88
- }
89
- }
90
- return compositeValue || SUMMARY_EMPTY_PLACEHOLDER;
91
- };
92
-
93
- /** RCS summary: show sender ID only (no "domain · sender"). */
94
- const getSenderIdOnlyFromComposite = (domains, compositeValue) => {
95
- if (!compositeValue || !domains?.length) return compositeValue || SUMMARY_EMPTY_PLACEHOLDER;
96
- for (const senderDomain of domains) {
97
- for (const gsmSenderRow of senderDomain.gsmSenders || []) {
98
- const value = senderDomain.domainId != null && gsmSenderRow.value != null
99
- ? `${senderDomain.domainId}|${gsmSenderRow.value}`
100
- : gsmSenderRow.value;
101
- if (value === compositeValue && gsmSenderRow.value != null) {
102
- return String(gsmSenderRow.value);
103
- }
104
- }
105
- }
106
- return compositeValue || SUMMARY_EMPTY_PLACEHOLDER;
107
- };
108
-
109
67
  const getSummaryText = () => {
110
68
  const empty = SUMMARY_EMPTY_PLACEHOLDER;
111
- if (channel === CHANNELS.RCS) {
112
- const rcsVal = get(deliverySettings, DELIVERY_SETTING_KEY_GSM_SENDER_ID) || '';
113
- const smsVal = get(deliverySettings, DELIVERY_SETTING_KEY_CDMA_SENDER_ID) || '';
114
- const summaryRcs = {
115
- rcsSenderId: getSenderIdOnlyFromComposite(senderDetailsOptions, rcsVal),
116
- };
117
- if (isChannelSmsFallbackPreviewEnabled) {
118
- summaryRcs.smsFallbackSenderId = getSenderIdOnlyFromComposite(smsDomainsForRcs, smsVal);
119
- }
120
- return summaryRcs;
121
- }
122
69
  if (channel === CHANNELS.SMS) {
123
70
  const domain = (senderDetailsOptions || []).find(
124
- (senderDomain) => senderDomain.domainId === get(deliverySettings, DELIVERY_SETTING_KEY_DOMAIN_ID),
71
+ (d) => d.domainId === get(deliverySettings, DELIVERY_SETTING_KEY_DOMAIN_ID),
125
72
  );
126
73
  const domainName = domain?.domainName || empty;
127
74
  const senderId = get(deliverySettings, DELIVERY_SETTING_KEY_GSM_SENDER_ID) || empty;
@@ -129,7 +76,7 @@ const DeliverySettings = (props) => {
129
76
  }
130
77
  if (channel === CHANNELS.EMAIL) {
131
78
  const domain = (senderDetailsOptions || []).find(
132
- (senderDomain) => senderDomain.domainId === get(deliverySettings, DELIVERY_SETTING_KEY_DOMAIN_ID),
79
+ (d) => d.domainId === get(deliverySettings, DELIVERY_SETTING_KEY_DOMAIN_ID),
133
80
  );
134
81
  const emailDomain = domain?.domainName || empty;
135
82
  const senderEmail = get(deliverySettings, DELIVERY_SETTING_KEY_SENDER_EMAIL) || empty;
@@ -156,12 +103,7 @@ const DeliverySettings = (props) => {
156
103
 
157
104
  const summary = getSummaryText();
158
105
  let hasValues = false;
159
- if (channel === CHANNELS.RCS) {
160
- hasValues = (summary.rcsSenderId && summary.rcsSenderId !== SUMMARY_EMPTY_PLACEHOLDER)
161
- || (isChannelSmsFallbackPreviewEnabled
162
- && summary.smsFallbackSenderId
163
- && summary.smsFallbackSenderId !== SUMMARY_EMPTY_PLACEHOLDER);
164
- } else if (channel === CHANNELS.SMS) {
106
+ if (channel === CHANNELS.SMS) {
165
107
  hasValues = summary.senderDomain !== SUMMARY_EMPTY_PLACEHOLDER
166
108
  || summary.senderId !== SUMMARY_EMPTY_PLACEHOLDER;
167
109
  } else if (channel === CHANNELS.EMAIL) {
@@ -180,15 +122,6 @@ const DeliverySettings = (props) => {
180
122
  const getSummaryObject = () => {
181
123
  if (!hasValues) return null;
182
124
  const label = (msg) => formatMessage(msg);
183
- if (channel === CHANNELS.RCS) {
184
- const rcsSummary = {
185
- [label(messages.rcsSenderIdLabel)]: summary.rcsSenderId,
186
- };
187
- if (isChannelSmsFallbackPreviewEnabled) {
188
- rcsSummary[label(messages.fallbackSmsSenderIdLabel)] = summary.smsFallbackSenderId;
189
- }
190
- return rcsSummary;
191
- }
192
125
  if (channel === CHANNELS.SMS) {
193
126
  return {
194
127
  [label(messages.senderDomainSummary)]: summary.senderDomain,
@@ -232,7 +165,7 @@ const DeliverySettings = (props) => {
232
165
  Object.entries(summaryObject).map(([key, value]) => (
233
166
  <CapRow type="flex" key={key} className="delivery-settings__summary-entry">
234
167
  <CapLabel type="label1" className="delivery-settings__summary-key">{key}</CapLabel>
235
- <CapLabel type="label9" className="delivery-settings__summary-value">
168
+ <CapLabel type="label9">
236
169
  :
237
170
  {' '}
238
171
  {value}
@@ -261,11 +194,6 @@ const DeliverySettings = (props) => {
261
194
  channel={channel}
262
195
  deliverySettings={deliverySettings}
263
196
  senderDetailsOptions={senderDetailsOptions}
264
- smsFallbackSenderDetailsOptions={
265
- channel === CHANNELS.RCS && isChannelSmsFallbackPreviewEnabled
266
- ? smsDomainsForRcs
267
- : undefined
268
- }
269
197
  wecrmAccounts={wecrmAccounts}
270
198
  onSaveDeliverySettings={handleSave}
271
199
  onClose={closeSlideBox}
@@ -285,9 +213,9 @@ const DeliverySettings = (props) => {
285
213
  DeliverySettings.propTypes = {
286
214
  channel: PropTypes.string.isRequired,
287
215
  deliverySettings: PropTypes.object,
288
- senderDetailsByChannel: PropTypes.object,
216
+ senderDetailsOptions: PropTypes.array,
289
217
  wecrmAccounts: PropTypes.array,
290
- onSaveDeliverySettings: PropTypes.func,
218
+ onSaveDeliverySettings: PropTypes.func.isRequired,
291
219
  isLoadingSenderDetails: PropTypes.bool,
292
220
  formatMessage: PropTypes.func,
293
221
  smsTraiDltEnabled: PropTypes.bool,
@@ -295,20 +223,17 @@ DeliverySettings.propTypes = {
295
223
  whatsappAccountFromForm: PropTypes.shape({
296
224
  accountName: PropTypes.string,
297
225
  }),
298
- isChannelSmsFallbackPreviewEnabled: PropTypes.bool,
299
226
  };
300
227
 
301
228
  DeliverySettings.defaultProps = {
302
229
  deliverySettings: {},
303
- senderDetailsByChannel: {},
230
+ senderDetailsOptions: [],
304
231
  wecrmAccounts: [],
305
- onSaveDeliverySettings: () => {},
306
232
  isLoadingSenderDetails: false,
307
233
  formatMessage: undefined,
308
234
  smsTraiDltEnabled: false,
309
235
  registeredSenderIds: [],
310
236
  whatsappAccountFromForm: undefined,
311
- isChannelSmsFallbackPreviewEnabled: false,
312
237
  };
313
238
 
314
239
  export default DeliverySettings;
@@ -108,34 +108,4 @@ export default defineMessages({
108
108
  id: `${prefix}.disabledMessage`,
109
109
  defaultMessage: 'Message template selected belongs to this account',
110
110
  },
111
- /** RCS: primary domain (slidebox) */
112
- rcsDomainLabel: {
113
- id: `${prefix}.rcsDomainLabel`,
114
- defaultMessage: 'RCS domain:',
115
- },
116
- /** RCS: SMS fallback domain (slidebox) */
117
- fallbackSmsDomainLabel: {
118
- id: `${prefix}.fallbackSmsDomainLabel`,
119
- defaultMessage: 'Fallback SMS domain:',
120
- },
121
- /** RCS: "RCS sender ID" */
122
- rcsSenderIdLabel: {
123
- id: `${prefix}.rcsSenderIdLabel`,
124
- defaultMessage: 'RCS sender ID',
125
- },
126
- /** RCS: "Fallback SMS sender ID" */
127
- fallbackSmsSenderIdLabel: {
128
- id: `${prefix}.fallbackSmsSenderIdLabel`,
129
- defaultMessage: 'Fallback SMS sender ID',
130
- },
131
- /** RCS: "Domain" (for domain · sender ID display) */
132
- domainLabel: {
133
- id: `${prefix}.domainLabel`,
134
- defaultMessage: 'Domain',
135
- },
136
- /** RCS: placeholder for sender ID dropdown */
137
- selectSenderId: {
138
- id: `${prefix}.selectSenderId`,
139
- defaultMessage: 'Select sender ID',
140
- },
141
111
  });
@@ -9,91 +9,29 @@
9
9
 
10
10
  import get from 'lodash/get';
11
11
  import { CHANNELS } from '../../constants';
12
- import { RCS_CONTACT_INFO_GSM_TYPE_KEYS } from '../constants';
13
12
 
14
- /** Match API contactInfo.type (some envs use different casing). */
15
- const typeMatches = (itemType, expectedKey) => {
16
- if (!itemType || !expectedKey) return false;
17
- const a = String(itemType).toLowerCase().replace(/-/g, '_');
18
- const b = String(expectedKey).toLowerCase().replace(/-/g, '_');
19
- return a === b;
20
- };
21
-
22
- /**
23
- * Include row unless explicitly invalid — many APIs omit `valid`, which would
24
- * otherwise filter out every sender (RCS/SMS lists empty in UI).
25
- */
26
13
  const getSenderOptions = (contactInfo, key) =>
27
14
  (contactInfo || [])
28
- .filter((contactInfoItem) => typeMatches(contactInfoItem.type, key) && contactInfoItem.valid !== false)
15
+ .filter((contactInfoItem) => contactInfoItem.type === key && contactInfoItem.valid)
29
16
  .sort((contact) => (contact.default ? -1 : 0));
30
17
 
31
- /** RCS APIs may label senders under several `contactInfo.type` keys — see `RCS_CONTACT_INFO_GSM_TYPE_KEYS`. */
32
- const getRcsLikeGsmSenders = (contactInfo) => {
33
- const seen = new Set();
34
- const merged = [];
35
- RCS_CONTACT_INFO_GSM_TYPE_KEYS.forEach((key) => {
36
- getSenderOptions(contactInfo, key).forEach((row) => {
37
- const v = row?.value;
38
- // Skip empty/whitespace — they still pass `v != null` for "" and pollute RCS sender dropdowns.
39
- if (v == null || String(v).trim() === '' || seen.has(v)) return;
40
- seen.add(v);
41
- merged.push(row);
42
- });
43
- });
44
- return merged.sort((a, b) => (a.default ? -1 : 0) - (b.default ? -1 : 0));
45
- };
46
-
47
- /**
48
- * Campaigns domainProperties may return { entity } or { result: { entity } } / { data: { entity } }.
49
- */
50
- function unwrapEntity(response) {
51
- if (!response || typeof response !== 'object') return null;
52
- if (response.entity != null) return response.entity;
53
- const nested = get(response, 'result.entity') ?? get(response, 'data.entity');
54
- if (nested != null) return nested;
55
- if (response.entity === null) return null;
56
- return response;
57
- }
58
-
59
18
  /**
60
19
  * Parse raw API response for one channel into { domains: [...] }
61
- * @param {string} channel - SMS | EMAIL | WHATSAPP | RCS
20
+ * @param {string} channel - SMS | EMAIL | WHATSAPP
62
21
  * @param {Object} response - API response (e.g. { entity: { SMS: [...] } } or { entity: [...] })
63
22
  * @returns {{ domains: Array }} - domains array compatible with campaigns DeliverySettingsV2
64
23
  */
65
24
  export function parseSenderDetailsResponse(channel, response) {
66
- const entity = unwrapEntity(response);
67
- if (entity == null || entity === '') {
25
+ const entity = get(response, 'entity', response);
26
+ if (!entity) {
68
27
  return { domains: [] };
69
28
  }
70
29
 
71
- // Normalize once: entity keys may be any casing (SMS/sms/rcs) but downstream branches use CHANNELS.* (uppercase).
72
- const normalizedChannel =
73
- channel == null || String(channel).trim() === ''
74
- ? ''
75
- : String(channel).trim().toUpperCase();
76
-
77
- // Single-channel API: entity may be { [channel]: [...] } or direct array.
78
- // Some responses use different casing (e.g. rcs vs RCS) or a single domain object instead of an array.
79
- let channelSenderDetails =
80
- get(entity, channel, null)
81
- ?? (normalizedChannel ? get(entity, normalizedChannel, null) : null)
82
- ?? (normalizedChannel ? get(entity, normalizedChannel.toLowerCase(), null) : null);
83
-
30
+ // Single-channel API: entity may be { [channel]: [...] } or direct array
31
+ let channelSenderDetails = get(entity, channel, null);
84
32
  if (channelSenderDetails == null && Array.isArray(entity)) {
85
33
  channelSenderDetails = entity;
86
34
  }
87
-
88
- if (channelSenderDetails != null && !Array.isArray(channelSenderDetails)) {
89
- const single = channelSenderDetails;
90
- if (single && typeof single === 'object' && single.domainProperties) {
91
- channelSenderDetails = [single];
92
- } else {
93
- return { domains: [] };
94
- }
95
- }
96
-
97
35
  if (!Array.isArray(channelSenderDetails)) {
98
36
  return { domains: [] };
99
37
  }
@@ -104,7 +42,6 @@ export function parseSenderDetailsResponse(channel, response) {
104
42
  const { id: dgmId, priority, domainProperties = {} } = element;
105
43
  const {
106
44
  domainName,
107
- hostName,
108
45
  id = -1,
109
46
  contactInfo,
110
47
  connectionProperties: {
@@ -114,25 +51,21 @@ export function parseSenderDetailsResponse(channel, response) {
114
51
  } = {},
115
52
  } = domainProperties;
116
53
 
117
- const resolvedDomainName = domainName || hostName;
118
-
119
54
  const domain = {
120
55
  dgmId,
121
- domainName: resolvedDomainName,
56
+ domainName,
122
57
  domainId: id,
123
58
  priority: priority != null ? priority : 0,
124
59
  };
125
60
 
126
- if ([CHANNELS.SMS, CHANNELS.WHATSAPP, CHANNELS.RCS].includes(normalizedChannel)) {
61
+ if ([CHANNELS.SMS, CHANNELS.WHATSAPP].includes(channel)) {
127
62
  domain.cdmaSenders = getSenderOptions(contactInfo, 'cdma_sender_id');
128
- domain.gsmSenders = normalizedChannel === CHANNELS.RCS
129
- ? getRcsLikeGsmSenders(contactInfo)
130
- : getSenderOptions(contactInfo, 'gsm_sender_id');
63
+ domain.gsmSenders = getSenderOptions(contactInfo, 'gsm_sender_id');
131
64
  domain.sourceAccountIdentifier =
132
65
  sourceAccountIdentifier || wabaId || userid || '';
133
66
  }
134
67
 
135
- if (normalizedChannel === CHANNELS.EMAIL) {
68
+ if (channel === CHANNELS.EMAIL) {
136
69
  domain.emailSenders = getSenderOptions(contactInfo, 'sender_id');
137
70
  domain.emailRepliers = getSenderOptions(contactInfo, 'reply_to_id');
138
71
  }
@@ -143,8 +76,7 @@ export function parseSenderDetailsResponse(channel, response) {
143
76
  // Sort by priority and dedupe by domainName (match campaigns behaviour)
144
77
  domains.sort((a, b) => (a.priority || 0) - (b.priority || 0));
145
78
  const deduped = domains.reduce((acc, domain) => {
146
- const key = domain.domainName ?? domain.domainId;
147
- if (!acc.find((existing) => (existing.domainName ?? existing.domainId) === key)) {
79
+ if (!acc.find((d) => d.domainName === domain.domainName)) {
148
80
  acc.push(domain);
149
81
  }
150
82
  return acc;
@@ -24,6 +24,7 @@ const ExistingCustomerModal = ({ customerModal, onCloseCustomerModal, customerDa
24
24
  type="primary"
25
25
  onClick={() => onSave({}, setIsLoading)}
26
26
  loading={isLoading}
27
+ disabled={isLoading}
27
28
  >
28
29
  <FormattedMessage {...messages.saveButton} />
29
30
  </CapButton>
@@ -6,13 +6,12 @@ import CapButton from '@capillarytech/cap-ui-library/CapButton';
6
6
  import CapHeader from '@capillarytech/cap-ui-library/CapHeader';
7
7
  import CapStepsAccordian from '@capillarytech/cap-ui-library/CapStepsAccordian';
8
8
  import CapTreeSelect from '@capillarytech/cap-ui-library/CapTreeSelect';
9
- import CapSelect from '@capillarytech/cap-ui-library/CapSelect';
10
9
  import isEmpty from 'lodash/isEmpty';
11
10
  import messages from './messages';
12
11
  import DeliverySettings from './DeliverySettings';
13
12
  import { CHANNELS } from './constants';
14
13
 
15
- const CHANNELS_WITH_DELIVERY_SETTINGS = [CHANNELS.SMS, CHANNELS.EMAIL, CHANNELS.WHATSAPP, CHANNELS.RCS];
14
+ const CHANNELS_WITH_DELIVERY_SETTINGS = [CHANNELS.SMS, CHANNELS.EMAIL, CHANNELS.WHATSAPP];
16
15
 
17
16
  const SendTestMessage = ({
18
17
  isFetchingTestCustomers,
@@ -29,13 +28,12 @@ const SendTestMessage = ({
29
28
  searchValue,
30
29
  setSearchValue,
31
30
  deliverySettings,
32
- senderDetailsByChannel = {},
31
+ senderDetailsOptions,
33
32
  wecrmAccounts,
34
33
  onSaveDeliverySettings,
35
34
  isLoadingSenderDetails,
36
35
  smsTraiDltEnabled,
37
36
  registeredSenderIds,
38
- isChannelSmsFallbackPreviewEnabled,
39
37
  }) => {
40
38
  const addCustomerContent = renderAddTestCustomerButton ? renderAddTestCustomerButton() : null;
41
39
  return (
@@ -79,14 +77,13 @@ const SendTestMessage = ({
79
77
  <DeliverySettings
80
78
  channel={channel}
81
79
  deliverySettings={deliverySettings || {}}
82
- senderDetailsByChannel={senderDetailsByChannel}
80
+ senderDetailsOptions={senderDetailsOptions}
83
81
  wecrmAccounts={wecrmAccounts || []}
84
82
  onSaveDeliverySettings={onSaveDeliverySettings}
85
83
  isLoadingSenderDetails={isLoadingSenderDetails}
86
84
  formatMessage={formatMessage}
87
85
  smsTraiDltEnabled={smsTraiDltEnabled}
88
86
  registeredSenderIds={registeredSenderIds}
89
- isChannelSmsFallbackPreviewEnabled={isChannelSmsFallbackPreviewEnabled}
90
87
  whatsappAccountFromForm={
91
88
  channel === CHANNELS.WHATSAPP && formData?.accountName
92
89
  ? { accountName: formData.accountName }
@@ -124,13 +121,12 @@ SendTestMessage.propTypes = {
124
121
  searchValue: PropTypes.string,
125
122
  setSearchValue: PropTypes.func,
126
123
  deliverySettings: PropTypes.object,
127
- senderDetailsByChannel: PropTypes.object,
124
+ senderDetailsOptions: PropTypes.array,
128
125
  wecrmAccounts: PropTypes.array,
129
126
  onSaveDeliverySettings: PropTypes.func,
130
127
  isLoadingSenderDetails: PropTypes.bool,
131
128
  smsTraiDltEnabled: PropTypes.bool,
132
129
  registeredSenderIds: PropTypes.array,
133
- isChannelSmsFallbackPreviewEnabled: PropTypes.bool,
134
130
  };
135
131
 
136
132
  SendTestMessage.defaultProps = {
@@ -140,13 +136,12 @@ SendTestMessage.defaultProps = {
140
136
  searchValue: '',
141
137
  setSearchValue: () => {}, // no-op when not provided; required by TreeSelect when showSearch is true
142
138
  deliverySettings: {},
143
- senderDetailsByChannel: {},
139
+ senderDetailsOptions: [],
144
140
  wecrmAccounts: [],
145
141
  onSaveDeliverySettings: undefined,
146
142
  isLoadingSenderDetails: false,
147
143
  smsTraiDltEnabled: false,
148
144
  registeredSenderIds: [],
149
- isChannelSmsFallbackPreviewEnabled: false,
150
145
  };
151
146
 
152
147
  export default SendTestMessage;
@@ -11,6 +11,7 @@
11
11
  height: 100%;
12
12
  display: flex;
13
13
  flex-direction: column;
14
+ background: $CAP_WHITE;
14
15
  overflow: hidden;
15
16
 
16
17
  // Preview Chrome wrapper (matches old TestAndPreviewSlidebox design)
@@ -61,27 +62,7 @@
61
62
  }
62
63
  }
63
64
  }
64
-
65
- .unified-preview.unified-preview-rcs-tabs {
66
- .ant-tabs-nav {
67
- margin: 0;
68
- padding: 0 $CAP_SPACE_16;
69
- }
70
65
 
71
- // Prevent white hover/active backgrounds from default antd styles
72
- .ant-tabs-tab,
73
- .ant-tabs-tab:hover,
74
- .ant-tabs-tab-active {
75
- background: transparent;
76
- }
77
-
78
- .ant-tabs-tab-btn,
79
- .ant-tabs-tab-btn:hover,
80
- .ant-tabs-tab-btn:active {
81
- background: transparent;
82
- }
83
- }
84
-
85
66
  // Preview Content Container
86
67
  .preview-content-container {
87
68
  flex: 1;