@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
@@ -8,7 +8,6 @@ import CapRow from '@capillarytech/cap-ui-library/CapRow';
8
8
  import CapColumn from '@capillarytech/cap-ui-library/CapColumn';
9
9
  import CapHeading from '@capillarytech/cap-ui-library/CapHeading';
10
10
  import CapHeader from "@capillarytech/cap-ui-library/CapHeader";
11
- import CapRadioGroup from '@capillarytech/cap-ui-library/CapRadioGroup';
12
11
  import CapSelect from '@capillarytech/cap-ui-library/CapSelect';
13
12
  import CapInput from '@capillarytech/cap-ui-library/CapInput';
14
13
  import CapIcon from '@capillarytech/cap-ui-library/CapIcon';
@@ -21,16 +20,9 @@ import globalMessages from '../../v2Containers/Cap/messages';import CapTagListWi
21
20
 
22
21
  import { isUrl, isValidText } from '../../v2Containers/Line/Container/Wrapper/utils';
23
22
  import messages from './messages';
24
- import {
25
- BTN_MAX_LENGTH,
26
- URL_MAX_LENGTH,
27
- PHONE_NUMBER_MAX_LENGTH,
28
- invalidVarRegex,
29
- HANDLERS,
30
- RCS_CTA_URL_TYPE,
31
- } from './constants';
23
+ import { CTA_OPTIONS, BTN_MAX_LENGTH, URL_MAX_LENGTH, PHONE_NUMBER_MAX_LENGTH,invalidVarRegex, HANDLERS } from './constants';
32
24
  import './index.scss';
33
- import { INITIAL_SUGGESTIONS, RCS_BUTTON_TYPES, HOST_ICS} from '../../v2Containers/Rcs/constants';
25
+ import { INITIAL_SUGGESTIONS, RCS_BUTTON_TYPES} from '../../v2Containers/Rcs/constants';
34
26
 
35
27
  const { TextArea } = CapInput;
36
28
 
@@ -49,12 +41,9 @@ export const CapActionButton = (props) => {
49
41
  injectedTags = {},
50
42
  location = {},
51
43
  selectedOfferDetails = [],
52
- host = '',
44
+
53
45
  onContextChange,
54
- minSavedSuggestions = 0,
55
- hideDeleteSuggestionIndexes = [],
56
46
  } = props;
57
- const isHostIcs = host === HOST_ICS;
58
47
  const [urlError, setUrlError] = useState(false);
59
48
  const [buttonError, setButtonError] = useState(false);
