@capillarytech/creatives-library 8.0.87-alpha.2 → 8.0.87-alpha.20

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 (41) hide show
  1. package/initialState.js +1 -0
  2. package/package.json +1 -1
  3. package/services/api.js +9 -10
  4. package/utils/transformerUtils.js +509 -0
  5. package/v2Components/CapWhatsappCTA/messages.js +0 -4
  6. package/v2Components/FormBuilder/index.js +7 -3
  7. package/v2Components/TemplatePreview/_templatePreview.scss +0 -9
  8. package/v2Components/TemplatePreview/index.js +104 -169
  9. package/v2Containers/Cap/actions.js +8 -0
  10. package/v2Containers/Cap/constants.js +4 -0
  11. package/v2Containers/Cap/reducer.js +6 -0
  12. package/v2Containers/Cap/sagas.js +23 -0
  13. package/v2Containers/Cap/selectors.js +6 -0
  14. package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +1 -0
  15. package/v2Containers/CreativesContainer/SlideBoxContent.js +11 -1
  16. package/v2Containers/CreativesContainer/constants.js +3 -0
  17. package/v2Containers/CreativesContainer/index.js +77 -88
  18. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +25 -0
  19. package/v2Containers/CreativesContainer/tests/index.test.js +2 -0
  20. package/v2Containers/Email/index.js +1 -0
  21. package/v2Containers/EmailWrapper/index.js +2 -0
  22. package/v2Containers/MobilePush/Create/index.js +1 -0
  23. package/v2Containers/MobilePush/Edit/index.js +1 -0
  24. package/v2Containers/MobilepushWrapper/index.js +2 -1
  25. package/v2Containers/Sms/Create/index.js +1 -0
  26. package/v2Containers/Sms/Edit/index.js +1 -0
  27. package/v2Containers/SmsWrapper/index.js +2 -0
  28. package/v2Containers/Templates/_templates.scss +0 -35
  29. package/v2Containers/Templates/index.js +5 -64
  30. package/v2Containers/TemplatesV2/index.js +7 -0
  31. package/v2Containers/Whatsapp/constants.js +1 -83
  32. package/v2Containers/Whatsapp/index.js +182 -709
  33. package/v2Containers/Whatsapp/index.scss +1 -52
  34. package/v2Containers/Whatsapp/messages.js +2 -38
  35. package/v2Containers/Whatsapp/utils.js +0 -34
  36. package/v2Containers/mockdata.js +3 -0
  37. package/v2Components/CapWhatsappCarouselButton/constant.js +0 -51
  38. package/v2Components/CapWhatsappCarouselButton/index.js +0 -446
  39. package/v2Components/CapWhatsappCarouselButton/index.scss +0 -39
  40. package/v2Components/TemplatePreview/assets/images/empty_image_preview.svg +0 -4
  41. package/v2Components/TemplatePreview/assets/images/empty_video_preview.svg +0 -4
@@ -110,16 +110,7 @@
110
110
  width: 95%;
111
111
  }
112
112
 
113
- #select-whatsapp-category {
114
- padding-right: 5px;
115
- }
116
-
117
- #select-whatsapp-media {
118
- padding-left: 5px;
119
- }
120
-
121
113
  #select-whatsapp-category,
122
- #select-whatsapp-media,
123
114
  #select-whatsapp-language {
124
115
  width: 100%;
125
116
  }
@@ -258,52 +249,10 @@
258
249
  color: $CAP_G10;
259
250
  }
260
251
 
