@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.
- package/constants/unified.js +0 -18
- package/package.json +1 -1
- package/services/tests/api.test.js +0 -13
- package/utils/commonUtils.js +1 -19
- package/v2Components/CapTagList/index.js +0 -10
- package/v2Components/CommonTestAndPreview/CustomValuesEditor.js +49 -70
- package/v2Components/CommonTestAndPreview/DeliverySettings/DeliverySettings.scss +2 -8
- package/v2Components/CommonTestAndPreview/DeliverySettings/ModifyDeliverySettings.js +21 -207
- package/v2Components/CommonTestAndPreview/DeliverySettings/constants.js +0 -16
- package/v2Components/CommonTestAndPreview/DeliverySettings/index.js +10 -85
- package/v2Components/CommonTestAndPreview/DeliverySettings/messages.js +0 -30
- package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js +11 -79
- package/v2Components/CommonTestAndPreview/ExistingCustomerModal.js +1 -0
- package/v2Components/CommonTestAndPreview/SendTestMessage.js +5 -10
- package/v2Components/CommonTestAndPreview/UnifiedPreview/_unifiedPreview.scss +1 -20
- package/v2Components/CommonTestAndPreview/UnifiedPreview/index.js +4 -133
- package/v2Components/CommonTestAndPreview/_commonTestAndPreview.scss +0 -11
- package/v2Components/CommonTestAndPreview/constants.js +2 -38
- package/v2Components/CommonTestAndPreview/index.js +176 -672
- package/v2Components/CommonTestAndPreview/messages.js +3 -41
- package/v2Components/CommonTestAndPreview/reducer.js +3 -1
- package/v2Components/CommonTestAndPreview/sagas.js +8 -16
- package/v2Components/CommonTestAndPreview/tests/CustomValuesEditor.test.js +284 -308
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/ModifyDeliverySettings.test.js +65 -231
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/index.test.js +5 -118
- package/v2Components/CommonTestAndPreview/tests/DeliverySettings/utils/parseSenderDetailsResponse.test.js +0 -341
- package/v2Components/CommonTestAndPreview/tests/SendTestMessage.test.js +13 -34
- package/v2Components/CommonTestAndPreview/tests/UnifiedPreview/index.test.js +1 -199
- package/v2Components/CommonTestAndPreview/tests/index.test.js +4 -132
- package/v2Components/CommonTestAndPreview/tests/sagas.test.js +2 -2
- package/v2Components/FormBuilder/index.js +1 -7
- package/v2Components/TestAndPreviewSlidebox/index.js +1 -13
- package/v2Components/TestAndPreviewSlidebox/sagas.js +4 -11
- package/v2Components/TestAndPreviewSlidebox/tests/saga.test.js +1 -3
- package/v2Containers/CreativesContainer/SlideBoxContent.js +4 -36
- package/v2Containers/CreativesContainer/SlideBoxFooter.js +1 -10
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -29
- package/v2Containers/CreativesContainer/constants.js +0 -9
- package/v2Containers/CreativesContainer/index.js +93 -292
- package/v2Containers/CreativesContainer/index.scss +1 -51
- package/v2Containers/CreativesContainer/tests/SlideBoxFooter.test.js +34 -78
- package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +16 -79
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +0 -8
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -357
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +10 -20
- package/v2Containers/CreativesContainer/tests/index.test.js +9 -71
- package/v2Containers/Rcs/constants.js +3 -40
- package/v2Containers/Rcs/index.js +895 -1145
- package/v2Containers/Rcs/index.scss +6 -85
- package/v2Containers/Rcs/messages.js +2 -12
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1432 -40783
- package/v2Containers/Rcs/tests/__snapshots__/utils.test.js.snap +5 -0
- package/v2Containers/Rcs/tests/index.test.js +38 -41
- package/v2Containers/Rcs/tests/mockData.js +0 -38
- package/v2Containers/Rcs/tests/utils.test.js +1 -435
- package/v2Containers/Rcs/utils.js +10 -405
- package/v2Containers/Sms/Create/index.js +38 -100
- package/v2Containers/SmsTrai/Create/index.js +4 -9
- package/v2Containers/SmsTrai/Edit/constants.js +0 -2
- package/v2Containers/SmsTrai/Edit/index.js +128 -636
- package/v2Containers/SmsTrai/Edit/messages.js +4 -14
- package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +2296 -4249
- package/v2Containers/SmsWrapper/index.js +8 -37
- package/v2Containers/TagList/index.js +11 -21
- package/v2Containers/Templates/_templates.scss +2 -63
- package/v2Containers/Templates/actions.js +0 -11
- package/v2Containers/Templates/constants.js +0 -2
- package/v2Containers/Templates/index.js +40 -90
- package/v2Containers/Templates/sagas.js +12 -57
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +1079 -1043
- package/v2Containers/Templates/tests/sagas.test.js +123 -193
- package/v2Containers/TemplatesV2/TemplatesV2.style.js +1 -72
- package/v2Containers/TemplatesV2/index.js +23 -86
- package/v2Containers/WebPush/Create/index.js +1 -1
- package/v2Containers/Whatsapp/index.js +20 -3
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +34 -578
- package/utils/templateVarUtils.js +0 -201
- package/utils/tests/templateVarUtils.test.js +0 -204
- package/v2Components/CommonTestAndPreview/previewApiUtils.js +0 -59
- package/v2Components/CommonTestAndPreview/tests/previewApiUtils.test.js +0 -67
- package/v2Components/SmsFallback/SmsFallbackLocalSelector.js +0 -87
- package/v2Components/SmsFallback/constants.js +0 -73
- package/v2Components/SmsFallback/index.js +0 -955
- package/v2Components/SmsFallback/index.scss +0 -265
- package/v2Components/SmsFallback/messages.js +0 -78
- package/v2Components/SmsFallback/smsFallbackUtils.js +0 -118
- package/v2Components/SmsFallback/tests/SmsFallbackLocalSelector.test.js +0 -50
- package/v2Components/SmsFallback/tests/rcsSmsFallback.acceptance.test.js +0 -147
- package/v2Components/SmsFallback/tests/smsFallbackHandlers.test.js +0 -304
- package/v2Components/SmsFallback/tests/smsFallbackUi.test.js +0 -197
- package/v2Components/SmsFallback/tests/smsFallbackUtils.test.js +0 -277
- package/v2Components/SmsFallback/tests/useLocalTemplateList.test.js +0 -422
- package/v2Components/SmsFallback/useLocalTemplateList.js +0 -92
- package/v2Components/VarSegmentMessageEditor/constants.js +0 -2
- package/v2Components/VarSegmentMessageEditor/index.js +0 -125
- package/v2Components/VarSegmentMessageEditor/index.scss +0 -46
- package/v2Containers/CreativesContainer/CreativesSlideBoxWrapper.js +0 -43
- package/v2Containers/CreativesContainer/embeddedSlideboxUtils.js +0 -67
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.localTemplates.test.js +0 -90
- package/v2Containers/CreativesContainer/tests/embeddedSlideboxUtils.test.js +0 -258
- package/v2Containers/CreativesContainer/tests/useLocalTemplatesProp.test.js +0 -125
- package/v2Containers/Rcs/rcsLibraryHydrationUtils.js +0 -225
- package/v2Containers/Rcs/tests/rcsLibraryHydrationUtils.test.js +0 -318
- package/v2Containers/Sms/smsFormDataHelpers.js +0 -67
- package/v2Containers/Sms/tests/smsFormDataHelpers.test.js +0 -253
- package/v2Containers/SmsTrai/Edit/index.scss +0 -121
- package/v2Containers/Templates/TemplatesActionBar.js +0 -101
- package/v2Containers/Templates/tests/TemplatesActionBar.test.js +0 -120
- package/v2Containers/Templates/tests/smsTemplatesListApi.test.js +0 -180
- package/v2Containers/Templates/utils/smsTemplatesListApi.js +0 -79
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
(
|
|
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
|
-
(
|
|
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.
|
|
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"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|
package/v2Components/CommonTestAndPreview/DeliverySettings/utils/parseSenderDetailsResponse.js
CHANGED
|
@@ -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) =>
|
|
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
|
|
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 =
|
|
67
|
-
if (entity
|
|
25
|
+
const entity = get(response, 'entity', response);
|
|
26
|
+
if (!entity) {
|
|
68
27
|
return { domains: [] };
|
|
69
28
|
}
|
|
70
29
|
|
|
71
|
-
//
|
|
72
|
-
|
|
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
|
|
56
|
+
domainName,
|
|
122
57
|
domainId: id,
|
|
123
58
|
priority: priority != null ? priority : 0,
|
|
124
59
|
};
|
|
125
60
|
|
|
126
|
-
if ([CHANNELS.SMS, CHANNELS.WHATSAPP
|
|
61
|
+
if ([CHANNELS.SMS, CHANNELS.WHATSAPP].includes(channel)) {
|
|
127
62
|
domain.cdmaSenders = getSenderOptions(contactInfo, 'cdma_sender_id');
|
|
128
|
-
domain.gsmSenders =
|
|
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 (
|
|
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
|
-
|
|
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;
|
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|