@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.
- package/initialState.js +1 -0
- package/package.json +1 -1
- package/services/api.js +9 -10
- package/utils/transformerUtils.js +509 -0
- package/v2Components/CapWhatsappCTA/messages.js +0 -4
- package/v2Components/FormBuilder/index.js +7 -3
- package/v2Components/TemplatePreview/_templatePreview.scss +0 -9
- package/v2Components/TemplatePreview/index.js +104 -169
- package/v2Containers/Cap/actions.js +8 -0
- package/v2Containers/Cap/constants.js +4 -0
- package/v2Containers/Cap/reducer.js +6 -0
- package/v2Containers/Cap/sagas.js +23 -0
- package/v2Containers/Cap/selectors.js +6 -0
- package/v2Containers/Cap/tests/__snapshots__/index.test.js.snap +1 -0
- package/v2Containers/CreativesContainer/SlideBoxContent.js +11 -1
- package/v2Containers/CreativesContainer/constants.js +3 -0
- package/v2Containers/CreativesContainer/index.js +77 -88
- package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +25 -0
- package/v2Containers/CreativesContainer/tests/index.test.js +2 -0
- package/v2Containers/Email/index.js +1 -0
- package/v2Containers/EmailWrapper/index.js +2 -0
- package/v2Containers/MobilePush/Create/index.js +1 -0
- package/v2Containers/MobilePush/Edit/index.js +1 -0
- package/v2Containers/MobilepushWrapper/index.js +2 -1
- package/v2Containers/Sms/Create/index.js +1 -0
- package/v2Containers/Sms/Edit/index.js +1 -0
- package/v2Containers/SmsWrapper/index.js +2 -0
- package/v2Containers/Templates/_templates.scss +0 -35
- package/v2Containers/Templates/index.js +5 -64
- package/v2Containers/TemplatesV2/index.js +7 -0
- package/v2Containers/Whatsapp/constants.js +1 -83
- package/v2Containers/Whatsapp/index.js +182 -709
- package/v2Containers/Whatsapp/index.scss +1 -52
- package/v2Containers/Whatsapp/messages.js +2 -38
- package/v2Containers/Whatsapp/utils.js +0 -34
- package/v2Containers/mockdata.js +3 -0
- package/v2Components/CapWhatsappCarouselButton/constant.js +0 -51
- package/v2Components/CapWhatsappCarouselButton/index.js +0 -446
- package/v2Components/CapWhatsappCarouselButton/index.scss +0 -39
- package/v2Components/TemplatePreview/assets/images/empty_image_preview.svg +0 -4
- 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
|
|
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: '
|
|
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,
|
package/v2Containers/mockdata.js
CHANGED
|
@@ -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);
|