261
- .carousel-media-selection {
262
- display: flex;
263
- align-items: center;
264
- .carousel-media-selection-heading {
265
- margin-right: 20px;
266
- }
267
- }
268
-
269
- .whatsapp-carousel-tab {
270
- .ant-tabs-extra-content {
271
- padding: 0;
272
- line-height: normal;
273
- .add-carousel-content-button {
274
- padding: 9px 0px;
275
- margin: 0;
276
- }
277
- .cap-divider-v2{
278
- height: 1.5rem;
279
- margin-bottom: 7px;
280
- }
281
- }
282
- }
283
-
284
- .whatsapp-carousel-card {
285
- .ant-card-head {
286
- border-bottom: none;
287
- }
288
- .ant-card-body {
289
- padding-top: 0px;
290
- }
291
- .ant-card-head-wrapper {
292
- .ant-card-extra {
293
- .cap-button-v2 {
294
- padding: 0px;
295
- }
296
- }
297
- }
298
- }
299
-
300
- .whatsapp-carousel-message-heading {
301
- margin-top: $CAP_SPACE_24;
302
- }
303
252
  .template-status-font{
304
253
  font-weight: 500;
305
254
  }
306
255
 
307
256
  .template-status-margin{
308
257
  margin: $CAP_SPACE_04 0 $CAP_SPACE_04;
309
- }
258
+ }
@@ -110,13 +110,9 @@ export default defineMessages({
110
110
  id: `${prefix}.templateLanguageEnglish`,
111
111
  defaultMessage: 'English',
112
112
  },
113
- none: {
114
- id: `${prefix}.none`,
115
- defaultMessage: 'None',
116
- },
117
113
  mediaLabel: {
118
114
  id: `${prefix}.mediaLabel`,
119
- defaultMessage: 'Media type',
115
+ defaultMessage: 'Media',
120
116
  },
121
117
  mediaText: {
122
118
  id: `${prefix}.mediaText`,
@@ -134,17 +130,13 @@ export default defineMessages({
134
130
  id: `${prefix}.mediaDocument`,
135
131
  defaultMessage: 'Document',
136
132
  },
137
- mediaCarousel: {
138
- id: `${prefix}.mediaCarousel`,
139
- defaultMessage: 'Carousel',
140
- },
141
133
  disabledFeatureTooltip: {
142
134
  id: `${prefix}.disabledFeatureTooltip`,
143
135
  defaultMessage: 'Not yet enabled. Coming soon!',
144
136
  },
145
137
  templateMessageLabel: {
146
138
  id: `${prefix}.templateMessageLabel`,
147
- defaultMessage: 'Body text',
139
+ defaultMessage: 'Message',
148
140
  },
149
141
  templateMessageTooltip: {
150
142
  id: `${prefix}.templateMessageTooltip`,
@@ -737,34 +729,6 @@ export default defineMessages({
737
729
  id: `${prefix}.checkExpiryTooltipDesc`,
738
730
  defaultMessage: 'To check the configured expiry time that is same for all OTPs',
739
731
  },
740
- carouselMediaType: {
741
- id: `${prefix}.carouselMediaType`,
742
- defaultMessage: 'Carousel media type',
743
- },
744
- card: {
745
- id: `${prefix}.card`,
746
- defaultMessage: 'Card',
747
- },
748
- carouselCardBodyMessageLabel: {
749
- id: `${prefix}.carousleCardBodyMessageLabel`,
750
- defaultMessage: 'Card body text',
751
- },
752
- carouselCardBodyMessagePlaceholder: {
753
- id: `${prefix}.carouselCardBodyMessagePlaceholder`,
754
- defaultMessage: 'Enter card body text',
755
- },
756
- buttonType: {
757
- id: `${prefix}.buttonType`,
758
- defaultMessage: 'Button type',
759
- },
760
- emptyCardBodyeErrorMessage: {
761
- id: `${prefix}.emptyTemplateMessageErrorMessage`,
762
- defaultMessage: 'Card body text cannot be empty',
763
- },
764
- carouselButtonInfo: {
765
- id: `${prefix}.carouselButtonInfo`,
766
- defaultMessage: 'Number of buttons and their types setup in the first card will be same for all the other cards in the carousel',
767
- },
768
732
  pending: {
769
733
  id: `${prefix}.pending`,
770
734
  defaultMessage: 'Pending',
@@ -80,7 +80,6 @@ export const getWhatsappContent = (template, isPreview) => {
80
80
  header = '',
81
81
  footer = '',
82
82
  } = {},
83
- carouselData = [],
84
83
  } = {},
85
84
  } = {},
86
85
  } = {},
@@ -126,7 +125,6 @@ export const getWhatsappContent = (template, isPreview) => {
126
125
  quickReplyData: buttonsData
127
126
  }),
128
127
  ...mediaParams,
129
- carouselData,
130
128
  };
131
129
  };