60
49
  const updateHandler = (type, value, index) => {
@@ -77,7 +66,6 @@ export const CapActionButton = (props) => {
77
66
 
78
67
  const onCtaTypeChange = (value, index) => {
79
68
  let clonedCta = cloneDeep(suggestions[index]);
80
- const isCta = value === RCS_BUTTON_TYPES.CTA;
81
69
  clonedCta = {
82
70
  ...clonedCta,
83
71
  type: value,
@@ -85,7 +73,6 @@ export const CapActionButton = (props) => {
85
73
  phoneNumber: '',
86
74
  postback: '',
87
75
  url: value === RCS_BUTTON_TYPES.PHONE_NUMBER ? null : '',
88
- urlType: isCta ? RCS_CTA_URL_TYPE.STATIC : undefined,
89
76
  isSaved: false,
90
77
  };
91
78
  setUrlError(false);
@@ -105,61 +92,39 @@ export const CapActionButton = (props) => {
105
92
  updateDisplayAndPostback(value, id);
106
93
  };
107
94
 
108
- const renderInnerCharCount = (len, max) => (
109
- <CapHeading type="h5" className="rcs-cta-inner-char-count">
110
- {formatMessage(messages.ctaFieldCharCountInline, { current: len, max })}
95
+ const renderLength = (len, max) => (
96
+ <CapHeading type="label1" className="rcs-render-btn-length">
97
+ {formatMessage(messages.templateMessageLength, {
98
+ currentLength: len,
99
+ maxLength: max,
100
+ })}
111
101
  </CapHeading>
112
102
  );
113
103
 
114
- const validateCtaUrlValue = (value, urlSubtype) => {
115
- const v = String(value || '').trim();
116
- if (!v) {
117
- return formatMessage(messages.ctaWebsiteUrlErrorMessage);
118
- }
119
- if (v.length > URL_MAX_LENGTH) {
120
- return formatMessage(messages.ctaWebsiteUrlErrorMessage);
121
- }
122
- if (urlSubtype === RCS_CTA_URL_TYPE.DYNAMIC) {
123
- return false;
124
- }
125
- if (!isUrl(v)) {
126
- return formatMessage(messages.ctaWebsiteUrlErrorMessage);
127
- }
128
- if (v.match(invalidVarRegex)?.length > 0) {
129
- return formatMessage(messages.staticUrlWithVarErrorMessage);
130
- }
131
- return false;
132
- };
133
-
134
104
  const onUrlChange = ({ target }) => {
135
- const { value, id } = target;
136
- const row = suggestions[id] || {};
137
- const subtype = row.urlType || RCS_CTA_URL_TYPE.STATIC;
138
- setUrlError(validateCtaUrlValue(value, subtype));
105
+ let { value, id } = target;
106
+ let errorMessage = false;
107
+ if (!isUrl(value)) {
108
+ errorMessage = formatMessage(messages.ctaWebsiteUrlErrorMessage);
109
+ } else if (value.match(invalidVarRegex)?.length > 0) {
110
+ errorMessage = formatMessage(messages.staticUrlWithVarErrorMessage);
111
+ }
112
+ setUrlError(errorMessage);
139
113
  updateHandler(HANDLERS.URL, value, id);
140
114
  };
141
115
 
142
- const onUrlSubtypeChange = (nextSubtype, index) => {
143
- const cloned = cloneDeep(suggestions[index]);
144
- cloned.urlType = nextSubtype;
145
- cloned.isSaved = false;
146
- setUrlError(validateCtaUrlValue(cloned.url || '', nextSubtype));
147
- updateButtonChange(cloned, index);
148
- };
149
-
150
116
  const onPhoneNoChange = (value, index) => {
151
117
  updateHandler(HANDLERS.PHONE_NUMBER, value, index);
152
118
  };
153
119
 
154
120
  const ctaSaveDisabled = (index) => {
155
- const { type, text, phoneNumber, url, urlType } = suggestions[index] || {};
121
+ const { type, text, phoneNumber, url } = suggestions[index] || {};
156
122
  if (text === '' || buttonError) {
157
123
  return true;
158
- } if (type === RCS_BUTTON_TYPES.PHONE_NUMBER && (phoneNumber || '').length < 5) {
124
+ } if (type === RCS_BUTTON_TYPES.PHONE_NUMBER && phoneNumber.length < 5) {
125
+ return true;
126
+ } if (type === RCS_BUTTON_TYPES.CTA && (url === '' || urlError)) {
159
127
  return true;
160
- } if (type === RCS_BUTTON_TYPES.CTA) {
161
- const subtype = urlType || RCS_CTA_URL_TYPE.STATIC;
162
- return !!validateCtaUrlValue(url, subtype);
163
128
  }
164
129
  return false;
165
130
  };
@@ -178,59 +143,64 @@ export const CapActionButton = (props) => {
178
143
  updateButtonChange(newSuggestion, suggestions?.length);
179
144
  };
180
145
 
181
- const { formatMessage } = intl;
182
-
183
- const hideDeleteForSuggestionIndex = (idx) =>
184
- Array.isArray(hideDeleteSuggestionIndexes) && hideDeleteSuggestionIndexes.includes(idx);
185
-
186
- const ctaTypeRadioOptions = [
187
- { label: formatMessage(messages.ctaPhoneNo), value: RCS_BUTTON_TYPES.PHONE_NUMBER },
188
- { label: formatMessage(messages.ctaUrlRadio), value: RCS_BUTTON_TYPES.CTA },
189
- { label: formatMessage(messages.ctaQr), value: RCS_BUTTON_TYPES.QUICK_REPLY },
190
- ];
191
-
192
- const urlTypeSelectOptions = [
193
- { value: RCS_CTA_URL_TYPE.STATIC, label: formatMessage(messages.ctaWebsiteTypeStatic) },
194
- { value: RCS_CTA_URL_TYPE.DYNAMIC, label: formatMessage(messages.ctaWebsiteTypeDynamic) },
195
- ];
146
+ const renderCtaOptions = (label, tooltipLabel, isDisabled) => {
147
+ if (isDisabled) {
148
+ return (
149
+ <CapRow>
150
+ <CapColumn span={23}>{label}</CapColumn>
151
+ <CapColumn span={1}>
152
+ <CapTooltipWithInfo
153
+ // autoAdjustOverflow
154
+ placement="right"
155
+ title={tooltipLabel}
156
+ />
157
+ </CapColumn>
158
+ </CapRow>
159
+ );
160
+ }
161
+ return label;
162
+ };
196
163
 
164
+ const { formatMessage } = intl;
197
165
  const renderedContent = () => {
198
166
  const renderArray = [];
199
- const addBtnDisabled = suggestions?.length > 0 && (suggestions.length >= maxButtons || !suggestions[suggestions.length - 1]?.isSaved);
200
- const savedSuggestionsCount = (suggestions || []).filter((s) => s && s.isSaved).length;
201
- const cannotDeleteSavedMandatory = (idx) => {
202
- const row = suggestions[idx];
203
- if (!row || !row.isSaved) return false;
204
- return minSavedSuggestions > 0 && savedSuggestionsCount <= minSavedSuggestions;
205
- };
167
+ const addBtnDisabled = suggestions.length >= maxButtons || !suggestions[suggestions.length - 1]?.isSaved;
168
+
169
+ const ctaOptions = CTA_OPTIONS.map((option) => {
170
+ const { value, label } = option;
171
+ const isDisabled = suggestions.length >= maxButtons && !suggestions[suggestions.length - 1];
172
+ return {
173
+ value,
174
+ label: renderCtaOptions(label, formatMessage(messages.ctaButtonTypeDisabled), isDisabled),
175
+ disabled: isDisabled,
176
+ };
177
+ });
206
178
 
207
- suggestions?.length > 0 && suggestions.forEach((cta) => {
179
+ suggestions.forEach((cta) => {
208
180
  const {
209
181
  index, type, text, isSaved,
210
182
  } = cta || {};
211
183
 
212
184
  const url = type !== RCS_BUTTON_TYPES.CTA ? null : cta.url;
213
- const urlSubtype = type === RCS_BUTTON_TYPES.CTA
214
- ? (cta.urlType || RCS_CTA_URL_TYPE.STATIC)
215
- : RCS_CTA_URL_TYPE.STATIC;
216
185
  const phoneNumber = type !== RCS_BUTTON_TYPES.PHONE_NUMBER ? null : cta.phoneNumber;
217
186
  if (isFullMode && !isEditFlow && !isSaved) {
218
187
  renderArray.push(
219
- <CapRow className="rcs-button-cta-create-container" key={`cta-edit-${index}`} gutter={0}>
220
- <CapRow className="rcs-button-cta-create" gutter={0}>
221
- <CapColumn span={24}>
222
- <CapHeading type="h4">
188
+ <div className="rcs-button-cta-create-container" key={`cta-edit-${index}`}>
189
+ <CapRow type='flex' justify='space-between' className="rcs-button-cta-create margin-t-16">
190
+ <CapColumn span={11}>
191
+ {/* Type of action */}
192
+ <CapHeading type="h4" className="cta-label">
223
193
  {formatMessage(messages.ctaType)}
224
194
  </CapHeading>
225
- <CapRadioGroup
226
- id={`rcs-cta-type-radio-${index}`}
227
- className="cap-rcs-cta-type-radio"
228
- options={ctaTypeRadioOptions}
195
+ <CapSelect
196
+ id="rcs-cta-type"
197
+ options={ctaOptions || []}
198
+ onChange={(value) => onCtaTypeChange(value, index)}
229
199
  value={type}
230
- onChange={(e) => onCtaTypeChange(e.target.value, index)}
200
+ disabled={false}
231
201
  />
232
202
  </CapColumn>
233
- <CapColumn span={24}>
203
+ <CapColumn span={12}>
234
204
  <CapHeading type="h4" className="cta-label">
235
205
  {formatMessage(messages.ctaButtonText)}
236
206
  <CapTooltipWithInfo
@@ -251,34 +221,28 @@ export const CapActionButton = (props) => {
251
221
  size="large"
252
222
  maxLength={BTN_MAX_LENGTH}
253
223
  errorMessage={buttonError}
254
- suffix={renderInnerCharCount((text || '').length, BTN_MAX_LENGTH)}
255
224
  />
225
+ {renderLength(text.length, BTN_MAX_LENGTH)}
256
226
  </CapColumn>
257
227
  </CapRow>
258
228
  {type === RCS_BUTTON_TYPES.PHONE_NUMBER && (
259
229
  <>
260
230
  <CapRow>
261
- <CapColumn span={24}>
231
+ <CapColumn span={11}>
232
+ {/* phone number */}
262
233
  <CapHeading type="h4" className="cta-label">
263
234
  {formatMessage(messages.ctaPhoneNo)}
264
235
  </CapHeading>
265
- <CapRow
266
- className="rcs-cta-input-with-inner-count rcs-cta-input-with-inner-count--phone"
267
- gutter={0}
268
- >
269
- <CapColumn span={24}>
270
- <PhoneInput
271
- placeholder={formatMessage(messages.ctaPhoneNoPlaceholder)}
272
- autoFormat={false}
273
- countryCodeEditable={false}
274
- value={phoneNumber}
275
- onChange={(value) => onPhoneNoChange(value, index)}
276
- country="in"
277
- className="cta-phone-number rcs-cta-phone-input"
278
- />
279
- {renderInnerCharCount((phoneNumber || '').length, PHONE_NUMBER_MAX_LENGTH)}
280
- </CapColumn>
281
- </CapRow>
236
+ <PhoneInput
237
+ placeholder={formatMessage(messages.ctaPhoneNoPlaceholder)}
238
+ autoFormat={false}
239
+ countryCodeEditable={false}
240
+ value={phoneNumber}
241
+ onChange={(value) => onPhoneNoChange(value, index)}
242
+ country="in"
243
+ className="cta-phone-number"
244
+ />
245
+ {renderLength(phoneNumber.length, PHONE_NUMBER_MAX_LENGTH)}
282
246
  </CapColumn>
283
247
  </CapRow>
284
248
  <CapRow useLegacy className="rcs-cta-save-delete-btn">
@@ -286,7 +250,7 @@ export const CapActionButton = (props) => {
286
250
  title={ctaSaveDisabled(index) && formatMessage(messages.ctaSaveDisabled)}
287
251
  placement="bottom"
288
252
  >
289
- <CapRow className="button-disabled-tooltip-wrapper">
253
+ <div className="button-disabled-tooltip-wrapper">
290
254
  <CapButton
291
255
  onClick={() => saveCta(index)}
292
256
  disabled={ctaSaveDisabled(index)}
@@ -294,49 +258,36 @@ export const CapActionButton = (props) => {
294
258
  >
295
259
  {formatMessage(globalMessages.save)}
296
260
  </CapButton>
297
- </CapRow>
261
+ </div>
298
262
  </CapTooltip>
299
- {!hideDeleteForSuggestionIndex(index) && !cannotDeleteSavedMandatory(index) && (
300
- <CapButton
301
- onClick={() => deleteButtonHandler(index)}
302
- className="rcs-cta-delete-btn"
303
- type="secondary"
304
- >
305
- {formatMessage(globalMessages.delete)}
306
- </CapButton>
307
- )}
263
+ <CapButton
264
+ onClick={() => deleteButtonHandler(index)}
265
+ className="rcs-cta-delete-btn"
266
+ type="secondary"
267
+ >
268
+ {formatMessage(globalMessages.delete)}
269
+ </CapButton>
308
270
  </CapRow>
309
271
  </>
310
272
  )}
311
273
  {type === RCS_BUTTON_TYPES.CTA && (
312
274
  <>
313
- <CapRow className="rcs-cta-url-fields-row" gutter={8}>
314
- <CapColumn span={6} className="rcs-cta-url-type-col">
315
- <CapHeading type="h4" className="cta-label">
316
- {formatMessage(messages.ctaWebsiteType)}
317
- </CapHeading>
318
- <CapSelect
319
- id={`rcs-cta-url-type-${index}`}
320
- options={urlTypeSelectOptions}
321
- value={urlSubtype}
322
- onChange={(value) => onUrlSubtypeChange(value, index)}
323
- />
324
- </CapColumn>
325
- <CapColumn span={18} className="rcs-cta-url-value-col">
275
+ <CapRow>
276
+ <CapColumn span={24}>
326
277
  <CapHeading type="h4" className="cta-label">
327
- {formatMessage(messages.ctaUrlField)}
278
+ {formatMessage(messages.ctaWebsite)}
328
279
  </CapHeading>
329
280
  <CapInput
330
281
  id={index}
331
282
  className="rcs-cta-url"
332
283
  onChange={onUrlChange}
333
- placeholder={formatMessage(messages.ctaEnterUrlPlaceholder)}
334
- value={url || ''}
284
+ placeholder={formatMessage(messages.ctaStaticPlaceholder)}
285
+ value={url}
335
286
  size="large"
336
287
  maxLength={URL_MAX_LENGTH}
337
288
  errorMessage={urlError}
338
- suffix={renderInnerCharCount((url || '').length, URL_MAX_LENGTH)}
339
289
  />
290
+ {renderLength(url.length, URL_MAX_LENGTH)}
340
291
  </CapColumn>
341
292
  </CapRow>
342
293
  <CapRow useLegacy className="rcs-cta-save-delete-btn">
@@ -346,7 +297,7 @@ export const CapActionButton = (props) => {
346
297
  }
347
298
  placement="bottom"
348
299
  >
349
- <CapRow className="button-disabled-tooltip-wrapper">
300
+ <div className="button-disabled-tooltip-wrapper">
350
301
  <CapButton
351
302
  onClick={() => saveCta(index)}
352
303
  disabled={ctaSaveDisabled(index)}
@@ -354,17 +305,15 @@ export const CapActionButton = (props) => {
354
305
  >
355
306
  {formatMessage(globalMessages.save)}
356
307
  </CapButton>
357
- </CapRow>
308
+ </div>
358
309
  </CapTooltip>
359
- {!hideDeleteForSuggestionIndex(index) && !cannotDeleteSavedMandatory(index) && (
360
- <CapButton
361
- onClick={() => deleteButtonHandler(index)}
362
- className="rcs-cta-delete-btn"
363
- type="secondary"
364
- >
365
- {formatMessage(globalMessages.delete)}
366
- </CapButton>
367
- )}
310
+ <CapButton
311
+ onClick={() => deleteButtonHandler(index)}
312
+ className="rcs-cta-delete-btn"
313
+ type="secondary"
314
+ >
315
+ {formatMessage(globalMessages.delete)}
316
+ </CapButton>
368
317
  </CapRow>
369
318
  </>
370
319
  )}
@@ -374,7 +323,7 @@ export const CapActionButton = (props) => {
374
323
  title={ctaSaveDisabled(index) && formatMessage(messages.ctaSaveDisabled)}
375
324
  placement="bottom"
376
325
  >
377
- <CapRow className="button-disabled-tooltip-wrapper">
326
+ <div className="button-disabled-tooltip-wrapper">
378
327
  <CapButton
379
328
  onClick={() => saveCta(index)}
380
329
  disabled={ctaSaveDisabled(index)}
@@ -382,9 +331,9 @@ export const CapActionButton = (props) => {
382
331
  >
383
332
  {formatMessage(globalMessages.save)}
384
333
  </CapButton>
385
- </CapRow>
334
+ </div>
386
335
  </CapTooltip>
387
- {!(isHostIcs && index === 0) && !hideDeleteForSuggestionIndex(index) && !cannotDeleteSavedMandatory(index) && (
336
+ {index !== 0 && (
388
337
  <CapButton
389
338
  onClick={() => deleteButtonHandler(index)}
390
339
  className="rcs-cta-delete-btn"
@@ -395,12 +344,12 @@ export const CapActionButton = (props) => {
395
344
  )}
396
345
  </CapRow>
397
346
  )}
398
- </CapRow>
347
+ </div>
399
348
  );
400
349
  } else {
401
350
  const ctaIsPhone = type === RCS_BUTTON_TYPES.PHONE_NUMBER;
402
351
  const ctaIsReply = type === RCS_BUTTON_TYPES.QUICK_REPLY;
403
- suggestions?.length > 0 && renderArray?.push(
352
+ renderArray.push(
404
353
  <CapRow
405
354
  key={`cta-saved-${index}`}
406
355
  className="cap-rcs-saved-cta margin-t-12"
@@ -430,9 +379,7 @@ export const CapActionButton = (props) => {
430
379
  <>
431
380
  <CapColumn span={3}>
432
381
  <CapLabel className="url-type" type="label2">
433
- {(cta.urlType || RCS_CTA_URL_TYPE.STATIC) === RCS_CTA_URL_TYPE.DYNAMIC
434
- ? formatMessage(messages.ctaWebsiteTypeDynamic)
435
- : formatMessage(messages.ctaWebsiteTypeStatic)}
382
+ {formatMessage(messages.ctaWebsiteTypeStatic)}
436
383
  </CapLabel>
437
384
  </CapColumn>
438
385
  <CapRow type='flex' className="rcs-url-preview-wrapper">
@@ -453,7 +400,7 @@ export const CapActionButton = (props) => {
453
400
  >
454
401
  <CapIcon size="s" type="edit" />
455
402
  </CapColumn>
456
- {!(isHostIcs && index === 0) && !hideDeleteForSuggestionIndex(index) && !cannotDeleteSavedMandatory(index) && (
403
+ {index !== 0 && (
457
404
  <CapColumn className="rcs-saved-cta-delete-icon" span={1} onClick={() => deleteButtonHandler(index)}>
458
405
  <CapIcon size="s" type="delete" />
459
406
  </CapColumn>
@@ -465,7 +412,7 @@ export const CapActionButton = (props) => {
465
412
  }
466
413
  });
467
414
  {
468
- suggestions?.length < maxButtons &&
415
+ suggestions.length < maxButtons &&
469
416
  (isFullMode && !isEditFlow)
470
417
  && renderArray.push(
471
418
  <CapRow useLegacy>
@@ -475,7 +422,7 @@ export const CapActionButton = (props) => {
475
422
  }
476
423
  placement={'right'}
477
424
  >
478
- <CapRow className="button-disabled-tooltip-wrapper">
425
+ <div className="button-disabled-tooltip-wrapper">
479
426
  <CapButton
480
427
  type="flat"
481
428
  id="rcs-cta-add-button"
@@ -486,7 +433,7 @@ export const CapActionButton = (props) => {
486
433
  >
487
434
  {formatMessage(messages.addButton)}
488
435
  </CapButton>
489
- </CapRow>
436
+ </div>
490
437
  </CapTooltip>
491
438
  </CapRow>,
492
439
  );
@@ -499,8 +446,6 @@ export const CapActionButton = (props) => {
499
446
  CapActionButton.propTypes = {
500
447
  intl: intlShape.isRequired,
501
448
  updateButtonChange: PropTypes.func,
502
- minSavedSuggestions: PropTypes.number,
503
- hideDeleteSuggestionIndexes: PropTypes.arrayOf(PropTypes.number),
504
449
  suggestions: PropTypes.array,
505
450
  tags: PropTypes.array,
506
451
  injectedTags: PropTypes.object,
@@ -508,15 +453,12 @@ CapActionButton.propTypes = {
508
453
  selectedOfferDetails: PropTypes.array,
509
454
  onTagSelect: PropTypes.func,
510
455
  onContextChange: PropTypes.func,
511
- host: PropTypes.string,
512
456
  };
513
457
 
514
458
  CapActionButton.defaultProps = {
515
459
  buttonTextlen: 20,
516
460
  type: '',
517
461
  updateButtonChange: () => {},
518
- minSavedSuggestions: 0,
519
- hideDeleteSuggestionIndexes: [],
520
462
  suggestions: [],
521
463
  tags: [],
522
464
  injectedTags: {},
@@ -524,7 +466,6 @@ CapActionButton.defaultProps = {
524
466
  selectedOfferDetails: [],
525
467
  onTagSelect: () => {},
526
468
  onContextChange: () => {},
527
- host: '',
528
469
  };
529
470
 
530
471
  export default injectIntl(CapActionButton);
@@ -1,20 +1,7 @@
1
1
  @import '~@capillarytech/cap-ui-library/styles/_variables';
2
2
 
3
- // Horizontal RCS button type radios (Phone number | URL | Quick reply)
4
- .cap-rcs-cta-type-radio.cap-radio-group-v2 {
5
- display: flex;
6
- flex-wrap: wrap;
7
- align-items: center;
8
- margin-top: 0.5rem;
9
-
10
- .ant-radio-wrapper {
11
- margin-right: $CAP_SPACE_24;
12
- margin-bottom: 0;
13
-
14
- &:last-child {
15
- margin-right: 0;
16
- }
17
- }
3
+ #rcs-cta-type{
4
+ width: 90%;
18
5
  }
19
6
 
20
7
  .cap-rcs-saved-cta {
@@ -61,139 +48,9 @@
61
48
  }
62
49
  }
63
50
 
64
- // Button text / URL: count via CapInput `suffix` (antd affix, right-aligned inside field).
65
- // Phone: react-phone-input-2 overlay count + padding on .form-control
66
- .rcs-cta-inner-char-count {
67
- font-size: 0.75rem;
68
- line-height: 1.25rem;
69
- color: $FONT_COLOR_03;
70
- white-space: nowrap;
71
- }
72
-
73
- .rcs-cta-input-with-inner-count {
74
- position: relative;
75
- width: 100%;
76
-
77
- &--phone .rcs-cta-inner-char-count {
78
- position: absolute;
79
- right: 0.6875rem;
80
- top: 50%;
81
- transform: translateY(-50%);
82
- z-index: 2;
83
- pointer-events: none;
84
- }
85
- }
86
-
87
- // RCS phone field: Figma — one light border, 4px radius, ~antd Input large height, full width, count inside right
88
- .rcs-button-cta-create-container .rcs-cta-input-with-inner-count--phone {
89
- .react-tel-input.rcs-cta-phone-input {
90
- width: 100%;
91
- }
92
-
93
- .rcs-cta-phone-input .form-control {
94
- width: 100% !important;
95
- max-width: none;
96
- height: 2.5rem;
97
- min-height: 2.5rem;
98
- padding-top: 0;
99
- padding-bottom: 0;
100
- padding-left: 3rem;
101
- padding-right: 3.5rem;
102
- margin: 0;
103
- font-size: 0.875rem;
104
- line-height: 2.5rem;
105
- color: $CAP_G01;
106
- background: $CAP_WHITE;
107
- border: 1px solid $CAP_G06;
108
- border-radius: 0.25rem;
109
- box-shadow: none;
110
-
111
- &::placeholder {
112
- color: $CAP_G05;
113
- }
114
-
115
- &:hover {
116
- border-color: $CAP_G11;
117
- }
118
-
119
- &:focus {
120
- border-color: $CAP_G01;
121
- box-shadow: none;
122
- outline: none;
123
- }
124
- }
125
-
126
- .rcs-cta-phone-input .flag-dropdown {
127
- top: 0.0625rem;
128
- bottom: 0.0625rem;
129
- left: 0.0625rem;
130
- padding: 0;
131
- background: $CAP_WHITE;
132
- border: none;
133
- border-radius: 0.1875rem 0 0 0.1875rem; // inset from outer 4px radius
134
- }
135
-
136
- .rcs-cta-phone-input .flag-dropdown.open {
137
- border-radius: 0.1875rem 0 0 0;
138
- }
139
-
140
- .rcs-cta-phone-input .selected-flag {
141
- width: 2.75rem;
142
- padding: 0 0 0 0.5rem;
143
- background: transparent;
144
- border-radius: 0.1875rem 0 0 0.1875rem;
145
- }
146
-
147
- .rcs-cta-phone-input .selected-flag:hover,
148
- .rcs-cta-phone-input .selected-flag:focus {
149
- background: $CAP_G09;
150
- }
151
-
152
- .rcs-cta-phone-input .selected-flag .arrow {
153
- left: 1.375rem;
154
- border-top-color: $CAP_G04;
155
- }
156
- }
157
-
158
- // URL CTA: URL type (narrow) + URL field (~1:3) per Figma
159
- .rcs-cta-url-fields-row {
160
- .rcs-cta-url-type-col .ant-select {
161
- width: 100%;
162
- }
163
- }
164
-
165
- // RCS “create CTA” card: 0.5rem padding + gaps (Figma-tight; fixes excess space above first label)
166
- .rcs-button-cta-create-container.cap-row-v2 {
167
- display: flex;
168
- flex-direction: column;
169
- flex-wrap: nowrap;
170
- width: 100%;
171
- border: solid 1px $CAP_G06;
172
- padding: 1.25rem;
173
- border-radius: 0.25rem; // 4px — match .cap-rcs-saved-cta
174
-
175
- // Stack “Button type” (radios) above “Button text”
176
- .rcs-button-cta-create.cap-row-v2 {
177
- display: flex;
178
- flex-direction: column;
179
- flex-wrap: nowrap;
180
- margin: 0;
181
- }
182
-
183
- // Space after each field label (CapHeading margins are often zeroed by the library)
184
- .cta-label {
185
- margin-bottom: 0;
186
- margin-top: 0.75rem;
187
- }
188
-
189
- .cta-label + * {
190
- margin-top: 0.5rem;
191
- }
192
-
193
- // “Button type” heading has no .cta-label — keep same label→control gap as other fields
194
- .rcs-button-cta-create > .ant-col:first-of-type .cap-rcs-cta-type-radio {
195
- margin-top: 0.5rem;
196
- }
51
+ .rcs-button-cta-create-container {
52
+ border: solid 1px $CAP_G06;
53
+ padding: 10px;
197
54
  }
198
55
 
199
56
  .disabled {
@@ -207,12 +64,4 @@
207
64
 
208
65
  .button-disabled-tooltip-wrapper {
209
66
  display: inline-block;
210
- margin-top: 1.25rem;
211
- }
212
-
213
- // Space between Save and Delete on RCS / carousel CTA rows
214
- .rcs-cta-save-delete-btn {
215
- .rcs-cta-delete-btn {
216
- margin-left: 0.75rem;
217
- }
218
67
  }