@capillarytech/creatives-library 8.0.90-alpha.0 → 8.0.91
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/package.json +1 -1
- package/services/api.js +7 -1
- package/services/tests/api.test.js +5 -1
- package/v2Components/CapImageUpload/index.js +13 -10
- package/v2Components/CapVideoUpload/index.js +12 -9
- package/v2Components/CapWhatsappCTA/messages.js +4 -0
- package/v2Components/CapWhatsappCarouselButton/constant.js +56 -0
- package/v2Components/CapWhatsappCarouselButton/index.js +446 -0
- package/v2Components/CapWhatsappCarouselButton/index.scss +39 -0
- package/v2Components/CapWhatsappCarouselButton/tests/index.test.js +237 -0
- package/v2Components/TemplatePreview/_templatePreview.scss +9 -0
- package/v2Components/TemplatePreview/assets/images/empty_image_preview.svg +4 -0
- package/v2Components/TemplatePreview/assets/images/empty_video_preview.svg +4 -0
- package/v2Components/TemplatePreview/index.js +171 -105
- package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +6 -6
- package/v2Containers/CreativesContainer/index.js +91 -4
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +1 -0
- package/v2Containers/Templates/_templates.scss +47 -0
- package/v2Containers/Templates/index.js +55 -5
- package/v2Containers/Templates/tests/__snapshots__/index.test.js.snap +177 -156
- package/v2Containers/Whatsapp/constants.js +87 -1
- package/v2Containers/Whatsapp/index.js +707 -189
- package/v2Containers/Whatsapp/index.scss +52 -1
- package/v2Containers/Whatsapp/messages.js +38 -2
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +30183 -90694
- package/v2Containers/Whatsapp/tests/__snapshots__/utils.test.js.snap +6 -0
- package/v2Containers/Whatsapp/tests/utils.test.js +80 -1
- package/v2Containers/Whatsapp/utils.js +34 -0
- package/v2Containers/Zalo/index.scss +1 -1
- package/v2Containers/mockdata.js +2 -0
package/package.json
CHANGED
package/services/api.js
CHANGED
|
@@ -524,7 +524,13 @@ export const checkBulkDuplicates = (data) => {
|
|
|
524
524
|
export const createWhatsappTemplate = ({payload, gupshupMediaFile }) => {
|
|
525
525
|
const data = new FormData();
|
|
526
526
|
data.append('payload', JSON.stringify(payload));
|
|
527
|
-
|
|
527
|
+
if (Array.isArray(gupshupMediaFile) && gupshupMediaFile?.length) {
|
|
528
|
+
gupshupMediaFile.forEach((file, index) => {
|
|
529
|
+
data.append(`gupshupMediaFile_${index}`, file);
|
|
530
|
+
});
|
|
531
|
+
} else {
|
|
532
|
+
data.append('gupshupMediaFile', gupshupMediaFile);
|
|
533
|
+
}
|
|
528
534
|
const url = `${API_ENDPOINT}/templates/WHATSAPP`;
|
|
529
535
|
return request(url, getAPICallObject('POST', data, true));
|
|
530
536
|
};
|
|
@@ -86,7 +86,11 @@ describe('uploadFile -- whatsapp image upload', () => {
|
|
|
86
86
|
describe('createWhatsappTemplate -- Test with valid responses', () => {
|
|
87
87
|
it('Should return correct response', () =>
|
|
88
88
|
expect(
|
|
89
|
-
createWhatsappTemplate(sampleFile, mockData.createWhatsappPayload),
|
|
89
|
+
createWhatsappTemplate({gupshupMediaFile: [sampleFile], payload: mockData.createWhatsappPayload}),
|
|
90
|
+
).toEqual(Promise.resolve()));
|
|
91
|
+
it('Should return correct response when single file is present', () =>
|
|
92
|
+
expect(
|
|
93
|
+
createWhatsappTemplate({gupshupMediaFile: sampleFile, payload: mockData.createWhatsappPayload}),
|
|
90
94
|
).toEqual(Promise.resolve()));
|
|
91
95
|
});
|
|
92
96
|
|
|
@@ -44,6 +44,7 @@ function CapImageUpload(props) {
|
|
|
44
44
|
imageData,
|
|
45
45
|
channel,
|
|
46
46
|
channelSpecificStyle,
|
|
47
|
+
showReUploadButton = true,
|
|
47
48
|
} = props;
|
|
48
49
|
const {
|
|
49
50
|
formatMessage,
|
|
@@ -224,16 +225,18 @@ function CapImageUpload(props) {
|
|
|
224
225
|
</>
|
|
225
226
|
);
|
|
226
227
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
228
|
+
if (showReUploadButton) {
|
|
229
|
+
return (
|
|
230
|
+
<CapButton
|
|
231
|
+
className="dragger-button re-upload"
|
|
232
|
+
type="flat"
|
|
233
|
+
onClick={onReUpload}
|
|
234
|
+
style={channelSpecificStyle ? { marginTop: '-16px'} : {}}
|
|
235
|
+
>
|
|
236
|
+
<FormattedMessage {...messages.imageReUpload} />
|
|
237
|
+
</CapButton>
|
|
238
|
+
);
|
|
239
|
+
}
|
|
237
240
|
}, [isImageError, imageSrc]);
|
|
238
241
|
|
|
239
242
|
return (
|
|
@@ -39,6 +39,7 @@ function CapVideoUpload(props) {
|
|
|
39
39
|
errorMessage,
|
|
40
40
|
showVideoNameAndDuration = true,
|
|
41
41
|
formClassName = 'video-form',
|
|
42
|
+
showReUploadButton = true,
|
|
42
43
|
} = props;
|
|
43
44
|
const [isVideoError, updateVideoErrorMessage] = useState(false);
|
|
44
45
|
const [isVideo, updateVideoStatus] = useState(false);
|
|
@@ -246,15 +247,17 @@ function CapVideoUpload(props) {
|
|
|
246
247
|
const videoDurationValue = moment('1900-01-01 00:00:00').add(videoDuration, 'seconds').format("HH.mm.ss"); // to get the duration of video
|
|
247
248
|
return (
|
|
248
249
|
<Fragment key={videoSrc}>
|
|
249
|
-
|
|
250
|
-
<
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
250
|
+
{showReUploadButton && (
|
|
251
|
+
<div style={{ overflow: 'hidden' }}>
|
|
252
|
+
<CapButton
|
|
253
|
+
className="dragger-button video-reupload"
|
|
254
|
+
type="flat"
|
|
255
|
+
onClick={onReUpload}
|
|
256
|
+
>
|
|
257
|
+
<FormattedMessage {...messages.imageReUpload} />
|
|
258
|
+
</CapButton>
|
|
259
|
+
</div>
|
|
260
|
+
)}
|
|
258
261
|
<div className={showVideoNameAndDuration ? 'video-panel' : 'video-panel-wp'}>
|
|
259
262
|
<video
|
|
260
263
|
width="230"
|
|
@@ -0,0 +1,56 @@
|
|
|
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 = (carouselIndex) => {
|
|
14
|
+
return [
|
|
15
|
+
{
|
|
16
|
+
value: PHONE_NUMBER,
|
|
17
|
+
label: <FormattedMessage {...capWhatsappCTAMsg.ctaPhoneNo} />,
|
|
18
|
+
disabled: carouselIndex > 0,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
value: URL,
|
|
22
|
+
label: <FormattedMessage {...capWhatsappCTAMsg.url} />,
|
|
23
|
+
disabled: carouselIndex > 0,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
value: QUICK_REPLY,
|
|
27
|
+
label: <FormattedMessage {...capWhatsappMsg.btnTypeQuickReply} />,
|
|
28
|
+
disabled: carouselIndex > 0,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export const INITIAL_CAROUSEL_PHONE_NUMBER_DATA = {
|
|
34
|
+
buttonType: PHONE_NUMBER,
|
|
35
|
+
text: '',
|
|
36
|
+
phone_number: '',
|
|
37
|
+
isSaved: false,
|
|
38
|
+
textError: "",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const INITIAL_CAROUSEL_URL_DATA = {
|
|
42
|
+
buttonType: URL,
|
|
43
|
+
text: '',
|
|
44
|
+
urlType: STATIC_URL,
|
|
45
|
+
url: '',
|
|
46
|
+
isSaved: false,
|
|
47
|
+
textError: "",
|
|
48
|
+
urlError: "",
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const INITIAL_CAROUSEL_QUICK_REPLY_DATA = {
|
|
52
|
+
text: "",
|
|
53
|
+
buttonType: QUICK_REPLY,
|
|
54
|
+
isSaved: false,
|
|
55
|
+
textError: "",
|
|
56
|
+
};
|
|
@@ -0,0 +1,446 @@
|
|
|
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] || {};
|
|
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, 10) === 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, 10) === 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(carouselIndex)}
|
|
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, 10) === 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);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
@import "~@capillarytech/cap-ui-library/styles/_variables";
|
|
2
|
+
|
|
3
|
+
.cap-whatsapp-carousel-button {
|
|
4
|
+
border: solid 0.063rem $CAP_G06;
|
|
5
|
+
padding: $CAP_SPACE_24;
|
|
6
|
+
border-radius: 0.285rem;
|
|
7
|
+
margin-top: $CAP_SPACE_12;
|
|
8
|
+
.button-type-heading {
|
|
9
|
+
margin-bottom: $CAP_SPACE_12;
|
|
10
|
+
}
|
|
11
|
+
.carousel-button-phone-number {
|
|
12
|
+
.form-control {
|
|
13
|
+
width: 100%;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
.text-box-container {
|
|
17
|
+
margin-top: $CAP_SPACE_16;
|
|
18
|
+
}
|
|
19
|
+
#whatsapp-carousel-button-url-type {
|
|
20
|
+
width: 90%;
|
|
21
|
+
}
|
|
22
|
+
.whatsapp-carousel-save-edit-btn {
|
|
23
|
+
margin-top: $CAP_SPACE_24;
|
|
24
|
+
}
|
|
25
|
+
.whatsapp-carousel-delete-button {
|
|
26
|
+
margin-left: $CAP_SPACE_12;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.cap-whatsapp-saved-carousel-button {
|
|
31
|
+
width: 100%;
|
|
32
|
+
margin-left: 0;
|
|
33
|
+
margin-top: $CAP_SPACE_12;
|
|
34
|
+
.whatsapp-carousel-delete-icon-btn {
|
|
35
|
+
padding: 0;
|
|
36
|
+
margin: 0;
|
|
37
|
+
height: auto;
|
|
38
|
+
}
|
|
39
|
+
}
|