132
130
 
@@ -190,38 +188,6 @@ export const getWhatsappQuickReply= (template, templatePreview) => {
190
188
  }
191
189
  return renderArray;
192
190
  }
193
-
194
- export const getWhatsappCarouselButtonView = (buttons, templatePreview) => {
195
- const renderArray = [];
196
- if (buttons?.length) {
197
- renderArray.push(<CapDivider className={templatePreview ? "whatsapp-divider" : "whatsapp-list-view-divider"} />);
198
- buttons.forEach((button, index) => {
199
- const { text, buttonType, type } = button || {};
200
- const currentButtonType = type || buttonType;
201
- if (text) {
202
- renderArray.push(
203
- <CapLabel
204
- type="label21"
205
- style={{ textAlign: 'center', marginTop: '12px' }}
206
- // className={templatePreview ? "whatsapp-cta-preview" : "whatsapp-list-quick-reply-preview"}
207
- >
208
- <CapIcon
209
- type={currentButtonType === PHONE_NUMBER ? 'call' : currentButtonType === QUICK_REPLY ? "small-link" : 'launch'}
210
- size="xs"
211
- svgProps={{ style: { marginRight: '4px' } }}
212
- />
213
- {text}
214
- </CapLabel>,
215
- );
216
- }
217
- if (index < buttons?.length - 1) {
218
- renderArray.push(<CapDivider className={templatePreview ? "whatsapp-divider" : "whatsapp-list-view-divider"} />);
219
- }
220
- });
221
- }
222
- return renderArray;
223
- };
224
-
225
191
  export const getWhatsappAutoFill = (template) => {
226
192
  const {category}= get(
227
193
  template,
@@ -2583,6 +2583,9 @@ export default {
2583
2583
  },
2584
2584
  demoVideoAndLinkJSONStatus: "SUCCESS",
2585
2585
  },
2586
+ loyaltyMetaData: {
2587
+ actionName: "SEND_COMMUNICATION_ACTION",
2588
+ },
2586
2589
  getWhatsappAutoFillData:
2587
2590
  < CapLabel
2588
2591
  className="whatsapp-autofill-btn"
@@ -1,51 +0,0 @@
1
- import React from 'react';
2
- import { FormattedMessage } from 'react-intl';
3
- import capWhatsappCTAMsg from '../CapWhatsappCTA/messages';
4
- import capWhatsappMsg from '../../v2Containers/Whatsapp/messages';
5
-
6
- export const PHONE_NUMBER = 'PHONE_NUMBER';
7
- export const URL = 'URL';
8
- export const QUICK_REPLY = 'QUICK_REPLY';
9
- export const STATIC_URL = 'STATIC_URL';
10
- export const BTN_MAX_LENGTH = 20;
11
- export const PHONE_NUMBER_MAX_LENGTH = 15;
12
- export const URL_MAX_LENGTH = 2000;
13
- export const carouselButtonOptions = [
14
- {
15
- value: PHONE_NUMBER,
16
- label: <FormattedMessage {...capWhatsappCTAMsg.ctaPhoneNo} />,
17
- },
18
- {
19
- value: URL,
20
- label: <FormattedMessage {...capWhatsappCTAMsg.url} />,
21
- },
22
- {
23
- value: QUICK_REPLY,
24
- label: <FormattedMessage {...capWhatsappMsg.btnTypeQuickReply} />,
25
- },
26
- ];
27
-
28
- export const INITIAL_CAROUSEL_PHONE_NUMBER_DATA = {
29
- buttonType: PHONE_NUMBER,
30
- text: '',
31
- phone_number: '',
32
- isSaved: false,
33
- textError: "",
34
- };
35
-
36
- export const INITIAL_CAROUSEL_URL_DATA = {
37
- buttonType: URL,
38
- text: '',
39
- urlType: STATIC_URL,
40
- url: '',
41
- isSaved: false,
42
- textError: "",
43
- urlError: "",
44
- };
45
-
46
- export const INITIAL_CAROUSEL_QUICK_REPLY_DATA = {
47
- text: "",
48
- buttonType: QUICK_REPLY,
49
- isSaved: false,
50
- textError: "",
51
- };
@@ -1,446 +0,0 @@
1
- import React, { useState } from "react";
2
- import { injectIntl } from "react-intl";
3
- import PhoneInput from 'react-phone-input-2';
4
- import { cloneDeep } from "lodash";
5
- import 'react-phone-input-2/lib/style.css';
6
- import CapRow from "@capillarytech/cap-ui-library/CapRow";
7
- import CapRadioGroup from "@capillarytech/cap-ui-library/CapRadioGroup";
8
- import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
9
- import CapColumn from "@capillarytech/cap-ui-library/CapColumn";
10
- import CapInput from "@capillarytech/cap-ui-library/CapInput";
11
- import CapHeading from "@capillarytech/cap-ui-library/CapHeading";
12
- import CapTooltipWithInfo from "@capillarytech/cap-ui-library/CapTooltipWithInfo";
13
- import CapSelect from "@capillarytech/cap-ui-library/CapSelect";
14
- import CapButton from "@capillarytech/cap-ui-library/CapButton";
15
- import CapTooltip from "@capillarytech/cap-ui-library/CapTooltip";
16
- import CapIcon from "@capillarytech/cap-ui-library/CapIcon";
17
- import { CAP_SPACE_04 } from "@capillarytech/cap-ui-library/styled/variables";
18
- import TagList from "../../v2Containers/TagList";
19
- import {
20
- carouselButtonOptions,
21
- INITIAL_CAROUSEL_PHONE_NUMBER_DATA,
22
- INITIAL_CAROUSEL_QUICK_REPLY_DATA,
23
- INITIAL_CAROUSEL_URL_DATA,
24
- PHONE_NUMBER,
25
- URL,
26
- BTN_MAX_LENGTH,
27
- PHONE_NUMBER_MAX_LENGTH,
28
- URL_MAX_LENGTH,
29
- QUICK_REPLY,
30
- } from "./constant";
31
- import capWhatsappMsg from '../../v2Containers/Whatsapp/messages';
32
- import capWhatsappCTAMsg from '../CapWhatsappCTA/messages';
33
- import {
34
- KARIX_GUPSHUP_URL_OPTIONS, TWILIO_URL_OPTIONS, DYNAMIC_URL, STATIC_URL,
35
- } from "../CapWhatsappCTA/constants";
36
- import globalMessages from '../../v2Containers/Cap/messages';
37
- import { isUrl, isValidText } from '../../v2Containers/Line/Container/Wrapper/utils';
38
- import { HOST_TWILIO } from "../../v2Containers/Whatsapp/constants";
39
- import "./index.scss";
40
-
41
- export const CapWhatsappCarouselButton = (props) => {
42
- const {
43
- intl,
44
- carouselData = [],
45
- setCarouselData,
46
- carouselIndex = 0,
47
- hostName = '',
48
- isEditFlow = false,
49
- tags = [],
50
- injectedTags = {},
51
- selectedOfferDetails = [],
52
- } = props;
53
- const { formatMessage } = intl;
54
- const buttonData = carouselData[carouselIndex]?.buttons || [];
55
- const invalidVarRegex = /{{(.*?)}}/g;
56
-
57
- const handleButtonType = ({ target: { value } }, buttonIndex) => {
58
- const cloneCarouselData = cloneDeep(carouselData);
59
- const dataMap = {
60
- [PHONE_NUMBER]: INITIAL_CAROUSEL_PHONE_NUMBER_DATA,
61
- [URL]: INITIAL_CAROUSEL_URL_DATA,
62
- [QUICK_REPLY]: INITIAL_CAROUSEL_QUICK_REPLY_DATA,
63
- };
64
-
65
- const updatedCarouselData = cloneCarouselData.map((carousel) => {
66
- carousel.buttons[buttonIndex] = dataMap[value] || dataMap.default;
67
- return carousel;
68
- });
69
-
70
- setCarouselData(updatedCarouselData);
71
- };
72
-
73
- const onValueChange = (buttonIndex, fields = []) => {
74
- const updatedButtonData = cloneDeep(buttonData);
75
- fields.forEach((field) => {
76
- updatedButtonData[buttonIndex][field.fieldName] = field.value;
77
- });
78
- setCarouselData(
79
- carouselData.map((item, index) => index === carouselIndex
80
- ? { ...item, buttons: updatedButtonData }
81
- : item)
82
- );
83
- };
84
-
85
- const onTagSelect = (data, index, url) => {
86
- onValueChange(index, [{fieldName: 'url', value: url.replace('{{1}}', `{{${data}}}`)}]);
87
- };
88
-
89
- const revertTagSelect = (index, url) => {
90
- onValueChange(index, [{fieldName: 'url', value: url.replace(invalidVarRegex, `{{1}}`)}]);
91
- };
92
-
93
- const renderLength = (len, max) => (
94
- <CapHeading type="label1" className="whatsapp-render-btn-length">
95
- {formatMessage(capWhatsappMsg.templateMessageLength, {
96
- currentLength: len,
97
- maxLength: max,
98
- })}
99
- </CapHeading>
100
- );
101
-
102
- const onUrlChange = ({ target }, urlType, buttonIndex) => {
103
- let { value } = target;
104
- if (urlType === DYNAMIC_URL) {
105
- value = value.replace(invalidVarRegex, '');
106
- value = `${value}{{1}}`;
107
- }
108
- let errorMessage = false;
109
- if (!isUrl(value)) {
110
- errorMessage = formatMessage(capWhatsappCTAMsg.ctaWebsiteUrlErrorMessage);
111
- } else if (
112
- urlType === STATIC_URL
113
- && value.match(invalidVarRegex)?.length > 0
114
- ) {
115
- errorMessage = formatMessage(capWhatsappCTAMsg.staticUrlWithVarErrorMessage);
116
- }
117
- onValueChange(buttonIndex, [{fieldName: 'url', value}, {fieldName: 'urlError', value: errorMessage}]);
118
- };
119
-
120
- const onButtonTextChange = (value, buttonIndex) => {
121
- let errorMessage = '';
122
- if (!isValidText(value)) {
123
- errorMessage = formatMessage(capWhatsappCTAMsg.ctaButtonErrorMessage);
124
- }
125
- onValueChange(buttonIndex, [{fieldName: 'text', value}, {fieldName: 'textError', value: errorMessage}]);
126
- };
127
-
128
- const ctaSaveDisabled = (index) => {
129
- const {
130
- buttonType, text, phone_number, url, textError, urlError,
131
- } = buttonData[index] || {};
132
- if (text === '' || textError) {
133
- return true;
134
- } if (buttonType === PHONE_NUMBER && phone_number.length < 5) {
135
- return true;
136
- } if (buttonType === URL && (url === '' || urlError)) {
137
- return true;
138
- }
139
- return false;
140
- };
141
-
142
- const handleSaveButton = (buttonIndex) => {
143
- onValueChange(buttonIndex, [{fieldName: 'isSaved', value: true}]);
144
- };
145
-
146
- const handleEditButton = (buttonIndex) => {
147
- onValueChange(buttonIndex, [{fieldName: 'isSaved', value: false}]);
148
- };
149
-
150
- const handleDeleteButton = (buttonIndex) => {
151
- setCarouselData((prevData) => prevData.map((carousel) => ({
152
- ...carousel,
153
- buttons: carousel.buttons.filter((_, index) => index !== buttonIndex),
154
- })));
155
- };
156
-
157
- const addCarouselButton = () => {
158
- setCarouselData(
159
- carouselData.map((item, index) => index === carouselIndex
160
- ? { ...item, buttons: [...buttonData, INITIAL_CAROUSEL_PHONE_NUMBER_DATA] }
161
- : item)
162
- );
163
- };
164
-
165
- const renderButtonContent = (buttonType, buttonIndex) => (
166
- <>
167
- <CapRow className="text-box-container">
168
- <CapColumn span={24}>
169
- {/* Button text */}
170
- <CapHeading type="h4" className="cta-label">
171
- {formatMessage(capWhatsappCTAMsg.ctaButtonText)}
172
- <CapTooltipWithInfo
173
- infoIconProps={{
174
- style: { marginLeft: CAP_SPACE_04 },
175
- }}
176
- autoAdjustOverflow
177
- placement="right"
178
- title={formatMessage(capWhatsappCTAMsg.ctaButtonTextTooltip)}
179
- />
180
- </CapHeading>
181
- <CapInput
182
- className="whatsapp-cta-button-text"
183
- onChange={({ target: { value } }) => onButtonTextChange(value, buttonIndex)}
184
- placeholder={formatMessage(capWhatsappCTAMsg.ctaButtonTextPlaceholder)}
185
- value={buttonData[buttonIndex].text}
186
- size="large"
187
- maxLength={BTN_MAX_LENGTH}
188
- errorMessage={buttonData[buttonIndex]?.textError}
189
- />
190
- {renderLength(buttonData[buttonIndex]?.text?.length, BTN_MAX_LENGTH)}
191
- </CapColumn>
192
- </CapRow>
193
- {buttonType === PHONE_NUMBER && (
194
- <CapRow className="text-box-container">
195
- <CapColumn span={24}>
196
- {/* phone number */}
197
- <CapHeading type="h4" className="cta-label">
198
- {formatMessage(capWhatsappCTAMsg.ctaPhoneNo)}
199
- </CapHeading>
200
- <PhoneInput
201
- placeholder={formatMessage(capWhatsappCTAMsg.ctaPhoneNoPlaceholder)}
202
- autoFormat={false}
203
- countryCodeEditable={false}
204
- value={buttonData[buttonIndex].phone_number}
205
- onChange={(value) => onValueChange(buttonIndex, [{fieldName: 'phone_number', value}])}
206
- country="in"
207
- className="cta-phone-number carousel-button-phone-number"
208
- />
209
- {renderLength(buttonData[buttonIndex]?.phone_number.length, PHONE_NUMBER_MAX_LENGTH)}
210
- </CapColumn>
211
- </CapRow>
212
- )}
213
- {buttonType === URL
214
- && (
215
- <CapRow className="text-box-container">
216
- <CapColumn span={6}>
217
- {/* URL Type */}
218
- <CapHeading type="h4" className="cta-label">
219
- {formatMessage(capWhatsappCTAMsg.ctaWebsiteType)}
220
- </CapHeading>
221
- <CapSelect
222
- id="whatsapp-carousel-button-url-type"
223
- options={
224
- hostName === HOST_TWILIO
225
- ? TWILIO_URL_OPTIONS
226
- : KARIX_GUPSHUP_URL_OPTIONS
227
- }
228
- onChange={(value) => onValueChange(buttonIndex, [{fieldName: 'urlType', value}])}
229
- value={buttonData[buttonIndex]?.urlType}
230
- />
231
- </CapColumn>
232
- <CapColumn span={18}>
233
- {/* cta url */}
234
- <CapHeading type="h4" className="cta-label">
235
- {formatMessage(capWhatsappCTAMsg.ctaWebsiteUrl)}
236
- {buttonData[buttonIndex]?.urlType === DYNAMIC_URL && (
237
- <CapTooltipWithInfo
238
- infoIconProps={{
239
- style: { marginLeft: CAP_SPACE_04 },
240
- }}
241
- autoAdjustOverflow
242
- placement="right"
243
- title={formatMessage(capWhatsappCTAMsg.dynamicUrlTooltip, { one: '{{1}}' })}
244
- />
245
- )}
246
- </CapHeading>
247
- <CapInput
248
- className="whatsapp-cta-url"
249
- onChange={(event) => onUrlChange(event, buttonData[buttonIndex]?.urlType, buttonIndex)}
250
- placeholder={
251
- buttonData[buttonIndex]?.urlType === DYNAMIC_URL
252
- ? formatMessage(capWhatsappCTAMsg.ctaDynamicPlaceholder)
253
- : formatMessage(capWhatsappCTAMsg.ctaStaticPlaceholder)
254
- }
255
- value={buttonData[buttonIndex]?.url}
256
- size="large"
257
- maxLength={URL_MAX_LENGTH}
258
- errorMessage={buttonData[buttonIndex]?.urlError || ''}
259
- />
260
- {renderLength(buttonData[buttonIndex]?.url?.length, URL_MAX_LENGTH)}
261
- </CapColumn>
262
- </CapRow>
263
- )
264
- }
265
- {/* it render save and delete button */}
266
- <CapRow className="whatsapp-cta-save-delete-btn whatsapp-carousel-save-edit-btn">
267
- <CapTooltip
268
- title={
269
- ctaSaveDisabled(buttonIndex)
270
- && formatMessage(capWhatsappCTAMsg.ctaSaveDisabled)
271
- }
272
- placement="bottom"
273
- >
274
- <div className="button-disabled-tooltip-wrapper">
275
- <CapButton
276
- onClick={() => {
277
- handleSaveButton(buttonIndex);
278
- }}
279
- disabled={ctaSaveDisabled(buttonIndex)}
280
- className="whatsapp-cta-save-btn"
281
- >
282
- {formatMessage(globalMessages.save)}
283
- </CapButton>
284
- {buttonData.length > 1 && buttonIndex > 0 && parseInt(carouselIndex) === 0 && (
285
- <CapButton
286
- onClick={() => {
287
- handleDeleteButton(buttonIndex);
288
- }}
289
- className="whatsapp-cta-delete-btn whatsapp-carousel-delete-button"
290
- type="secondary"
291
- >
292
- {formatMessage(globalMessages.delete)}
293
- </CapButton>
294
- )}
295
- </div>
296
- </CapTooltip>
297
- </CapRow>
298
- </>
299
- );
300
-
301
- const isCarouselAddButtonDisable = buttonData?.length === 1 && !buttonData?.[0]?.isSaved;
302
-
303
- return (
304
- <CapRow>
305
- {buttonData.map((button, index) => {
306
- const isPhoneNumberType = button?.buttonType === PHONE_NUMBER;
307
- const isURLtype = button?.buttonType === URL;
308
- if (button.isSaved || isEditFlow) {
309
- return (
310
- <CapRow
311
- key={`${button.buttonType}_${index}`}
312
- className="cap-whatsapp-saved-cta cap-whatsapp-saved-carousel-button margin-t-12"
313
- align="middle"
314
- type="flex"
315
- style={{ marginLeft: isEditFlow ? 0 : '' }}
316
- >
317
- <CapColumn
318
- span={1}
319
- className={`${isPhoneNumberType ? 'whatsapp-saved-cta-phone-icon' : ''}`}
320
- >
321
- <CapIcon size="s" type={isPhoneNumberType ? 'call' : isURLtype ? 'launch' : 'six-dots'} />
322
- </CapColumn>
323
- <CapColumn span={6}>
324
- <CapLabel
325
- type="label2"
326
- className="whatsapp-saved-cta-button-text"
327
- >
328
- {button?.text}
329
- </CapLabel>
330
- </CapColumn>
331
- {isPhoneNumberType && (
332
- <CapColumn span={10} align="left">
333
- <CapLabel className="phone">
334
- {button?.phone_number}
335
- </CapLabel>
336
- </CapColumn>
337
- )}
338
- {isURLtype && (
339
- <>
340
- <CapColumn span={3}>
341
- <CapLabel className="url-type" type="label2">
342
- {button?.urlType === STATIC_URL
343
- ? formatMessage(capWhatsappCTAMsg.ctaWebsiteTypeStatic)
344
- : formatMessage(capWhatsappCTAMsg.ctaWebsiteTypeDynamic)}
345
- </CapLabel>
346
- </CapColumn>
347
- <CapTooltip title={button?.url} placement="top">
348
- <CapColumn span={7} style={{ marginRight: '0px' }}>
349
- <CapLabel className="url">{button?.url}</CapLabel>
350
- </CapColumn>
351
- </CapTooltip>
352
- </>
353
- )}
354
- {!isEditFlow && (
355
- <>
356
- <CapColumn
357
- span={1}
358
- className="whatsapp-saved-cta-edit-icon"
359
- onClick={() => handleEditButton(index)}
360
- >
361
- <CapIcon size="s" type="edit" />
362
- </CapColumn>
363
- {parseInt(carouselIndex) === 0 && (
364
- <CapColumn span={1}>
365
- <CapButton type="flat" className="whatsapp-carousel-delete-icon-btn" onClick={() => handleDeleteButton(index)} disabled={buttonData?.length === 1}>
366
- <CapIcon size="s" type="delete" />
367
- </CapButton>
368
- </CapColumn>
369
- )}
370
- </>
371
- )}
372
- {isEditFlow && button?.urlType === DYNAMIC_URL && button?.url.includes('{{1}}') && (
373
- <CapColumn>
374
- <TagList
375
- className="whatsapp-cta-taglist"
376
- label={formatMessage(capWhatsappCTAMsg.whatsappCtaTagListLabel)}
377
- onTagSelect={(data) => onTagSelect(data, index, button?.url)}
378
- tags={tags}
379
- injectedTags={injectedTags}
380
- selectedOfferDetails={selectedOfferDetails}
381
- />
382
- </CapColumn>
383
- )}
384
- {isEditFlow && button?.urlType === DYNAMIC_URL && !button?.url.includes('{{1}}') && (
385
- <CapColumn
386
- span={1}
387
- onClick={() => revertTagSelect(index, button?.url)}
388
- className="whatsapp-cta-tag-revert"
389
- >
390
- <CapTooltip
391
- title={formatMessage(capWhatsappCTAMsg.whatsappCtaTagListRevert)}
392
- placement="top"
393
- >
394
- <CapIcon size="s" type="return" />
395
- </CapTooltip>
396
- </CapColumn>
397
- )}
398
- </CapRow>
399
- );
400
- } return (
401
- <CapRow
402
- key={`${button.buttonType}_${index}`}
403
- className="cap-whatsapp-carousel-button"
404
- >
405
- <CapLabel type="label16" className="button-type-heading">{formatMessage(capWhatsappMsg.buttonType)}</CapLabel>
406
- <CapRadioGroup
407
- id="carousel-button-radio"
408
- options={carouselButtonOptions}
409
- value={button.buttonType}
410
- onChange={(e) => handleButtonType(e, index)}
411
- className="whatsapp-media-radio"
412
- />
413
- {renderButtonContent(button.buttonType, index)}
414
- </CapRow>
415
- );
416
- })}
417
- <CapRow>
418
- {buttonData?.length < 2 && !isEditFlow && parseInt(carouselIndex) === 0 && (
419
- <CapRow>
420
- <CapTooltip
421
- title={
422
- isCarouselAddButtonDisable ? formatMessage(capWhatsappCTAMsg.ctaAddDisabled) : ""
423
- }
424
- placement="right"
425
- >
426
- <div className="button-disabled-tooltip-wrapper">
427
- <CapButton
428
- type="flat"
429
- id="whatsapp-quick-reply-add-button"
430
- disabled={isCarouselAddButtonDisable}
431
- className="margin-t-12 margin-l-24"
432
- isAddBtn
433
- onClick={addCarouselButton}
434
- >
435
- {formatMessage(capWhatsappCTAMsg.addButton)}
436
- </CapButton>
437
- </div>
438
- </CapTooltip>
439
- </CapRow>
440
- )}
441
- </CapRow>
442
- </CapRow>
443
- );
444
- };
445
-
446
- export default injectIntl(CapWhatsappCarouselButton);