@capillarytech/creatives-library 7.10.59 → 7.10.61
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/config/app.js +1 -0
- package/containers/Assets/Gallery/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/containers/Email/index.js +3 -2
- package/index.js +6 -0
- package/package.json +1 -1
- package/routes.js +5 -0
- package/services/api.js +6 -1
- package/utils/v2common.js +13 -0
- package/v2Components/TemplatePreview/_templatePreview.scss +24 -2
- package/v2Components/TemplatePreview/index.js +90 -8
- package/v2Components/TemplatePreview/messages.js +12 -0
- package/v2Containers/App/constants.js +4 -1
- package/v2Containers/Assets/Gallery/tests/__snapshots__/reducer.test.js.snap +2 -0
- package/v2Containers/Cap/messages.js +12 -1
- package/v2Containers/CreativesContainer/SlideBoxContent.js +42 -7
- package/v2Containers/CreativesContainer/SlideBoxHeader.js +55 -14
- package/v2Containers/CreativesContainer/constants.js +1 -0
- package/v2Containers/CreativesContainer/index.js +93 -4
- package/v2Containers/CreativesContainer/messages.js +8 -0
- package/v2Containers/Email/index.js +3 -1
- package/v2Containers/Line/Container/index.js +1 -1
- package/v2Containers/Templates/_templates.scss +64 -0
- package/v2Containers/Templates/actions.js +12 -10
- package/v2Containers/Templates/constants.js +3 -1
- package/v2Containers/Templates/index.js +431 -72
- package/v2Containers/Templates/messages.js +66 -2
- package/v2Containers/Templates/reducer.js +3 -1
- package/v2Containers/TemplatesV2/index.js +17 -0
- package/v2Containers/TemplatesV2/messages.js +4 -0
- package/v2Containers/Whatsapp/index.js +23 -21
- package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +16 -16
package/config/app.js
CHANGED
|
@@ -17,6 +17,7 @@ const config = {
|
|
|
17
17
|
},
|
|
18
18
|
development: {
|
|
19
19
|
api_endpoint: 'https://crm-nightly-new.cc.capillarytech.com/arya/api/v1/creatives',
|
|
20
|
+
//api_endpoint: 'http://localhost:2022/arya/api/v1/creatives',
|
|
20
21
|
campaigns_api_endpoint: 'https://crm-nightly-new.cc.capillarytech.com/iris/v2/campaigns',
|
|
21
22
|
campaigns_api_org_endpoint: 'https://crm-nightly-new.cc.capillarytech.com/iris/v2/org/campaign',
|
|
22
23
|
auth_endpoint: 'https://crm-nightly-new.cc.capillarytech.com/arya/api/v1/auth',
|
|
@@ -2733,11 +2733,12 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
|
|
|
2733
2733
|
} else {
|
|
2734
2734
|
this.setState({injectedTags: data.tags});
|
|
2735
2735
|
}
|
|
2736
|
-
|
|
2736
|
+
if (data.tags) {
|
|
2737
|
+
this.props.globalActions.setInjectedTags(data.tags);
|
|
2738
|
+
}
|
|
2737
2739
|
}
|
|
2738
2740
|
|
|
2739
2741
|
startLoading = (ifEdit) => {
|
|
2740
|
-
|
|
2741
2742
|
if (ifEdit) {
|
|
2742
2743
|
this.setState({loading: true});
|
|
2743
2744
|
}
|
package/index.js
CHANGED
|
@@ -87,6 +87,10 @@ import SmsTraiCreate from './v2Containers/SmsTrai/Create';
|
|
|
87
87
|
import SmsTraiCreateReducer from './v2Containers/SmsTrai/Create/reducer';
|
|
88
88
|
import SmsTraiCreateSaga from './v2Containers/SmsTrai/Create/sagas';
|
|
89
89
|
|
|
90
|
+
import Whatsapp from './v2Containers/Whatsapp';
|
|
91
|
+
import whatsappReducer from './v2Containers/Whatsapp/reducer';
|
|
92
|
+
import whatsappSaga from './v2Containers/Whatsapp/sagas';
|
|
93
|
+
|
|
90
94
|
export {default as Ebill} from './v2Containers/Ebill';
|
|
91
95
|
export {default as EbillReducer} from './v2Containers/Ebill/reducer';
|
|
92
96
|
export {default as EbillSaga} from './v2Containers/Ebill/sagas';
|
|
@@ -111,6 +115,7 @@ const FacebookContainer = {Facebook, facebookReducer, facebookSaga};
|
|
|
111
115
|
const ViberContainer = {Viber, viberReducer, viberSaga};
|
|
112
116
|
const FacebookPreviewContainer = { FacebookPreview, facebookPreviewReducer, facebookPreviewSaga };
|
|
113
117
|
const SmsTraiContainer = {SmsTraiCreate, SmsTraiCreateReducer, SmsTraiCreateSaga};
|
|
118
|
+
const WhatsappContainer = { Whatsapp, whatsappReducer, whatsappSaga };
|
|
114
119
|
|
|
115
120
|
const GalleryContainer = {Gallery, galleryReducer, gallerySagas};
|
|
116
121
|
const FTPContainer = {FTP, FTPReducer, FTPSagas};
|
|
@@ -157,4 +162,5 @@ export { CapContainer,
|
|
|
157
162
|
ViberContainer,
|
|
158
163
|
FacebookPreviewContainer,
|
|
159
164
|
SmsTraiContainer,
|
|
165
|
+
WhatsappContainer,
|
|
160
166
|
};
|
package/package.json
CHANGED
package/routes.js
CHANGED
|
@@ -660,6 +660,8 @@ export default function createRoutes(store) {
|
|
|
660
660
|
import('v2Containers/CapFacebookPreview/reducer'),
|
|
661
661
|
import('v2Containers/SmsTrai/Create/sagas'),
|
|
662
662
|
import('v2Containers/SmsTrai/Create/reducer'),
|
|
663
|
+
import('v2Containers/Whatsapp/sagas'),
|
|
664
|
+
import('v2Containers/Whatsapp/reducer'),
|
|
663
665
|
]);
|
|
664
666
|
|
|
665
667
|
const renderRoute = loadModule(cb);
|
|
@@ -683,6 +685,7 @@ export default function createRoutes(store) {
|
|
|
683
685
|
viberSagas, viberReducer,
|
|
684
686
|
capFacebookPreviewSagas, capFacebookPreviewReducer,
|
|
685
687
|
smsTraiSagas, smsTraiReducer,
|
|
688
|
+
whatsappSagas, whatsappReducer,
|
|
686
689
|
]) => {
|
|
687
690
|
injectReducer('templates', reducer.default);
|
|
688
691
|
injectReducer('cap', capReducer.default);
|
|
@@ -702,6 +705,7 @@ export default function createRoutes(store) {
|
|
|
702
705
|
injectReducer('viber', viberReducer.default);
|
|
703
706
|
injectReducer('facebookPreview', capFacebookPreviewReducer.default);
|
|
704
707
|
injectReducer('smsTrai', smsTraiReducer.default);
|
|
708
|
+
injectReducer('whatsapp', whatsappReducer.default);
|
|
705
709
|
injectSagas(gallerySagas.default);
|
|
706
710
|
injectSagas(sagas.default);
|
|
707
711
|
injectSagas(capSagas.default);
|
|
@@ -720,6 +724,7 @@ export default function createRoutes(store) {
|
|
|
720
724
|
injectSagas(viberSagas.default);
|
|
721
725
|
injectSagas(capFacebookPreviewSagas.default);
|
|
722
726
|
injectSagas(smsTraiSagas.default);
|
|
727
|
+
injectSagas(whatsappSagas.default);
|
|
723
728
|
renderRoute(component);
|
|
724
729
|
});
|
|
725
730
|
importModules.catch(errorLoading);
|
package/services/api.js
CHANGED
|
@@ -460,4 +460,9 @@ export const createBulkSMSTemplate = ({templates}) => {
|
|
|
460
460
|
export const checkBulkDuplicates = (data) => {
|
|
461
461
|
const url = `${API_ENDPOINT}/templates/bulk/sms/checkDuplicates`;
|
|
462
462
|
return request(url, getAPICallObject('POST', data));
|
|
463
|
-
};
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
export const createWhatsappTemplate = ({ payload }) => {
|
|
466
|
+
const url = `${API_ENDPOINT}/templates/WHATSAPP`;
|
|
467
|
+
return request(url, getAPICallObject('POST', payload));
|
|
468
|
+
};
|
package/utils/v2common.js
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const getObjFromQueryParams = (searchString) => {
|
|
2
|
+
const params = new URLSearchParams(searchString);
|
|
3
|
+
const obj = {};
|
|
4
|
+
// iterate over all keys
|
|
5
|
+
for (const key of params.keys()) {
|
|
6
|
+
if (params.getAll(key).length > 1) {
|
|
7
|
+
obj[key] = params.getAll(key);
|
|
8
|
+
} else {
|
|
9
|
+
obj[key] = params.get(key);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
.
|
|
18
|
+
.msg-container {
|
|
19
19
|
position: absolute;
|
|
20
20
|
top: 20%;
|
|
21
21
|
left: 23%;
|
|
@@ -238,6 +238,21 @@
|
|
|
238
238
|
}
|
|
239
239
|
}
|
|
240
240
|
}
|
|
241
|
+
|
|
242
|
+
.whatsapp-brand-name {
|
|
243
|
+
position: absolute;
|
|
244
|
+
top: 11%;
|
|
245
|
+
left: 38%;
|
|
246
|
+
color: white;
|
|
247
|
+
font-size: small;
|
|
248
|
+
}
|
|
249
|
+
.whatsapp-message-container{
|
|
250
|
+
max-height: 292px;
|
|
251
|
+
margin-left: 28px;
|
|
252
|
+
}
|
|
253
|
+
.whatsapp-content{
|
|
254
|
+
margin: 2px 6px 1px 7px;
|
|
255
|
+
}
|
|
241
256
|
}
|
|
242
257
|
|
|
243
258
|
.align-center {
|
|
@@ -291,7 +306,7 @@
|
|
|
291
306
|
}
|
|
292
307
|
|
|
293
308
|
|
|
294
|
-
.
|
|
309
|
+
.msg-container {
|
|
295
310
|
position: absolute;
|
|
296
311
|
top: 14%;
|
|
297
312
|
left: 29%;
|
|
@@ -399,4 +414,11 @@
|
|
|
399
414
|
span {
|
|
400
415
|
font-size: $FONT_SIZE_VS;
|
|
401
416
|
}
|
|
417
|
+
}
|
|
418
|
+
.whatsapp-brand-name{
|
|
419
|
+
position: absolute;
|
|
420
|
+
top: 11%;
|
|
421
|
+
left: 38%;
|
|
422
|
+
color: white;
|
|
423
|
+
font-size: small;
|
|
402
424
|
}
|
|
@@ -10,13 +10,17 @@ import React from 'react';
|
|
|
10
10
|
import _ from 'lodash';
|
|
11
11
|
import { injectIntl, FormattedMessage, intlShape } from 'react-intl';
|
|
12
12
|
// import styled from 'styled-components';
|
|
13
|
-
import {CapColumn, CapRow, CapHeading, CapIcon, CapButton, CapImage} from '@capillarytech/cap-ui-library';
|
|
13
|
+
import { CapColumn, CapRow, CapHeading, CapIcon, CapButton, CapImage, CapLabel } from '@capillarytech/cap-ui-library';
|
|
14
14
|
import './_templatePreview.scss';
|
|
15
15
|
import {updateCharCount} from '../../utils/smsCharCountV2';
|
|
16
16
|
import messages from './messages';
|
|
17
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
WECHAT,
|
|
19
|
+
WHATSAPP,
|
|
20
|
+
} from '../../v2Containers/CreativesContainer/constants';
|
|
18
21
|
import Carousel from '../Carousel';
|
|
19
22
|
import { VIBER, FACEBOOK } from '../../v2Containers/App/constants';
|
|
23
|
+
import whatsappMobileAndroid from './assets/images/whatsapp_mobile_android.svg'
|
|
20
24
|
const wechatBodyNew = require('./assets/images/wechat_mobile_android.svg');
|
|
21
25
|
const smsMobileAndroid = require('./assets/images/sms_mobile_android.svg');
|
|
22
26
|
const lineMobileAndroid = require('../../assets/line.png');
|
|
@@ -28,9 +32,20 @@ const lineVideoPlaceholder = require('../../assets/rich-video-placeholder.svg');
|
|
|
28
32
|
const androidPushMessagePhone = require('./assets/images/androidPushMessage.svg');
|
|
29
33
|
const iPhonePushMessagePhone = require('./assets/images/iPhonePushMessage.svg');
|
|
30
34
|
|
|
31
|
-
import {
|
|
35
|
+
import {
|
|
36
|
+
CAP_COLOR_03,
|
|
37
|
+
CAP_WHITE,
|
|
38
|
+
FONT_COLOR_01,
|
|
39
|
+
CAP_G06,
|
|
40
|
+
CAP_G15,
|
|
41
|
+
CAP_PURPLE01,
|
|
42
|
+
CAP_G16,
|
|
43
|
+
CAP_SPACE_08,
|
|
44
|
+
CAP_SPACE_16,
|
|
45
|
+
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
32
46
|
import { TEMPLATE, IMAGE_CAROUSEL, IMAGE, STICKER, TEXT, IMAGE_MAP, VIDEO } from '../../v2Containers/Line/Container/constants';
|
|
33
47
|
import CapFacebookPreview from '../../v2Containers/CapFacebookPreview';
|
|
48
|
+
import WhatsappStatusContainer from '../WhatsappStatusContainer';
|
|
34
49
|
|
|
35
50
|
class TemplatePreview extends React.Component { // eslint-disable-line react/prefer-stateless-function
|
|
36
51
|
onPreviewContentClicked = (channel) => {
|
|
@@ -132,7 +147,18 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
132
147
|
|
|
133
148
|
render() {
|
|
134
149
|
let content = channel && channel.toLowerCase() === 'sms' ? [this.props.content] : this.props.content;
|
|
135
|
-
const {
|
|
150
|
+
const {
|
|
151
|
+
channel,
|
|
152
|
+
showTestAndPreviewIcon,
|
|
153
|
+
module,
|
|
154
|
+
viberBrandName,
|
|
155
|
+
viberAccountName,
|
|
156
|
+
whatsappAccountName,
|
|
157
|
+
whatsappContentLen,
|
|
158
|
+
intl,
|
|
159
|
+
templateData,
|
|
160
|
+
} = this.props;
|
|
161
|
+
const { formatMessage } = intl;
|
|
136
162
|
const { buttonText, imageURL, messageContent: viberMessageContent } = content || {};
|
|
137
163
|
let smsDetails = {};
|
|
138
164
|
// let smsText = '';
|
|
@@ -187,6 +213,13 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
187
213
|
'background-color': CAP_G15,
|
|
188
214
|
'width': '81%',
|
|
189
215
|
};
|
|
216
|
+
const whatsappSectionStyle = {
|
|
217
|
+
'padding': `4px 0 ${CAP_SPACE_08}`,
|
|
218
|
+
'border-radius': '6px',
|
|
219
|
+
'background-color': CAP_G15,
|
|
220
|
+
'width': '88%',
|
|
221
|
+
'left': '10%',
|
|
222
|
+
};
|
|
190
223
|
const getVideoContent = ({
|
|
191
224
|
video,
|
|
192
225
|
actionUrl,
|
|
@@ -259,6 +292,9 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
259
292
|
</div>
|
|
260
293
|
);
|
|
261
294
|
|
|
295
|
+
const whatsappUpdatedAccountName = whatsappAccountName || _.get(templateData, 'versions.base.content.whatsapp.accountName', '');
|
|
296
|
+
const whatsappUpdatedLen = whatsappContentLen !== undefined ? 36 + whatsappContentLen : content?.templateMsg?.length;
|
|
297
|
+
|
|
262
298
|
return (
|
|
263
299
|
<CapRow>
|
|
264
300
|
{this.props.showCount && (channel && channel.toLowerCase() !== FACEBOOK) && <CapColumn span={16}>
|
|
@@ -271,6 +307,17 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
271
307
|
{smsDetails.optoutUrlPresent && <CapHeading type="h6">
|
|
272
308
|
<FormattedMessage {...messages.optoutCharactersTotal} values={{optoutUrlLength: smsDetails.optouturlLength}} />
|
|
273
309
|
</CapHeading>}
|
|
310
|
+
{channel?.toLowerCase() === WHATSAPP.toLowerCase() ? (
|
|
311
|
+
<>
|
|
312
|
+
<WhatsappStatusContainer template={templateData} />
|
|
313
|
+
<CapHeading type="h3" className='margin-t-12'>
|
|
314
|
+
<FormattedMessage {...messages.whatsappCharactersTotal} values={{charCount: content?.templateMsg?.length}} />
|
|
315
|
+
</CapHeading>
|
|
316
|
+
<CapHeading type="h6">
|
|
317
|
+
<FormattedMessage {...messages.whatsappUnsubscribeLength} />
|
|
318
|
+
</CapHeading>
|
|
319
|
+
</>
|
|
320
|
+
) : null}
|
|
274
321
|
</CapColumn>}
|
|
275
322
|
<CapColumn span={this.props.showCount ? 8 : 24}>
|
|
276
323
|
{showTestAndPreview && (
|
|
@@ -308,7 +355,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
308
355
|
<div>
|
|
309
356
|
<div className="shell-v2 align-center" id="sms-preview">
|
|
310
357
|
<CapImage className="preview-image sms" src={smsMobileAndroid} alt="Preview is being generated"/>
|
|
311
|
-
<div className="
|
|
358
|
+
<div className="msg-container sms">
|
|
312
359
|
<div className={"message-pop sms"}>
|
|
313
360
|
{content && content.length && content.map((msg, index) =>
|
|
314
361
|
<CapColumn key={`"message-pop-content-${index}`} className="message-pop-item align-left" style={{ background: '#FFFFFF', color: '#091e42'}}>
|
|
@@ -336,7 +383,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
336
383
|
{channel && channel.toLowerCase() === 'wechat' ?
|
|
337
384
|
( <div className="shell-v2 align-center" id="sms-preview">
|
|
338
385
|
<CapImage className="preview-image" src={(channel || '').toLowerCase() === 'wechat' ? wechatBodyNew : smsMobileAndroid} alt="Preview is being generated"/>
|
|
339
|
-
|
|
386
|
+
<div className="msg-container wechat">
|
|
340
387
|
<div className="message-pop align-left" style={{ background: `${this.props.channel.toLowerCase() === 'wechat' ? '#ffffff' : '#3F51B5'}`, color: `${this.props.channel.toLowerCase() === 'wechat' ? '#333333' : '#ffffff'}`}}>{content}
|
|
341
388
|
</div>
|
|
342
389
|
</div>
|
|
@@ -396,7 +443,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
396
443
|
<div className="shell-v2 align-center" id="sms-preview">
|
|
397
444
|
<CapImage className="preview-image" src={lineMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
398
445
|
<div
|
|
399
|
-
|
|
446
|
+
className="msg-container line-preview"
|
|
400
447
|
style={{
|
|
401
448
|
maxHeight: 330,
|
|
402
449
|
overflow: 'scroll',
|
|
@@ -564,7 +611,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
564
611
|
<CapImage className="preview-image" src={viberMobileAndroid} alt={this.props.intl.formatMessage(messages.previewGenerated)}/>
|
|
565
612
|
<div style={{ position: 'absolute', top: '12%', left: '36%'}}>{viberBrandName}</div>
|
|
566
613
|
<div
|
|
567
|
-
|
|
614
|
+
className="msg-container viber-preview"
|
|
568
615
|
style={{
|
|
569
616
|
maxHeight: 292,
|
|
570
617
|
marginLeft: 28,
|
|
@@ -638,6 +685,41 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
|
|
|
638
685
|
</div>
|
|
639
686
|
) : ''
|
|
640
687
|
}
|
|
688
|
+
{
|
|
689
|
+
channel?.toUpperCase() === WHATSAPP ? (
|
|
690
|
+
<>
|
|
691
|
+
<div className='shell-v2 align-center'>
|
|
692
|
+
<CapImage
|
|
693
|
+
className='preview-image'
|
|
694
|
+
src={whatsappMobileAndroid}
|
|
695
|
+
alt={formatMessage(messages.previewGenerated)}
|
|
696
|
+
/>
|
|
697
|
+
<CapLabel className='whatsapp-brand-name'>
|
|
698
|
+
{whatsappUpdatedAccountName || ''}
|
|
699
|
+
</CapLabel>
|
|
700
|
+
<div className='msg-container whatsapp-message-container'>
|
|
701
|
+
<div className='message-pop align-left' style={whatsappSectionStyle}>
|
|
702
|
+
<CapLabel className='whatsapp-content'>
|
|
703
|
+
{content?.templateMsg || ''}
|
|
704
|
+
</CapLabel>
|
|
705
|
+
</div>
|
|
706
|
+
</div>
|
|
707
|
+
</div>
|
|
708
|
+
<CapHeading
|
|
709
|
+
type='h3'
|
|
710
|
+
style={{ textAlign: 'center' }}
|
|
711
|
+
className='margin-t-16'
|
|
712
|
+
>
|
|
713
|
+
<FormattedMessage
|
|
714
|
+
{...messages.whatsappMessageLength}
|
|
715
|
+
values={{ length: whatsappUpdatedLen }}
|
|
716
|
+
/>
|
|
717
|
+
</CapHeading>
|
|
718
|
+
</>
|
|
719
|
+
) : (
|
|
720
|
+
''
|
|
721
|
+
)
|
|
722
|
+
}
|
|
641
723
|
{channel && channel.toLowerCase() === FACEBOOK && (
|
|
642
724
|
<div style={{position: 'absolute', left: '80%'}} id="facebook-preview">
|
|
643
725
|
<CapFacebookPreview
|
|
@@ -22,10 +22,22 @@ export default defineMessages({
|
|
|
22
22
|
id: 'creatives.componentsV2.TemplatePreview.charactersTotal',
|
|
23
23
|
defaultMessage: "{smsCount} SMS ({charCount} characters)",
|
|
24
24
|
},
|
|
25
|
+
whatsappCharactersTotal: {
|
|
26
|
+
id: 'creatives.componentsV2.TemplatePreview.whatsappCharactersTotal',
|
|
27
|
+
defaultMessage: "{charCount} characters",
|
|
28
|
+
},
|
|
25
29
|
optoutCharactersTotal: {
|
|
26
30
|
id: 'app.components.TemplatePreview.optoutCharactersTotal',
|
|
27
31
|
defaultMessage: "Includes optout tag ({optoutUrlLength} characters)",
|
|
28
32
|
},
|
|
33
|
+
whatsappUnsubscribeLength: {
|
|
34
|
+
id: 'app.components.TemplatePreview.whatsappUnsubscribeLength',
|
|
35
|
+
defaultMessage: "Includes 36 characters of (Click {{unsubscribe}} to unsubscribe)",
|
|
36
|
+
},
|
|
37
|
+
whatsappMessageLength: {
|
|
38
|
+
id: 'app.components.TemplatePreview.whatsappMessageLength',
|
|
39
|
+
defaultMessage: "1 Message ({length} characters)",
|
|
40
|
+
},
|
|
29
41
|
smsFormatType: {
|
|
30
42
|
id: 'creatives.componentsV2.TemplatePreview.smsFormatType',
|
|
31
43
|
defaultMessage: 'Message has unicode characters',
|
|
@@ -47,6 +47,7 @@ export const PREVIEW = 'preview';
|
|
|
47
47
|
|
|
48
48
|
export const VIBER = 'viber';
|
|
49
49
|
export const FACEBOOK = 'facebook';
|
|
50
|
+
export const WHATSAPP = 'whatsapp';
|
|
50
51
|
|
|
51
52
|
export const TRACK_EDIT_SMS = 'editSms';
|
|
52
53
|
export const TRACK_EDIT_EMAIL = 'editEmail';
|
|
@@ -107,4 +108,6 @@ export const FB_AD_CALL_TO_ACTION = {
|
|
|
107
108
|
export const CREATIVES = 'creatives';
|
|
108
109
|
export const LOYALTY = 'loyalty';
|
|
109
110
|
|
|
110
|
-
export const FAILURE = 'FAILURE';
|
|
111
|
+
export const FAILURE = 'FAILURE';
|
|
112
|
+
export const DATE_DISPLAY_FORMAT = 'D MMM YYYY';
|
|
113
|
+
export const TIME_DISPLAY_FORMAT = 'hh:mm A';
|
|
@@ -80,6 +80,14 @@ export default defineMessages({
|
|
|
80
80
|
id: `creatives.containersV2.promotions`,
|
|
81
81
|
defaultMessage: 'Promotions',
|
|
82
82
|
},
|
|
83
|
+
"templateNameLabel": {
|
|
84
|
+
id: `creatives.containersV2.templateNameLabel`,
|
|
85
|
+
defaultMessage: 'Template name',
|
|
86
|
+
},
|
|
87
|
+
"templateNamePlaceholder": {
|
|
88
|
+
id: `creatives.containersV2.templateNamePlaceholder`,
|
|
89
|
+
defaultMessage: 'Enter template name',
|
|
90
|
+
},
|
|
83
91
|
|
|
84
92
|
//refresh due to org change messages
|
|
85
93
|
|
|
@@ -149,6 +157,9 @@ export default defineMessages({
|
|
|
149
157
|
id: `creatives.containersV2.watchMore`,
|
|
150
158
|
defaultMessage: 'Watch More',
|
|
151
159
|
},
|
|
152
|
-
|
|
160
|
+
"done": {
|
|
161
|
+
id: `creatives.containersV2.done`,
|
|
162
|
+
defaultMessage: 'Done',
|
|
163
|
+
},
|
|
153
164
|
});
|
|
154
165
|
|
|
@@ -21,6 +21,8 @@ import * as constants from './constants';
|
|
|
21
21
|
import LineContainer from '../Line/Container';
|
|
22
22
|
import FTP from '../FTP';
|
|
23
23
|
import Viber from '../Viber';
|
|
24
|
+
import Whatsapp from '../Whatsapp';
|
|
25
|
+
import { getWhatsappContent } from '../Whatsapp/utils';
|
|
24
26
|
import * as commonUtil from '../../utils/common';
|
|
25
27
|
const CreativesWrapper = styled.div`
|
|
26
28
|
.ant-popover,
|
|
@@ -143,6 +145,7 @@ function SlideBoxContent(props) {
|
|
|
143
145
|
showDisabledFBInfo,
|
|
144
146
|
orgUnitId,
|
|
145
147
|
smsRegister,
|
|
148
|
+
enableNewChannels,
|
|
146
149
|
} = props;
|
|
147
150
|
const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
|
|
148
151
|
const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
|
|
@@ -170,11 +173,12 @@ function SlideBoxContent(props) {
|
|
|
170
173
|
});
|
|
171
174
|
|
|
172
175
|
|
|
173
|
-
const
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
const
|
|
177
|
-
const
|
|
176
|
+
const isCreate = slidBoxContent === 'createTemplate';
|
|
177
|
+
const isCreateSms = isCreate && channel === constants.SMS;
|
|
178
|
+
const isCreateFacebook = isCreate && channel === constants.FACEBOOK;
|
|
179
|
+
const isCreateWhatsapp = isCreate && channel === constants.WHATSAPP;
|
|
180
|
+
const isCreateMPush = isCreate && channel === constants.MOBILE_PUSH;
|
|
181
|
+
const isCreateCallTask = isCreate && channel === constants.CALL_TASK;
|
|
178
182
|
let isEditSms = false;
|
|
179
183
|
let isEditEmailWithId = false;
|
|
180
184
|
let isEmailEditWithContent = false;
|
|
@@ -185,7 +189,8 @@ function SlideBoxContent(props) {
|
|
|
185
189
|
let isEditMPush = false;
|
|
186
190
|
let isEditFacebook = false;
|
|
187
191
|
let isEditFTP = false;
|
|
188
|
-
|
|
192
|
+
let isEditWhatsapp = false;
|
|
193
|
+
const isEmailCreate = isCreate && channel === constants.EMAIL;
|
|
189
194
|
if (templateData && channel) {
|
|
190
195
|
channel = templateData.type;// for edit mode with template data
|
|
191
196
|
isEditSms = slidBoxContent === 'editTemplate' && channel === constants.SMS;
|
|
@@ -194,7 +199,8 @@ function SlideBoxContent(props) {
|
|
|
194
199
|
isEditEmailWithId = slidBoxContent === 'editTemplate' && channel === constants.EMAIL && templateData._id;
|
|
195
200
|
isEmailEditWithContent = slidBoxContent === 'editTemplate' && channel === constants.EMAIL && !templateData._id;
|
|
196
201
|
isEditFacebook = slidBoxContent === 'editTemplate' && channel === constants.FACEBOOK;
|
|
197
|
-
|
|
202
|
+
isEditWhatsapp = slidBoxContent === 'editTemplate' && channel === constants.WHATSAPP;
|
|
203
|
+
isPreview = slidBoxContent === 'preview' && (channel === constants.SMS || channel === constants.LINE || channel === constants.VIBER || channel === constants.FACEBOOK || channel === constants.WHATSAPP);
|
|
198
204
|
isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
|
|
199
205
|
isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
|
|
200
206
|
isEditFTP = slidBoxContent === 'editTemplate' && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
|
|
@@ -321,6 +327,11 @@ function SlideBoxContent(props) {
|
|
|
321
327
|
};
|
|
322
328
|
return fbContent;
|
|
323
329
|
}
|
|
330
|
+
case constants.WHATSAPP: {
|
|
331
|
+
return {
|
|
332
|
+
templateMsg: getWhatsappContent(templateDataObject),
|
|
333
|
+
};
|
|
334
|
+
}
|
|
324
335
|
default:
|
|
325
336
|
return get(templateDataObject, `versions.base.content`);
|
|
326
337
|
}
|
|
@@ -355,6 +366,7 @@ function SlideBoxContent(props) {
|
|
|
355
366
|
showDisabledFBInfo={showDisabledFBInfo}
|
|
356
367
|
orgUnitId={orgUnitId}
|
|
357
368
|
smsRegister={smsRegister}
|
|
369
|
+
enableNewChannels={enableNewChannels}
|
|
358
370
|
/>
|
|
359
371
|
)}
|
|
360
372
|
{isPreview && (
|
|
@@ -362,6 +374,7 @@ function SlideBoxContent(props) {
|
|
|
362
374
|
content={getChannelPreviewContent(templateData)}
|
|
363
375
|
viberBrandName={selectedAccount || ""}
|
|
364
376
|
viberAccountName={(selectedAccount || "")[0]}
|
|
377
|
+
whatsappAccountName={selectedAccount}
|
|
365
378
|
unicodeEnabled={get(templateData, `versions.base['unicode-validity']`)}
|
|
366
379
|
channel={(templateData.type || '').toLowerCase()}
|
|
367
380
|
charCounterEnabled={channel === constants.SMS}
|
|
@@ -678,6 +691,28 @@ function SlideBoxContent(props) {
|
|
|
678
691
|
templateData={templateData}
|
|
679
692
|
createNew/> }
|
|
680
693
|
|
|
694
|
+
{isCreateWhatsapp && (<Whatsapp
|
|
695
|
+
isFullMode={isFullMode}
|
|
696
|
+
onCreateComplete={onCreateComplete}
|
|
697
|
+
handleClose={handleClose}/>
|
|
698
|
+
)}
|
|
699
|
+
|
|
700
|
+
{isEditWhatsapp && (<Whatsapp
|
|
701
|
+
isFullMode={isFullMode}
|
|
702
|
+
templateData={templateData}
|
|
703
|
+
getFormData={getFormData}
|
|
704
|
+
getDefaultTags={type}
|
|
705
|
+
forwardedTags={forwardedTags}
|
|
706
|
+
params={{
|
|
707
|
+
id: templateData._id,
|
|
708
|
+
}}
|
|
709
|
+
location={{
|
|
710
|
+
pathname: `/whatsapp/edit`,
|
|
711
|
+
query,
|
|
712
|
+
search: '',
|
|
713
|
+
}}/>
|
|
714
|
+
)}
|
|
715
|
+
|
|
681
716
|
</CreativesWrapper>
|
|
682
717
|
);
|
|
683
718
|
}
|
|
@@ -1,35 +1,63 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
import { FormattedMessage } from 'react-intl';
|
|
4
|
+
import get from 'lodash/get';
|
|
4
5
|
import { CapHeader, CapIcons, CapLabel, CapSteps } from '@capillarytech/cap-ui-library';
|
|
5
6
|
import moment from 'moment';
|
|
6
7
|
import PropTypes from 'prop-types';
|
|
7
8
|
import messages from './messages';
|
|
9
|
+
import whatsppMsg from '../Whatsapp/messages';
|
|
10
|
+
import globalMessages from '../Cap/messages'
|
|
8
11
|
import { MAP_TEMPLATE } from '../WeChat/Wrapper/constants';
|
|
9
|
-
import { NO_COMMUNICATION, FTP } from '../App/constants';
|
|
12
|
+
import { NO_COMMUNICATION, FTP, WHATSAPP } from '../App/constants';
|
|
10
13
|
import { isTraiDLTEnable } from '../../utils/common';
|
|
14
|
+
import { formatString } from '../../utils/Formatter';
|
|
15
|
+
import {
|
|
16
|
+
CAP_SPACE_12,
|
|
17
|
+
} from '@capillarytech/cap-ui-library/styled/variables';
|
|
18
|
+
const { CapLabelInline } = CapLabel;
|
|
19
|
+
const StyledLabel = styled(CapLabelInline)`
|
|
20
|
+
margin-right: ${CAP_SPACE_12};
|
|
21
|
+
`;
|
|
11
22
|
const PrefixWrapper = styled.div`
|
|
12
23
|
margin-right: 16px;
|
|
13
24
|
`;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
no_communication: 'NO_COMMUNICATION',
|
|
21
|
-
ftp: 'FTP',
|
|
22
|
-
};
|
|
23
|
-
return labels[channel.toLowerCase()];
|
|
24
|
-
}
|
|
25
|
+
const renderWhatsappData = (type, value) => (
|
|
26
|
+
<StyledLabel type={type}>
|
|
27
|
+
{value}
|
|
28
|
+
</StyledLabel>
|
|
29
|
+
)
|
|
30
|
+
function SlideBoxHeader(props) {
|
|
25
31
|
|
|
26
32
|
|
|
27
|
-
function SlideBoxHeader(props) {
|
|
28
33
|
const { slidBoxContent, templateData, onShowTemplates, creativesMode, isFullMode, showPrefix, shouldShowTemplateName, channel, templateNameRenderProp, weChatTemplateType, onWeChatMaptemplateStepChange, weChatMaptemplateStep, templateStep, smsRegister } = props;
|
|
29
34
|
const showTemplateNameHeader = isFullMode && shouldShowTemplateName;
|
|
30
35
|
const mapTemplateCreate = !showTemplateNameHeader && slidBoxContent === 'createTemplate' && weChatTemplateType === MAP_TEMPLATE && templateStep !== 'modeSelection';
|
|
31
36
|
const isTraiDlt = isTraiDLTEnable(isFullMode, smsRegister);
|
|
32
37
|
const showCreateTraiSMSHeader = isTraiDlt && channel.toLowerCase() === "sms";
|
|
38
|
+
const isWhatsappEdit = channel.toLowerCase() === WHATSAPP && slidBoxContent === 'editTemplate';
|
|
39
|
+
const whatsappOverview = isWhatsappEdit && isFullMode;
|
|
40
|
+
const headerMessage = whatsappOverview ? messages.whatsappOverview : messages.editMessageContent;
|
|
41
|
+
const {
|
|
42
|
+
whatsappTemplateName,
|
|
43
|
+
whatsappTemplateCategory,
|
|
44
|
+
} = templateData || {};
|
|
45
|
+
const whatsappName = whatsappTemplateName || templateData?.name;
|
|
46
|
+
const whatsappCategory = whatsappTemplateCategory || get(templateData, `versions.base.content.whatsapp.category`, '');
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
const getChannelLabel = (currentChannel = '') => {
|
|
50
|
+
const labels = {
|
|
51
|
+
sms: 'SMS',
|
|
52
|
+
email: 'Email',
|
|
53
|
+
mobilepush: 'Push notification',
|
|
54
|
+
wechat: 'Wechat',
|
|
55
|
+
no_communication: 'NO_COMMUNICATION',
|
|
56
|
+
ftp: 'FTP',
|
|
57
|
+
whatsapp: <FormattedMessage {...messages.whatsappTemplate} />,
|
|
58
|
+
};
|
|
59
|
+
return labels[currentChannel.toLowerCase()];
|
|
60
|
+
};
|
|
33
61
|
|
|
34
62
|
return (
|
|
35
63
|
<div key="creatives-container-slidebox-header-content">
|
|
@@ -57,7 +85,20 @@ function SlideBoxHeader(props) {
|
|
|
57
85
|
)}
|
|
58
86
|
{!showTemplateNameHeader && slidBoxContent === 'editTemplate' && (
|
|
59
87
|
<CapHeader
|
|
60
|
-
title={<FormattedMessage {...
|
|
88
|
+
title={<FormattedMessage {...headerMessage} values={{channel: getChannelLabel(channel)}}/>}
|
|
89
|
+
description={
|
|
90
|
+
isWhatsappEdit && (
|
|
91
|
+
<>
|
|
92
|
+
{renderWhatsappData("label1", <FormattedMessage {...globalMessages.templateNameLabel} />)}
|
|
93
|
+
{renderWhatsappData("label2", whatsappName)}
|
|
94
|
+
{renderWhatsappData("label3", <FormattedMessage {...whatsppMsg.labelSeperator} />)}
|
|
95
|
+
{renderWhatsappData("label1", <FormattedMessage {...whatsppMsg.templateCategoryLabel} />)}
|
|
96
|
+
{renderWhatsappData("label2", formatString(whatsappCategory))}
|
|
97
|
+
{renderWhatsappData("label3", <FormattedMessage {...whatsppMsg.labelSeperator} />)}
|
|
98
|
+
{renderWhatsappData("label1", <FormattedMessage {...whatsppMsg.languageLabel} />)}
|
|
99
|
+
{renderWhatsappData("label2", <FormattedMessage {...whatsppMsg.templateLanguageEnglish} />)}
|
|
100
|
+
</>)
|
|
101
|
+
}
|
|
61
102
|
prefix={creativesMode !== 'edit' && !isFullMode && showPrefix &&
|
|
62
103
|
<PrefixWrapper>
|
|
63
104
|
<CapIcons.backIcon onClick={onShowTemplates} />
|
|
@@ -16,6 +16,7 @@ export const FACEBOOK = "FACEBOOK";
|
|
|
16
16
|
export const FTP = "FTP";
|
|
17
17
|
export const NO_COMMUNICATION = "NO_COMMUNICATION";
|
|
18
18
|
export const VIBER = "VIBER";
|
|
19
|
+
export const WHATSAPP = "WHATSAPP";
|
|
19
20
|
|
|
20
21
|
export const SHOW_CONTANER_LOADER = "app/CreativesContainer/SHOW_CONTANER_LOADER";
|
|
21
22
|
export const HIDE_CONTAINER_LOADER = "app/CreativesContainer/HIDE_CONTAINER_LOADER";
|