@capillarytech/creatives-library 7.17.118 → 7.17.120-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/tests/integration/TemplateCreation/TemplateCreation.integration.test.js +16 -12
- package/v2Components/CapImageUpload/constants.js +6 -0
- package/v2Components/CapImageUpload/index.js +16 -17
- package/v2Components/CapImageUpload/index.scss +3 -0
- package/v2Components/CapImageUpload/messages.js +3 -7
- package/v2Components/CapVideoUpload/constants.js +6 -0
- package/v2Components/CapVideoUpload/index.js +46 -20
- package/v2Components/CapVideoUpload/index.scss +4 -1
- package/v2Components/CapVideoUpload/messages.js +10 -6
- package/v2Components/FormBuilder/constants.js +0 -2
- package/v2Components/FormBuilder/index.js +28 -4
- package/v2Components/TemplatePreview/_templatePreview.scss +21 -0
- package/v2Components/TemplatePreview/index.js +56 -45
- package/v2Containers/CreativesContainer/SlideBoxContent.js +10 -4
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +1 -0
- package/v2Containers/CreativesContainer/messages.js +4 -0
- package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +11 -0
- package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +225 -0
- package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +40 -25
- package/v2Containers/Templates/_templates.scss +9 -4
- package/v2Containers/Templates/index.js +29 -8
- package/v2Containers/Viber/constants.js +58 -0
- package/v2Containers/Viber/index.js +402 -421
- package/v2Containers/Viber/index.scss +113 -0
- package/v2Containers/Viber/messages.js +68 -0
- package/v2Containers/Viber/style.js +20 -0
- package/v2Containers/Viber/tests/index.test.js +297 -0
- package/v2Containers/Viber/tests/mockData.js +134 -0
package/package.json
CHANGED
|
@@ -273,12 +273,8 @@ describe("Creatives testing template creation", () => {
|
|
|
273
273
|
fireEvent.change(templateNameInput, {
|
|
274
274
|
target: { value: 'viber_test_template' },
|
|
275
275
|
});
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
/Text message/,
|
|
279
|
-
{},
|
|
280
|
-
);
|
|
281
|
-
const msgBox = templateTextInput.parentElement.nextSibling.firstChild;
|
|
276
|
+
const msgBox = screen.getByPlaceholderText(/Enter message/i);
|
|
277
|
+
msgBox.focus();
|
|
282
278
|
//Enter a template text message
|
|
283
279
|
fireEvent.change(msgBox, {
|
|
284
280
|
target: { value: 'viber_template_message' },
|
|
@@ -306,24 +302,32 @@ describe("Creatives testing template creation", () => {
|
|
|
306
302
|
// first click opens the popup, and second click closes it, clicking twice is intentional
|
|
307
303
|
userEvent.click(addLabel);
|
|
308
304
|
userEvent.click(addLabel);
|
|
305
|
+
const imageRadio = creativesScreen.getByRole('radio', {name: /image/i});
|
|
306
|
+
fireEvent.click(imageRadio);
|
|
309
307
|
const imageUploader = creativesScreen.getByRole('button', {
|
|
310
|
-
name: /drag and drop image here or
|
|
308
|
+
name: /drag and drop image here or select from computer gallery/i,
|
|
311
309
|
});
|
|
312
310
|
expect(within(imageUploader).getByRole('button', {
|
|
313
|
-
name: /
|
|
311
|
+
name: /select from computer/i,
|
|
314
312
|
})).toBeInTheDocument();
|
|
315
313
|
const galleryBtn = within(imageUploader).getByRole('button', {
|
|
316
314
|
name: globalMessages.gallery.defaultMessage,
|
|
317
315
|
});
|
|
318
316
|
|
|
319
317
|
//configuring CTA button
|
|
320
|
-
const
|
|
321
|
-
|
|
318
|
+
const ctaRadioBtn = creativesScreen.getByRole('radio', {
|
|
319
|
+
name: /call to action create a button that lets customers respond to your messages or take action/i,
|
|
320
|
+
});
|
|
321
|
+
fireEvent.click(ctaRadioBtn);
|
|
322
|
+
const btnTextBox = await creativesScreen.findByPlaceholderText(
|
|
323
|
+
'Enter button text',
|
|
324
|
+
);
|
|
322
325
|
fireEvent.change(btnTextBox, {
|
|
323
326
|
target: { value: 'button' },
|
|
324
327
|
});
|
|
325
|
-
const
|
|
326
|
-
|
|
328
|
+
const btnUrlBox = await creativesScreen.findByPlaceholderText(
|
|
329
|
+
'Enter button url',
|
|
330
|
+
);
|
|
327
331
|
fireEvent.change(btnUrlBox, {
|
|
328
332
|
target: { value: 'button' },
|
|
329
333
|
});
|
|
@@ -20,7 +20,8 @@ import { injectIntl, FormattedMessage, intlShape} from 'react-intl';
|
|
|
20
20
|
import { isEmpty, get } from 'lodash';
|
|
21
21
|
import './index.scss';
|
|
22
22
|
import Gallery from '../../v2Containers/Assets/Gallery';
|
|
23
|
-
import {
|
|
23
|
+
import { MAX_SUPPORTED_IMAGE_SIZE } from './constants';
|
|
24
|
+
import { FACEBOOK, INAPP, RCS, WHATSAPP, VIBER } from "../../v2Containers/CreativesContainer/constants";
|
|
24
25
|
|
|
25
26
|
import messages from './messages';
|
|
26
27
|
function CapImageUpload(props) {
|
|
@@ -173,12 +174,23 @@ function CapImageUpload(props) {
|
|
|
173
174
|
);
|
|
174
175
|
}, []);
|
|
175
176
|
|
|
177
|
+
const getImageSizeLabel = () => (
|
|
178
|
+
<CapHeadingSpan type="label2">
|
|
179
|
+
<FormattedMessage
|
|
180
|
+
{...messages.channelImageSize}
|
|
181
|
+
values={{
|
|
182
|
+
size: MAX_SUPPORTED_IMAGE_SIZE[channel],
|
|
183
|
+
}}
|
|
184
|
+
/>
|
|
185
|
+
</CapHeadingSpan>
|
|
186
|
+
);
|
|
187
|
+
|
|
176
188
|
const getImageSection = useCallback(() => {
|
|
177
189
|
if (imageSrc === "") {
|
|
178
190
|
return (<>
|
|
179
191
|
<CapUploader.CapDragger
|
|
180
192
|
customRequest={capUploaderCustomRequest}
|
|
181
|
-
className="form-builder-dragger"
|
|
193
|
+
className="form-builder-dragger grey-background"
|
|
182
194
|
showUploadList={!isImageError}
|
|
183
195
|
>
|
|
184
196
|
<CapHeading className="dragger-title" type="h7">
|
|
@@ -244,9 +256,7 @@ function CapImageUpload(props) {
|
|
|
244
256
|
<div className="image-info-wrapper">
|
|
245
257
|
{channel === WHATSAPP && (
|
|
246
258
|
<>
|
|
247
|
-
|
|
248
|
-
<FormattedMessage {...messages.maxImageSize} />
|
|
249
|
-
</CapHeadingSpan>
|
|
259
|
+
{getImageSizeLabel()}
|
|
250
260
|
<CapHeadingSpan type="label2">
|
|
251
261
|
<FormattedMessage {...messages.whatsappAspectRatio} />
|
|
252
262
|
</CapHeadingSpan>
|
|
@@ -262,18 +272,7 @@ function CapImageUpload(props) {
|
|
|
262
272
|
<FormattedMessage {...messages.aspectRatio} />
|
|
263
273
|
</CapHeadingSpan>
|
|
264
274
|
)}
|
|
265
|
-
{
|
|
266
|
-
<CapHeadingSpan type="label2" className="image-size">
|
|
267
|
-
<FormattedMessage {...messages.imageSize} />
|
|
268
|
-
</CapHeadingSpan>
|
|
269
|
-
)}
|
|
270
|
-
{
|
|
271
|
-
channel === INAPP && (
|
|
272
|
-
<CapHeadingSpan type="label2" className="image-size">
|
|
273
|
-
<FormattedMessage {...messages.maxImageSize} />
|
|
274
|
-
</CapHeadingSpan>
|
|
275
|
-
)
|
|
276
|
-
}
|
|
275
|
+
{[RCS, VIBER, INAPP].includes(channel) && getImageSizeLabel()}
|
|
277
276
|
<CapHeadingSpan type="label2" className="image-format">
|
|
278
277
|
{channel === INAPP ? <FormattedMessage {...messages.format2} /> : <FormattedMessage {...messages.format} />}
|
|
279
278
|
</CapHeadingSpan>
|
|
@@ -2,10 +2,6 @@ import { defineMessages } from 'react-intl';
|
|
|
2
2
|
const scope = `creatives.componentsV2.CapImageUpload`;
|
|
3
3
|
|
|
4
4
|
export default defineMessages({
|
|
5
|
-
maxImageSize: {
|
|
6
|
-
id: `${scope}.maxImageSize`,
|
|
7
|
-
defaultMessage: 'Size upto: 5MB',
|
|
8
|
-
},
|
|
9
5
|
whatsappAspectRatio: {
|
|
10
6
|
id: `${scope}.whatsappAspectRatio`,
|
|
11
7
|
defaultMessage: 'Max aspect ratio: 1.91:1',
|
|
@@ -59,8 +55,8 @@ export default defineMessages({
|
|
|
59
55
|
id: `${scope}.aspectRatio`,
|
|
60
56
|
defaultMessage: 'Aspect ratio: 1:1',
|
|
61
57
|
},
|
|
62
|
-
|
|
63
|
-
id: `${scope}.
|
|
64
|
-
defaultMessage: 'Size upto:
|
|
58
|
+
channelImageSize: {
|
|
59
|
+
id: `${scope}.channelImageSize`,
|
|
60
|
+
defaultMessage: 'Size upto: {size}MB',
|
|
65
61
|
},
|
|
66
62
|
});
|
|
@@ -19,8 +19,9 @@ import {
|
|
|
19
19
|
} from '@capillarytech/cap-ui-library';
|
|
20
20
|
import messages from './messages';
|
|
21
21
|
import {bytes2Size, getDecodedFileName} from '../../utils/common';
|
|
22
|
-
import { WHATSAPP } from './constants';
|
|
22
|
+
import { SUPPORTED_FILE_FORMATS, WHATSAPP, DEFAULT, VIBER_MAX_DURATION } from './constants';
|
|
23
23
|
import './index.scss';
|
|
24
|
+
import { VIBER } from '../../v2Containers/CreativesContainer/constants';
|
|
24
25
|
|
|
25
26
|
function CapVideoUpload(props) {
|
|
26
27
|
const {
|
|
@@ -41,7 +42,7 @@ function CapVideoUpload(props) {
|
|
|
41
42
|
} = props;
|
|
42
43
|
const [isVideoError, updateVideoErrorMessage] = useState(false);
|
|
43
44
|
const [isVideo, updateVideoStatus] = useState(false);
|
|
44
|
-
const [videoDuration, updateVideoDuration] = useState(
|
|
45
|
+
const [videoDuration, updateVideoDuration] = useState(null);
|
|
45
46
|
const [isPlaying, updateIsPlaying] = useState(false);
|
|
46
47
|
const [isSpinning, setSpinning] = useState(false);
|
|
47
48
|
|
|
@@ -99,6 +100,7 @@ function CapVideoUpload(props) {
|
|
|
99
100
|
videoName: metaVideoName,
|
|
100
101
|
videoId: metaVideoId,
|
|
101
102
|
fileHandle: karixFileHandle,
|
|
103
|
+
videoDuration: null,
|
|
102
104
|
},
|
|
103
105
|
);
|
|
104
106
|
}
|
|
@@ -199,6 +201,7 @@ function CapVideoUpload(props) {
|
|
|
199
201
|
}
|
|
200
202
|
const onReUpload = () => {
|
|
201
203
|
updateVideoStatus(false);
|
|
204
|
+
updateVideoDuration(null);
|
|
202
205
|
onVideoUploadUpdateAssestList(
|
|
203
206
|
index,
|
|
204
207
|
{
|
|
@@ -207,7 +210,7 @@ function CapVideoUpload(props) {
|
|
|
207
210
|
videoHeight: "",
|
|
208
211
|
videoWidth: "",
|
|
209
212
|
videoSrc: "",
|
|
210
|
-
videoDuration:
|
|
213
|
+
videoDuration: null,
|
|
211
214
|
videoId: "",
|
|
212
215
|
fileHandle: "",
|
|
213
216
|
}
|
|
@@ -217,12 +220,13 @@ function CapVideoUpload(props) {
|
|
|
217
220
|
const updateMetadataLoaded = () => {
|
|
218
221
|
const { current: { duration, videoHeight: metaVideoHeight, videoWidth: metaVideoWidth } = {} } = videoEl;
|
|
219
222
|
if (duration) {
|
|
220
|
-
|
|
221
|
-
updateVideoDuration(value);
|
|
223
|
+
updateVideoDuration(duration);
|
|
222
224
|
if (videoWidth === undefined && videoHeight === undefined) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
225
|
+
if (
|
|
226
|
+
channel !== VIBER ||
|
|
227
|
+
(channel === VIBER && duration <= VIBER_MAX_DURATION)
|
|
228
|
+
) {
|
|
229
|
+
onVideoUploadUpdateAssestList(index, {
|
|
226
230
|
videoSrc,
|
|
227
231
|
videoId,
|
|
228
232
|
videoName,
|
|
@@ -230,12 +234,16 @@ function CapVideoUpload(props) {
|
|
|
230
234
|
videoWidth: metaVideoWidth,
|
|
231
235
|
previewUrl,
|
|
232
236
|
fileHandle,
|
|
233
|
-
|
|
234
|
-
|
|
237
|
+
videoDuration: duration,
|
|
238
|
+
});
|
|
239
|
+
} else {
|
|
240
|
+
onReUpload();
|
|
241
|
+
updateVideoErrorMessage(formatMessage(messages.videoDurationError));
|
|
242
|
+
}
|
|
235
243
|
}
|
|
236
244
|
}
|
|
237
245
|
};
|
|
238
|
-
|
|
246
|
+
const videoDurationValue = moment('1900-01-01 00:00:00').add(videoDuration, 'seconds').format("HH.mm.ss"); // to get the duration of video
|
|
239
247
|
return (
|
|
240
248
|
<Fragment key={videoSrc}>
|
|
241
249
|
<div style={{ overflow: 'hidden' }}>
|
|
@@ -264,11 +272,11 @@ function CapVideoUpload(props) {
|
|
|
264
272
|
</video>
|
|
265
273
|
{showVideoNameAndDuration &&
|
|
266
274
|
<div className="video-info">
|
|
267
|
-
<CapHeading type="
|
|
275
|
+
<CapHeading type="h4">
|
|
268
276
|
{getDecodedFileName(videoName)}
|
|
269
277
|
</CapHeading>
|
|
270
278
|
<CapHeading type="h6">
|
|
271
|
-
{
|
|
279
|
+
{videoDurationValue}
|
|
272
280
|
</CapHeading>
|
|
273
281
|
</div>
|
|
274
282
|
}
|
|
@@ -276,6 +284,16 @@ function CapVideoUpload(props) {
|
|
|
276
284
|
</Fragment>
|
|
277
285
|
);
|
|
278
286
|
};
|
|
287
|
+
|
|
288
|
+
const getVideoSizeDescription = () => (
|
|
289
|
+
<CapHeading.CapHeadingSpan type="label2">
|
|
290
|
+
<FormattedMessage
|
|
291
|
+
{...messages.videoSizeDescription}
|
|
292
|
+
values={{ size: bytes2Size(videoSize) }}
|
|
293
|
+
/>
|
|
294
|
+
</CapHeading.CapHeadingSpan>
|
|
295
|
+
);
|
|
296
|
+
|
|
279
297
|
return (
|
|
280
298
|
<CapSpin spinning={isSpinning}>
|
|
281
299
|
<div style={style} className="cap-custom-video-upload">
|
|
@@ -295,26 +313,34 @@ function CapVideoUpload(props) {
|
|
|
295
313
|
onClose={() => updateTemplateDrawerRequirement(false)}
|
|
296
314
|
/>
|
|
297
315
|
</form>
|
|
298
|
-
{channel
|
|
316
|
+
{![WHATSAPP, VIBER].includes(channel) &&
|
|
299
317
|
<>
|
|
300
318
|
<CapHeading.CapHeadingSpan type="h6" className="video-description">
|
|
301
319
|
<FormattedMessage {...messages.videoRatioDescription} />
|
|
302
320
|
</CapHeading.CapHeadingSpan>
|
|
303
321
|
{' '}
|
|
304
322
|
<CapHeading.CapHeadingSpan type="h6" className="video-description file-format">
|
|
305
|
-
<FormattedMessage {...messages.
|
|
306
|
-
|
|
323
|
+
<FormattedMessage {...messages.channelFileFormat} values={{ format: SUPPORTED_FILE_FORMATS[DEFAULT] }} />
|
|
307
324
|
</CapHeading.CapHeadingSpan>
|
|
308
325
|
<CapHeading.CapHeadingSpan type="h6" className="video-description video-details">
|
|
309
326
|
<FormattedMessage {...messages.videoSizeDescription} values={{size: bytes2Size(videoSize)}} />
|
|
310
327
|
</CapHeading.CapHeadingSpan>
|
|
311
|
-
</>
|
|
328
|
+
</>}
|
|
329
|
+
{channel === WHATSAPP &&
|
|
312
330
|
<>
|
|
313
|
-
|
|
314
|
-
|
|
331
|
+
{getVideoSizeDescription()}
|
|
332
|
+
<CapHeading.CapHeadingSpan type="label2" className="whatsapp-format">
|
|
333
|
+
<FormattedMessage {...messages.channelFileFormat} values={{ format: SUPPORTED_FILE_FORMATS[DEFAULT] }} />
|
|
315
334
|
</CapHeading.CapHeadingSpan>
|
|
335
|
+
</>}
|
|
336
|
+
{channel === VIBER &&
|
|
337
|
+
<>
|
|
338
|
+
{getVideoSizeDescription()}
|
|
316
339
|
<CapHeading.CapHeadingSpan type="label2" className="whatsapp-format">
|
|
317
|
-
<FormattedMessage {...messages.
|
|
340
|
+
<FormattedMessage {...messages.channelFileFormat} values={{ format: SUPPORTED_FILE_FORMATS.VIBER }} />
|
|
341
|
+
</CapHeading.CapHeadingSpan>
|
|
342
|
+
<CapHeading.CapHeadingSpan type="label2" className="video-duration">
|
|
343
|
+
<FormattedMessage {...messages.viberMaxDuration} />
|
|
318
344
|
</CapHeading.CapHeadingSpan>
|
|
319
345
|
</>}
|
|
320
346
|
</div>
|
|
@@ -55,12 +55,16 @@ export default defineMessages({
|
|
|
55
55
|
id: `${scope}.imageReUpload`,
|
|
56
56
|
defaultMessage: 'Re upload',
|
|
57
57
|
},
|
|
58
|
-
|
|
59
|
-
id: `${scope}.
|
|
60
|
-
defaultMessage: 'Format:
|
|
58
|
+
channelFileFormat: {
|
|
59
|
+
id: `${scope}.channelFileFormat`,
|
|
60
|
+
defaultMessage: 'Format: {format}',
|
|
61
61
|
},
|
|
62
|
-
|
|
63
|
-
id: `${scope}.
|
|
64
|
-
defaultMessage: '
|
|
62
|
+
viberMaxDuration: {
|
|
63
|
+
id: `${scope}.viberMaxDuration`,
|
|
64
|
+
defaultMessage: 'Max Duration: 600 seconds',
|
|
65
|
+
},
|
|
66
|
+
videoDurationError: {
|
|
67
|
+
id: `${scope}.videoDurationError`,
|
|
68
|
+
defaultMessage: 'Video duration should not exceed 600 seconds',
|
|
65
69
|
},
|
|
66
70
|
});
|
|
@@ -51,7 +51,7 @@ import { SMS, MOBILE_PUSH, LINE, ENABLE_AI_SUGGESTIONS } from '../../v2Container
|
|
|
51
51
|
import { validateIfTagClosed } from '../../utils/tagValidations';
|
|
52
52
|
import globalMessages from '../../v2Containers/Cap/messages';
|
|
53
53
|
import { convert } from 'html-to-text';
|
|
54
|
-
import {
|
|
54
|
+
import { OUTBOUND } from './constants';
|
|
55
55
|
import { GET_TRANSLATION_MAPPED } from '../../containers/TagList/constants';
|
|
56
56
|
import moment from 'moment';
|
|
57
57
|
import { CUSTOMER_BARCODE_TAG , COPY_OF} from '../../containers/App/constants';
|
|
@@ -1442,6 +1442,14 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
1442
1442
|
return formData;
|
|
1443
1443
|
}
|
|
1444
1444
|
|
|
1445
|
+
/**
|
|
1446
|
+
* Initializes the form with the given schema.
|
|
1447
|
+
*
|
|
1448
|
+
* @param {Object} schema - The schema object for the form.
|
|
1449
|
+
* @param {boolean} makeFormEmpty - Flag indicating whether to make the form empty.
|
|
1450
|
+
* @param {boolean} resetTabKeys - Flag indicating whether to reset tab keys.
|
|
1451
|
+
* @returns {void}
|
|
1452
|
+
*/
|
|
1445
1453
|
initialiseForm(schema, makeFormEmpty, resetTabKeys) {
|
|
1446
1454
|
let formData = makeFormEmpty ? {} : _.cloneDeep(this.state.formData);
|
|
1447
1455
|
let errorData = {};
|
|
@@ -1471,8 +1479,13 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
1471
1479
|
}
|
|
1472
1480
|
}
|
|
1473
1481
|
const tempFormData = _.cloneDeep(formData);
|
|
1482
|
+
// Store the value of 'template-name' before the deletion process
|
|
1483
|
+
const templateNameValue = tempFormData['template-name'];
|
|
1474
1484
|
if (!this.props.isNewVersionFlow) {
|
|
1475
1485
|
_.forEach(formData, (element, key) => {
|
|
1486
|
+
// This code block is used to clean up the tempFormData object.
|
|
1487
|
+
// If the element is not an object and the key of the element is not found in the formElements array,
|
|
1488
|
+
// then the element is removed from the tempFormData object.
|
|
1476
1489
|
if (typeof element !== 'object' && this.formElements.indexOf(key) === -1) {
|
|
1477
1490
|
delete tempFormData[key];
|
|
1478
1491
|
} else if (typeof element === "object") {
|
|
@@ -1482,8 +1495,15 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
1482
1495
|
}
|
|
1483
1496
|
});
|
|
1484
1497
|
}
|
|
1498
|
+
// If the element is an object, it iterates over its properties (innerElement).
|
|
1499
|
+
// If the property key (innerKey) is not "tabKey", "base", "name", "imagePreview", "image"
|
|
1500
|
+
// and is not found in the formElements array, then the property is removed from the object in tempFormData.
|
|
1485
1501
|
});
|
|
1486
1502
|
}
|
|
1503
|
+
// If 'template-name' was deleted, re-add it to tempFormData
|
|
1504
|
+
if (!Object.prototype.hasOwnProperty.call(tempFormData, 'template-name')) {
|
|
1505
|
+
tempFormData['template-name'] = templateNameValue;
|
|
1506
|
+
}
|
|
1487
1507
|
formData = _.cloneDeep(tempFormData);
|
|
1488
1508
|
this.setState({formData, errorData}, () => {
|
|
1489
1509
|
this.validateForm();
|
|
@@ -2375,13 +2395,17 @@ class FormBuilder extends React.Component { // eslint-disable-line react/prefer-
|
|
|
2375
2395
|
&& hasAiSuggestionsEnabled
|
|
2376
2396
|
&& this.props.isFullMode
|
|
2377
2397
|
&& (
|
|
2378
|
-
<CapAskAira
|
|
2398
|
+
<CapAskAira.ContentGenerationBot
|
|
2379
2399
|
text={messageContent || ""}
|
|
2380
2400
|
setText={(x) => {
|
|
2381
2401
|
this.updateFormData(x, val);
|
|
2382
2402
|
}}
|
|
2383
|
-
|
|
2384
|
-
|
|
2403
|
+
iconPlacement="float-br"
|
|
2404
|
+
rootStyle={{
|
|
2405
|
+
// 1rem is the margin-bottom of textarea
|
|
2406
|
+
bottom: 'calc(1rem + 0.2rem)',
|
|
2407
|
+
right: '0.2rem',
|
|
2408
|
+
}}
|
|
2385
2409
|
/>
|
|
2386
2410
|
)}
|
|
2387
2411
|
</CapColumn>
|
|
@@ -991,4 +991,25 @@
|
|
|
991
991
|
.media-img-inapp {
|
|
992
992
|
width: 100%;
|
|
993
993
|
height: 100%;
|
|
994
|
+
}
|
|
995
|
+
.empty-placeholder {
|
|
996
|
+
padding-bottom: $CAP_SPACE_16;
|
|
997
|
+
}
|
|
998
|
+
.viber-button-base {
|
|
999
|
+
border-radius: $CAP_SPACE_16;
|
|
1000
|
+
background-color: $CAP_PURPLE01;
|
|
1001
|
+
margin-top: $CAP_SPACE_12;
|
|
1002
|
+
text-align: center;
|
|
1003
|
+
width: 8.75rem;
|
|
1004
|
+
height: $CAP_SPACE_20;
|
|
1005
|
+
margin-left: $CAP_SPACE_08;
|
|
1006
|
+
}
|
|
1007
|
+
.viber-button-card-text {
|
|
1008
|
+
font-size: $CAP_SPACE_12;
|
|
1009
|
+
font-weight: 500;
|
|
1010
|
+
display: -webkit-box;
|
|
1011
|
+
-webkit-line-clamp: 1;
|
|
1012
|
+
-webkit-box-orient: vertical;
|
|
1013
|
+
overflow: hidden;
|
|
1014
|
+
color: $CAP_WHITE;
|
|
994
1015
|
}
|
|
@@ -11,7 +11,17 @@ import _ from 'lodash';
|
|
|
11
11
|
import { injectIntl, FormattedMessage, intlShape } from 'react-intl';
|
|
12
12
|
// import styled from 'styled-components';
|
|
13
13
|
import { CapColumn, CapRow, CapHeading, CapIcon, CapButton, CapImage, CapLabel, CapDivider, CapTooltip } from '@capillarytech/cap-ui-library';
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
CAP_COLOR_03,
|
|
16
|
+
CAP_WHITE,
|
|
17
|
+
FONT_COLOR_01,
|
|
18
|
+
CAP_G06,
|
|
19
|
+
CAP_G15,
|
|
20
|
+
CAP_PURPLE01,
|
|
21
|
+
CAP_G16,
|
|
22
|
+
CAP_SPACE_08,
|
|
23
|
+
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
24
|
+
import isEmpty from 'lodash/isEmpty';
|
|
15
25
|
import './_templatePreview.scss';
|
|
16
26
|
import {updateCharCount} from '../../utils/smsCharCountV2';
|
|
17
27
|
import messages from './messages';
|
|
@@ -36,6 +46,13 @@ import inAppMobileIOSFull from './assets/images/inapp_mobile_ios_full.svg';
|
|
|
36
46
|
import videoPlay from '../../assets/videoPlay.svg';
|
|
37
47
|
import zaloMessage from '../../v2Containers/Zalo/messages';
|
|
38
48
|
import { handlePreviewInNewTab } from '../../utils/common';
|
|
49
|
+
import { TEMPLATE, IMAGE_CAROUSEL, IMAGE, STICKER, TEXT, IMAGE_MAP, VIDEO } from '../../v2Containers/Line/Container/constants';
|
|
50
|
+
import CapFacebookPreview from '../../v2Containers/CapFacebookPreview';
|
|
51
|
+
import WhatsappStatusContainer from '../WhatsappStatusContainer';
|
|
52
|
+
import { getWhatsappQuickReply } from '../../v2Containers/Whatsapp/utils';
|
|
53
|
+
import { QUICK_REPLY } from '../../v2Containers/Whatsapp/constants';
|
|
54
|
+
import { ANDROID, INAPP_MESSAGE_LAYOUT_TYPES } from '../../v2Containers/InApp/constants';
|
|
55
|
+
|
|
39
56
|
const wechatBodyNew = require('./assets/images/wechat_mobile_android.svg');
|
|
40
57
|
const smsMobileAndroid = require('./assets/images/sms_mobile_android.svg');
|
|
41
58
|
const smsMobileIos = require('./assets/images/sms_mobile_ios.svg');
|
|
@@ -49,23 +66,6 @@ const lineVideoPlaceholder = require('../../assets/rich-video-placeholder.svg');
|
|
|
49
66
|
const androidPushMessagePhone = require('./assets/images/androidPushMessage.svg');
|
|
50
67
|
const iPhonePushMessagePhone = require('./assets/images/iPhonePushMessage.svg');
|
|
51
68
|
|
|
52
|
-
import {
|
|
53
|
-
CAP_COLOR_03,
|
|
54
|
-
CAP_WHITE,
|
|
55
|
-
FONT_COLOR_01,
|
|
56
|
-
CAP_G06,
|
|
57
|
-
CAP_G15,
|
|
58
|
-
CAP_PURPLE01,
|
|
59
|
-
CAP_G16,
|
|
60
|
-
CAP_SPACE_08,
|
|
61
|
-
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
62
|
-
import { TEMPLATE, IMAGE_CAROUSEL, IMAGE, STICKER, TEXT, IMAGE_MAP, VIDEO } from '../../v2Containers/Line/Container/constants';
|
|
63
|
-
import CapFacebookPreview from '../../v2Containers/CapFacebookPreview';
|
|
64
|
-
import WhatsappStatusContainer from '../WhatsappStatusContainer';
|
|
65
|
-
import { getWhatsappQuickReply } from '../../v2Containers/Whatsapp/utils';
|
|
66
|
-
import { QUICK_REPLY } from '../../v2Containers/Whatsapp/constants';
|
|
67
|
-
import { ANDROID, INAPP_MESSAGE_LAYOUT_TYPES } from '../../v2Containers/InApp/constants';
|
|
68
|
-
|
|
69
69
|
export class TemplatePreview extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
70
70
|
onPreviewContentClicked = (channel) => {
|
|
71
71
|
const IOSContent = (this.props.templateDataRaw && this.props.templateDataRaw.versions.base.IOS) ||
|
|
@@ -184,8 +184,14 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
|
|
|
184
184
|
} = this.props;
|
|
185
185
|
let content = channel && channel.toLowerCase() === 'sms' ? [this.props.content] : this.props.content;
|
|
186
186
|
const { formatMessage } = intl;
|
|
187
|
-
const {
|
|
187
|
+
const { rcsPreviewContent, inAppPreviewContent, viberPreviewContent } = content || {};
|
|
188
188
|
const { rcsImageSrc, rcsTitle, rcsDesc, buttonText: rcsButtonText } = rcsPreviewContent || {};
|
|
189
|
+
const {
|
|
190
|
+
videoParams,
|
|
191
|
+
imageURL,
|
|
192
|
+
buttonText: viberButtonText,
|
|
193
|
+
messageContent: viberMessageContent,
|
|
194
|
+
} = viberPreviewContent || {};
|
|
189
195
|
const {mediaPreview = {}, templateTitle = "", templateMsg = "", ctaData} = inAppPreviewContent || {};
|
|
190
196
|
let smsDetails = {};
|
|
191
197
|
// let smsText = '';
|
|
@@ -920,35 +926,40 @@ export class TemplatePreview extends React.Component { // eslint-disable-line re
|
|
|
920
926
|
}}
|
|
921
927
|
/>
|
|
922
928
|
)}
|
|
923
|
-
{/*
|
|
924
|
-
{
|
|
925
|
-
<
|
|
926
|
-
|
|
927
|
-
"border-radius": "16px",
|
|
928
|
-
"background-color": CAP_PURPLE01,
|
|
929
|
-
"margin-top": "14px",
|
|
930
|
-
"text-align": "center",
|
|
931
|
-
width: "140px",
|
|
932
|
-
height: "20px",
|
|
933
|
-
"margin-left": "8px",
|
|
934
|
-
}}
|
|
929
|
+
{/* Video Viber preview */}
|
|
930
|
+
{videoParams?.viberVideoSrc && (
|
|
931
|
+
<CapTooltip
|
|
932
|
+
title={formatMessage(messages.videoPreviewTooltip)}
|
|
935
933
|
>
|
|
936
|
-
<
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
"
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
934
|
+
<div className="video-preview">
|
|
935
|
+
<CapImage
|
|
936
|
+
src={videoParams?.viberVideoPreviewImg}
|
|
937
|
+
className="whatsapp-image"
|
|
938
|
+
alt={formatMessage(messages.previewGenerated)}
|
|
939
|
+
rest={{
|
|
940
|
+
style: {
|
|
941
|
+
maxWidth: "100%",
|
|
942
|
+
marginBottom: 5,
|
|
943
|
+
},
|
|
944
|
+
}}
|
|
945
|
+
/>
|
|
946
|
+
<div className="icon-position">
|
|
947
|
+
<CapImage
|
|
948
|
+
className="video-icon"
|
|
949
|
+
src={videoPlay} />
|
|
950
|
+
</div>
|
|
951
|
+
</div>
|
|
952
|
+
</CapTooltip>
|
|
953
|
+
)}
|
|
954
|
+
{/* button viber preview */}
|
|
955
|
+
{viberButtonText && (
|
|
956
|
+
<CapLabel className="viber-button-base">
|
|
957
|
+
<p className="viber-button-card-text">
|
|
958
|
+
{viberButtonText || ""}
|
|
948
959
|
</p>
|
|
949
|
-
</
|
|
960
|
+
</CapLabel>
|
|
950
961
|
)}
|
|
951
|
-
<div
|
|
962
|
+
<div className="empty-placeholder"></div>
|
|
952
963
|
</div>
|
|
953
964
|
</div>
|
|
954
965
|
</div>
|
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
3
|
import styled from 'styled-components';
|
|
4
4
|
import get from 'lodash/get';
|
|
5
|
+
import isEmpty from 'lodash/isEmpty';
|
|
5
6
|
import cloneDeep from 'lodash/cloneDeep';
|
|
6
7
|
import TemplatesV2 from '../TemplatesV2';
|
|
7
8
|
import TemplatePreview from '../../v2Components/TemplatePreview';
|
|
@@ -309,11 +310,16 @@ export function SlideBoxContent(props) {
|
|
|
309
310
|
}
|
|
310
311
|
case constants.VIBER: {
|
|
311
312
|
const template = cloneDeep(templateDataObject);
|
|
312
|
-
const { text = "",
|
|
313
|
+
const { text = "", button = {}, image = {}, video = {} } = get(template, 'versions.base.content.content', {});
|
|
314
|
+
const { url: viberVideoUrl = "", thumbnailUrl = '' } = video;
|
|
315
|
+
const { url: viberImageUrl = "" } = image;
|
|
313
316
|
template.content = {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
+
viberPreviewContent: {
|
|
318
|
+
...(!isEmpty(image) && { imageURL: viberImageUrl }),
|
|
319
|
+
...(!isEmpty(video) && { videoParams: { viberVideoSrc: viberVideoUrl, viberVideoPreviewImg: thumbnailUrl }}),
|
|
320
|
+
buttonText: button?.text,
|
|
321
|
+
messageContent: text,
|
|
322
|
+
},
|
|
317
323
|
};
|
|
318
324
|
return template.content;
|
|
319
325
|
}
|
|
@@ -70,6 +70,7 @@ export function SlideBoxHeader(props) {
|
|
|
70
70
|
whatsapp: <FormattedMessage {...messages.whatsappTemplate} />,
|
|
71
71
|
rcs: <FormattedMessage {...messages.rcsCreative} />,
|
|
72
72
|
zalo: <FormattedMessage {...messages.zaloTemplate} />,
|
|
73
|
+
viber: <FormattedMessage {...messages.viberTemplate} />,
|
|
73
74
|
};
|
|
74
75
|
return labels[currentChannel.toLowerCase()];
|
|
75
76
|
};
|