@capillarytech/creatives-library 0.1.27 → 0.1.28
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/components/CardGrid/index.js +1 -1
- package/components/FormBuilder/index.js +72 -0
- package/components/PreviewSideBar/index.js +10 -1
- package/components/TemplatePreview/index.js +16 -1
- package/containers/Cap/index.js +5 -1
- package/containers/Email/index.js +12 -2
- package/containers/Email/reducer.js +1 -1
- package/containers/Line/Create/_lineCreate.scss +37 -0
- package/containers/Line/Create/actions.js +90 -0
- package/containers/Line/Create/constants.js +39 -0
- package/containers/Line/Create/index.js +810 -0
- package/containers/Line/Create/messages.js +173 -0
- package/containers/Line/Create/reducer.js +99 -0
- package/containers/Line/Create/sagas.js +108 -0
- package/containers/Line/Create/selectors.js +36 -0
- package/containers/Line/Edit/_lineEdit.scss +25 -0
- package/containers/Line/Edit/actions.js +72 -0
- package/containers/Line/Edit/constants.js +27 -0
- package/containers/Line/Edit/index.js +1043 -0
- package/containers/Line/Edit/messages.js +157 -0
- package/containers/Line/Edit/reducer.js +83 -0
- package/containers/Line/Edit/sagas.js +81 -0
- package/containers/Line/Edit/selectors.js +29 -0
- package/containers/Line/Edit/tests/actions.test.js +18 -0
- package/containers/Line/Edit/tests/index.test.js +10 -0
- package/containers/Line/Edit/tests/reducer.test.js +9 -0
- package/containers/Line/Edit/tests/sagas.test.js +15 -0
- package/containers/Line/Edit/tests/selectors.test.js +10 -0
- package/containers/MobilePush/Create/index.js +0 -1
- package/containers/Templates/index.js +105 -22
- package/containers/Templates/messages.js +4 -0
- package/package.json +1 -1
- package/routes.js +110 -0
- package/services/api.js +8 -0
|
@@ -20,6 +20,7 @@ import { makeSelectCreate as makeSelectCreateMobilePush } from '../MobilePush/Cr
|
|
|
20
20
|
import { makeSelectEbill as makeSelectCreateEbill } from '../Ebill/selectors';
|
|
21
21
|
import { makeSelectEmail as makeSelectCreateEmail } from '../Email/selectors';
|
|
22
22
|
import { makeSelectEdit } from '../Sms/Edit/selectors';
|
|
23
|
+
import { makeSelectLine } from '../Line/Create/selectors';
|
|
23
24
|
import { UserIsAuthenticated } from '../../utils/authWrapper';
|
|
24
25
|
import messages from './messages';
|
|
25
26
|
import * as charCount from '../../utils/smsCharCount';
|
|
@@ -29,6 +30,7 @@ import * as mobilepushActions from '../MobilePush/Create/actions';
|
|
|
29
30
|
import * as smsEditActions from '../Sms/Edit/actions';
|
|
30
31
|
import * as ebillActions from '../Ebill/actions';
|
|
31
32
|
import * as emailActions from '../Email/actions';
|
|
33
|
+
import * as lineActions from '../Line/Create/actions';
|
|
32
34
|
import CardGrid from '../../components/CardGrid';
|
|
33
35
|
import PreviewSideBar from '../../components/PreviewSideBar';
|
|
34
36
|
import './_templates.scss';
|
|
@@ -65,6 +67,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
65
67
|
device: 'desktop',
|
|
66
68
|
searchedTemplates: false,
|
|
67
69
|
defaultAccount: true,
|
|
70
|
+
modeType: null,
|
|
68
71
|
};
|
|
69
72
|
this.handleOnHoverItem = this.handleOnHoverItem.bind(this);
|
|
70
73
|
this.handleOnItemClick = this.handleOnItemClick.bind(this);
|
|
@@ -108,6 +111,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
108
111
|
case "ebill":
|
|
109
112
|
channel = 'Ebill';
|
|
110
113
|
break;
|
|
114
|
+
case "line":
|
|
115
|
+
channel = "Line";
|
|
116
|
+
break;
|
|
111
117
|
default:
|
|
112
118
|
channel = '';
|
|
113
119
|
}
|
|
@@ -120,7 +126,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
120
126
|
if (this.props.location.query.type === 'embedded' && this.isEnabledInLibraryModule("setLocale")) {
|
|
121
127
|
this.setLocale();
|
|
122
128
|
}
|
|
123
|
-
if (this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && !_.isEmpty(this.props.Templates.selectedWeChatAccount))) {
|
|
129
|
+
if (this.state.channel.toLowerCase() === 'line' || this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || ((this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === 'mobilepush') && !_.isEmpty(this.props.Templates.selectedWeChatAccount))) {
|
|
124
130
|
const queryParams = {
|
|
125
131
|
// name: this.state.searchText,
|
|
126
132
|
// sortBy: this.state.sortBy,
|
|
@@ -172,10 +178,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
172
178
|
nextProps.actions.getWeCrmAccounts(channel);
|
|
173
179
|
} else if (nextProps.route.name.toLowerCase() === 'ebill') {
|
|
174
180
|
channel = 'Ebill';
|
|
181
|
+
} else if (nextProps.route.name.toLowerCase() === 'line') {
|
|
182
|
+
channel = 'Line';
|
|
175
183
|
}
|
|
176
184
|
// console.log('Next Props details ', nextProps.route.name, channel);
|
|
177
185
|
this.setState({ channel }, () => {
|
|
178
|
-
if (this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount))) {
|
|
186
|
+
if (this.state.channel.toLowerCase() === 'line' || this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount))) {
|
|
179
187
|
if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
|
|
180
188
|
params.wecrmId = nextProps.Templates.selectedWeChatAccount.configs.wecrm_app_id;
|
|
181
189
|
params.wecrmToken = nextProps.Templates.selectedWeChatAccount.configs.wecrm_token;
|
|
@@ -254,6 +262,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
254
262
|
this.props.emailActions.clearStoreValues();
|
|
255
263
|
}
|
|
256
264
|
|
|
265
|
+
if (this.state.channel.toLowerCase() === "line" && nextProps.Line && nextProps.Line.response && nextProps.Line.response.templateId && nextProps.Line.response.templateId !== '') {
|
|
266
|
+
const message = getMessageObject('success', `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`, true);
|
|
267
|
+
this.props.globalActions.addMessageToQueue(message);
|
|
268
|
+
this.getAllTemplates({params, resetPage: true});
|
|
269
|
+
this.props.lineActions.clearCreateResponse();
|
|
270
|
+
}
|
|
271
|
+
|
|
257
272
|
if (nextProps.Create && this.props.Create && nextProps.Create.createTemplateError && !_.isEqual(nextProps.Create.createTemplateError, this.props.Create.createTemplateError)) {
|
|
258
273
|
const message = getMessageObject('error', this.props.intl.formatMessage(messages.somethingWentWrong), true);
|
|
259
274
|
this.props.globalActions.addMessageToQueue(message);
|
|
@@ -263,6 +278,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
263
278
|
this.props.mobilepushActions.clearCreateResponse();
|
|
264
279
|
} else if (this.state.channel.toLowerCase() === "ebill") {
|
|
265
280
|
this.props.ebillActions.clearCreateResponse();
|
|
281
|
+
} else if (this.state.channel.toLowerCase() === "line") {
|
|
282
|
+
this.props.lineActions.clearCreateResponse();
|
|
266
283
|
}
|
|
267
284
|
}
|
|
268
285
|
|
|
@@ -306,7 +323,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
306
323
|
this.setState({previewTemplate: nextProps.Templates.templateDetails});
|
|
307
324
|
}
|
|
308
325
|
|
|
309
|
-
if (nextProps.Templates.weCrmAccounts !== undefined && nextProps.Templates.weCrmAccounts.length === 1 && this.state.defaultAccount ) {
|
|
326
|
+
if (nextProps.Templates.weCrmAccounts !== undefined && nextProps.Templates.weCrmAccounts.length === 1 && this.state.defaultAccount && (['wechat', 'mobilepush'].indexOf(this.state.channel.toLowerCase()) > -1)) {
|
|
310
327
|
const paramsDefault = {
|
|
311
328
|
name: this.state.searchText,
|
|
312
329
|
sortBy: this.state.sortBy,
|
|
@@ -315,12 +332,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
315
332
|
paramsDefault.wecrmId = nextProps.Templates.weCrmAccounts[0].configs.wecrm_app_id;
|
|
316
333
|
paramsDefault.wecrmToken = nextProps.Templates.weCrmAccounts[0].configs.wecrm_token;
|
|
317
334
|
nextProps.actions.setWeChatAccount(nextProps.Templates.weCrmAccounts[0]);
|
|
318
|
-
this.setState({defaultAccount: false});
|
|
319
335
|
} else if (this.state.channel.toLowerCase() === 'mobilepush') {
|
|
320
336
|
nextProps.actions.setWeChatAccount(nextProps.Templates.weCrmAccounts[0]);
|
|
321
337
|
paramsDefault.accountId = nextProps.Templates.weCrmAccounts[0].id;
|
|
322
|
-
this.setState({defaultAccount: false});
|
|
323
338
|
}
|
|
339
|
+
this.setState({defaultAccount: false});
|
|
324
340
|
this.getAllTemplates({params: paramsDefault}, true);
|
|
325
341
|
}
|
|
326
342
|
}
|
|
@@ -361,7 +377,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
361
377
|
//locale = 'zh';
|
|
362
378
|
console.log('Setting final locale as', locale);
|
|
363
379
|
moment.locale(locale);
|
|
364
|
-
}
|
|
380
|
+
};
|
|
365
381
|
|
|
366
382
|
getMappedLocale = (locale) => {
|
|
367
383
|
const map = {
|
|
@@ -369,7 +385,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
369
385
|
'zh-cn': 'zh',
|
|
370
386
|
};
|
|
371
387
|
return map[locale];
|
|
372
|
-
}
|
|
388
|
+
};
|
|
373
389
|
|
|
374
390
|
getAllTemplates = ({params, getNextPage, resetPage}, resetTemplates) => {
|
|
375
391
|
let queryParams = params;
|
|
@@ -428,6 +444,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
428
444
|
}
|
|
429
445
|
|
|
430
446
|
skipTemplateSelection = (e) => {
|
|
447
|
+
console.log("vvv", e);
|
|
431
448
|
const type = this.props.location.query.type;
|
|
432
449
|
const module = (type === 'embedded') ? this.props.location.query.module : 'default';
|
|
433
450
|
if (this.state.channel.toLowerCase() === 'email') {
|
|
@@ -451,6 +468,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
451
468
|
pathname: `/wechat/edit/${e.template_id}`,
|
|
452
469
|
query: type === 'embedded' ? {type: 'embedded', module, source_account_id: e.source_account_id} : {},
|
|
453
470
|
});
|
|
471
|
+
} else if (this.state.channel.toLowerCase() === 'line') {
|
|
472
|
+
this.props.router.push({
|
|
473
|
+
pathname: `/line/view/${e.msg_type}/`,
|
|
474
|
+
query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {}
|
|
475
|
+
});
|
|
454
476
|
}
|
|
455
477
|
this.setState({loading: true});
|
|
456
478
|
}
|
|
@@ -466,7 +488,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
466
488
|
}
|
|
467
489
|
};
|
|
468
490
|
|
|
469
|
-
handleBlankTemplateAction = (item) => {
|
|
491
|
+
handleBlankTemplateAction = (item, channel) => {
|
|
470
492
|
const type = this.props.location.query.type;
|
|
471
493
|
const module = this.props.location.query.module ? this.props.location.query.module : 'default';
|
|
472
494
|
if (item === "uploadFile") {
|
|
@@ -475,12 +497,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
475
497
|
this.toggleEdmEmailTemplateSelection();
|
|
476
498
|
} else if (item === 'textTemplate') {
|
|
477
499
|
this.props.router.push({
|
|
478
|
-
pathname:
|
|
500
|
+
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/text`,
|
|
479
501
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
480
502
|
});
|
|
481
503
|
} else if (item === 'imageTemplate') {
|
|
482
504
|
this.props.router.push({
|
|
483
|
-
pathname:
|
|
505
|
+
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/image`,
|
|
484
506
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
485
507
|
});
|
|
486
508
|
}
|
|
@@ -693,11 +715,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
693
715
|
createTemplate(ev) {
|
|
694
716
|
const type = this.props.location.query.type;
|
|
695
717
|
const module = this.props.location.query.module ? this.props.location.query.module : 'default';
|
|
718
|
+
const channel = this.state.channel.toLowerCase();
|
|
719
|
+
//const keyType = ev.key && ev.key.toLowerCase() !== undefined ? ev.state.toLowerCase() : '';
|
|
696
720
|
if (this.isEnabledInLibraryModule("callCreateFromProps")) {
|
|
697
721
|
this.props.createNew();
|
|
698
722
|
} else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
|
|
699
723
|
this.props.router.push({
|
|
700
|
-
pathname:
|
|
724
|
+
pathname: `/${channel === 'line' ? 'line' : 'mobilepush'}/create/${ev.key.toLowerCase()}`,
|
|
701
725
|
query: type === 'embedded' ? {type: 'embedded', module} : {module},
|
|
702
726
|
});
|
|
703
727
|
} else {
|
|
@@ -751,7 +775,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
751
775
|
if (this.state.channel.toLowerCase() === "mobilepush") {
|
|
752
776
|
params.accountId = this.props.Templates.selectedWeChatAccount.id;
|
|
753
777
|
}
|
|
754
|
-
if (this.state.channel.toLowerCase() === 'mobilepush' && data.toLowerCase() !== "all") {
|
|
778
|
+
if ( (this.state.channel.toLowerCase() === 'mobilepush' || this.state.channel.toLowerCase() === 'line') && data.toLowerCase() !== "all") {
|
|
755
779
|
params.mode = this.state.mode.toLowerCase();
|
|
756
780
|
}
|
|
757
781
|
this.getAllTemplates({params, resetPage: true});
|
|
@@ -795,6 +819,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
795
819
|
this.props.ebillActions.createTemplate(duplicateObj);
|
|
796
820
|
} else if (this.state.channel.toLowerCase() === "email") {
|
|
797
821
|
this.props.emailActions.duplicateTemplate(template._id, "EMAIL");
|
|
822
|
+
} else if (this.state.channel.toLowerCase() === "line"){
|
|
823
|
+
this.props.lineActions.createTemplate(duplicateObj);
|
|
798
824
|
}
|
|
799
825
|
}
|
|
800
826
|
|
|
@@ -838,8 +864,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
838
864
|
}
|
|
839
865
|
};
|
|
840
866
|
|
|
841
|
-
handleEditClick(e, id) {
|
|
867
|
+
handleEditClick(e, id, modeType) {
|
|
842
868
|
console.log('inside props****', this.props);
|
|
869
|
+
if (modeType && modeType !== undefined) {
|
|
870
|
+
this.setState({modeType});
|
|
871
|
+
}
|
|
843
872
|
const type = this.props.location.query.type;
|
|
844
873
|
const module = this.props.location.query.module;
|
|
845
874
|
const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : false;
|
|
@@ -864,6 +893,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
864
893
|
if (this.state.channel.toLowerCase() === 'ebill') {
|
|
865
894
|
pathName = `/ebill/edit/${id}`;
|
|
866
895
|
}
|
|
896
|
+
if (this.state.channel.toLowerCase() === 'line') {
|
|
897
|
+
pathName = `/line/edit/${modeType}/${id}`;
|
|
898
|
+
}
|
|
867
899
|
if (this.isEnabledInLibraryModule("callSelectFromProps")) {
|
|
868
900
|
this.props.onSelectTemplate(id);
|
|
869
901
|
} else {
|
|
@@ -877,9 +909,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
877
909
|
}
|
|
878
910
|
}
|
|
879
911
|
|
|
880
|
-
handlePreviewClick(template) {
|
|
912
|
+
handlePreviewClick(template, modeType) {
|
|
881
913
|
this.togglePreview();
|
|
882
914
|
const templateInfo = _.cloneDeep(template);
|
|
915
|
+
if (this.state.channel.toLowerCase() === 'line') {
|
|
916
|
+
templateInfo.modeType = modeType;
|
|
917
|
+
}
|
|
883
918
|
templateInfo.updatedByName = commonUtil.getUserNameById(parseInt(template.updatedBy, 10), commonUtil.getMergedUserList(this.props.Templates.userList));
|
|
884
919
|
if (this.state.channel === 'wechat') {
|
|
885
920
|
templateInfo.content = this.prepareWeChatPreviewData(template.versions.base.content, template.versions.base.Tag, template.versions.base.data);
|
|
@@ -935,20 +970,20 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
935
970
|
</div>
|
|
936
971
|
</div>
|
|
937
972
|
</div>);
|
|
938
|
-
} else if (channel === 'mobilepush') {
|
|
973
|
+
} else if (channel === 'mobilepush' || channel === 'line') {
|
|
939
974
|
content = (<div className="sms-template-content">
|
|
940
975
|
<div style={{textAlign: 'center', lineHeight: '260px'}} className="sms-text">
|
|
941
976
|
<div>
|
|
942
977
|
<button
|
|
943
978
|
type="button"
|
|
944
979
|
className="ant-btn cap-button edit-button ant-btn-ghost"
|
|
945
|
-
onClick={() => this.handleBlankTemplateAction('textTemplate')}>
|
|
980
|
+
onClick={() => this.handleBlankTemplateAction('textTemplate', channel)}>
|
|
946
981
|
<span>{this.props.intl.formatMessage(messages.textTemplate)}</span>
|
|
947
982
|
</button>
|
|
948
983
|
<button
|
|
949
984
|
type="button"
|
|
950
985
|
className="ant-btn cap-button preview-button ant-btn-danger"
|
|
951
|
-
onClick={() => this.handleBlankTemplateAction('imageTemplate')}>
|
|
986
|
+
onClick={() => this.handleBlankTemplateAction('imageTemplate', channel)}>
|
|
952
987
|
<span>{this.props.intl.formatMessage(messages.imageTemplate)}</span>
|
|
953
988
|
</button>
|
|
954
989
|
</div>
|
|
@@ -1022,6 +1057,22 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1022
1057
|
{template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
|
|
1023
1058
|
{template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
|
|
1024
1059
|
</div>);
|
|
1060
|
+
} else if (this.state.channel.toLowerCase() === 'line') {
|
|
1061
|
+
//content = template.versions.base.messages[0].Text;
|
|
1062
|
+
content = {
|
|
1063
|
+
bodyText: template.versions.base.content.messages[0].text ? template.versions.base.content.messages[0].text : '',
|
|
1064
|
+
bodyImage: template.versions.base.content.messages[0].originalContentUrl ? template.versions.base.content.messages[0].originalContentUrl : '',
|
|
1065
|
+
};
|
|
1066
|
+
const modeType = template.versions.base.content.messages[0].type;
|
|
1067
|
+
temp.content = (
|
|
1068
|
+
<div className="sms-template-content" key={template._id}>
|
|
1069
|
+
{content.bodyText ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>{content.bodyText || ''}</div> : ''}
|
|
1070
|
+
{content.bodyImage ? <div className={`sms-text ${this.state.hoveredItem === template._id ? 'sms-text-blurred' : ''}`}>
|
|
1071
|
+
<img src={content.bodyImage} alt="Line Image" style={{maxWidth: '100%', objectFit: 'cover', height: '100%'}}/></div> : ''}
|
|
1072
|
+
{template._id === this.state.hoveredItem ? <CapButton onClick={(e) => this.handleEditClick(e, template._id, modeType)} className="edit-button" type="secondary">{type === 'embedded' ? this.props.intl.formatMessage(messages.selectButton) : this.props.intl.formatMessage(messages.editButton)}</CapButton> : ''}
|
|
1073
|
+
{template._id === this.state.hoveredItem ? <CapButton onClick={() => this.handlePreviewClick(template, modeType)} className="preview-button" type="cancel">{this.props.intl.formatMessage(messages.previewButton)}</CapButton> : ''}
|
|
1074
|
+
</div>
|
|
1075
|
+
);
|
|
1025
1076
|
} else {
|
|
1026
1077
|
content = template && template.versions && template.versions.base ? template.versions.base['sms-editor'] : '';
|
|
1027
1078
|
for (let idx = 2; idx <= 5; idx += 1) {
|
|
@@ -1081,7 +1132,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1081
1132
|
return true;
|
|
1082
1133
|
});
|
|
1083
1134
|
return items;
|
|
1084
|
-
}
|
|
1135
|
+
};
|
|
1085
1136
|
|
|
1086
1137
|
toggleEmailPreview = () => {
|
|
1087
1138
|
this.setState({ showHtmlPreview: !this.state.showHtmlPreview }, () => {
|
|
@@ -1089,11 +1140,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1089
1140
|
this.setState({previewTemplate: {}});
|
|
1090
1141
|
}
|
|
1091
1142
|
});
|
|
1092
|
-
}
|
|
1143
|
+
};
|
|
1093
1144
|
|
|
1094
1145
|
changePreviewDevice = (device) => {
|
|
1095
1146
|
this.setState({ device });
|
|
1096
|
-
}
|
|
1147
|
+
};
|
|
1097
1148
|
|
|
1098
1149
|
renderEmailPreviewModal() {
|
|
1099
1150
|
const slideboxContent = (
|
|
@@ -1165,6 +1216,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1165
1216
|
pageHeaderText = this.props.intl.formatMessage(messages.mobilepushHeader);
|
|
1166
1217
|
} else if (this.state.channel.toUpperCase() === 'EBILL') {
|
|
1167
1218
|
pageHeaderText = this.props.intl.formatMessage(messages.ebillHeader);
|
|
1219
|
+
} else if (this.state.channel.toUpperCase() === 'LINE') {
|
|
1220
|
+
pageHeaderText = this.props.intl.formatMessage(messages.lineHeader);
|
|
1168
1221
|
}
|
|
1169
1222
|
}
|
|
1170
1223
|
const options = [
|
|
@@ -1207,7 +1260,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1207
1260
|
<CapSelect key={"select-account"} style={{width: '120px', marginLeft: '16px', minWidth: 'initial'}} defaultValue="Most Recent" onChange={this.handleSortBy} options={options}>
|
|
1208
1261
|
</CapSelect>
|
|
1209
1262
|
</div>
|
|
1210
|
-
{this.state.channel.toLowerCase() === 'mobilepush' &&
|
|
1263
|
+
{ (this.state.channel.toLowerCase() === 'mobilepush' || this.state.channel.toLowerCase() === 'line') &&
|
|
1211
1264
|
<div style={{display: "flex", justifyContent: "space-between", alignItems: 'center', marginLeft: '16px'}}>
|
|
1212
1265
|
<div className="select-font">Type</div>
|
|
1213
1266
|
<CapSelect key={"select-type"} style={{width: '120px', marginLeft: '16px', minWidth: 'initial'}} defaultValue="All" onChange={this.handleType} options={typeOptions}>
|
|
@@ -1247,6 +1300,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1247
1300
|
} else if (this.state.channel.toUpperCase() === "EBILL") {
|
|
1248
1301
|
templateText = "Select Ebill Template";
|
|
1249
1302
|
titleText = "Ebill";
|
|
1303
|
+
} else if (this.state.channel.toUpperCase() === "LINE") {
|
|
1304
|
+
templateText = "Select Line Template";
|
|
1305
|
+
titleText = "Line";
|
|
1250
1306
|
}
|
|
1251
1307
|
const pageHeader = (
|
|
1252
1308
|
<div>
|
|
@@ -1312,11 +1368,33 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1312
1368
|
</div>
|
|
1313
1369
|
</CapButton>
|
|
1314
1370
|
</Dropdown>);
|
|
1371
|
+
} else if (this.props.route.name.toLowerCase() === "line"){
|
|
1372
|
+
const lineMenu = (
|
|
1373
|
+
<Menu onClick={this.createTemplate}>
|
|
1374
|
+
<MenuItem key="text">
|
|
1375
|
+
{this.props.intl.formatMessage(messages.textTemplate)}
|
|
1376
|
+
</MenuItem>
|
|
1377
|
+
<MenuItem key="image">
|
|
1378
|
+
{this.props.intl.formatMessage(messages.imageTemplate)}
|
|
1379
|
+
</MenuItem>
|
|
1380
|
+
</Menu>
|
|
1381
|
+
);
|
|
1382
|
+
actionButton = (<Dropdown overlay={lineMenu} trigger={['click']}>
|
|
1383
|
+
<CapButton style={{paddingLeft: '24px', paddingRight: '4px'}}>
|
|
1384
|
+
<div style={{display: 'inline-flex'}}>
|
|
1385
|
+
<p style={{ lineHeight: '28px'}}>New Template</p>
|
|
1386
|
+
<p style={{ height: '28px'}}>
|
|
1387
|
+
<i style={{ color: '#fff', paddingTop: '2px', margin: '0', paddingRight: '8px'}} className="material-icons">arrow_drop_down</i>
|
|
1388
|
+
</p>
|
|
1389
|
+
</div>
|
|
1390
|
+
</CapButton>
|
|
1391
|
+
</Dropdown>);
|
|
1315
1392
|
} else {
|
|
1316
1393
|
actionButton = (<CapButton onClick={this.createTemplate}>{this.state.channel.toUpperCase() === 'SMS' ? this.props.intl.formatMessage(messages.createSmsActionButton) : 'Create SMS'}</CapButton>);
|
|
1317
1394
|
}
|
|
1318
1395
|
}
|
|
1319
1396
|
|
|
1397
|
+
const lineLoader = (this.props.Templates.getAllTemplatesInProgress && this.state.channel.toLowerCase() === 'line');
|
|
1320
1398
|
const smsLoader = (this.props.Templates.getAllTemplatesInProgress && this.state.channel.toLowerCase() === 'sms');
|
|
1321
1399
|
const wechatLoader = (((this.state.selectedAccount !== '' && this.props.Templates.getAllTemplatesInProgress) || (this.props.Templates.fetchingWeCrmAccounts)) && this.state.channel.toLowerCase() === 'wechat');
|
|
1322
1400
|
const mobilePushLoader = (((this.props.Templates.getAllTemplatesInProgress) || (this.props.Templates.fetchingWeCrmAccounts)) && this.state.channel.toLowerCase() === 'mobilepush');
|
|
@@ -1326,7 +1404,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1326
1404
|
(smsLoader !== undefined ? smsLoader : false) ||
|
|
1327
1405
|
(emailLoader !== undefined ? emailLoader : false) ||
|
|
1328
1406
|
(ebillLoader !== undefined ? ebillLoader : false) ||
|
|
1329
|
-
(mobilePushLoader !== undefined ? mobilePushLoader : false)
|
|
1407
|
+
(mobilePushLoader !== undefined ? mobilePushLoader : false) ||
|
|
1408
|
+
(lineLoader !== undefined ? lineLoader : false);
|
|
1330
1409
|
let previewHeader = this.props.intl.formatMessage(messages.preview);
|
|
1331
1410
|
// const previewHeader = (this.state.channel.toLowerCase() === 'email' ? <h3>{this.props.intl.formatMessage(messages.emailPreview)}</h3> : <h3>{this.props.intl.formatMessage(messages.ebillPreview)}</h3>);
|
|
1332
1411
|
if (this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill') {
|
|
@@ -1355,6 +1434,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1355
1434
|
}
|
|
1356
1435
|
|
|
1357
1436
|
const templateList = this.populateTemplatesList(this.props.TemplatesList, true);
|
|
1437
|
+
|
|
1358
1438
|
const isSearch = this.props.Templates.isSearch;
|
|
1359
1439
|
return (
|
|
1360
1440
|
<div>
|
|
@@ -1458,6 +1538,7 @@ Templates.propTypes = {
|
|
|
1458
1538
|
Global: PropTypes.object,
|
|
1459
1539
|
createNew: PropTypes.func,
|
|
1460
1540
|
onSelectTemplate: PropTypes.func,
|
|
1541
|
+
lineActions: PropTypes.object,
|
|
1461
1542
|
};
|
|
1462
1543
|
|
|
1463
1544
|
const mapStateToProps = createStructuredSelector({
|
|
@@ -1469,6 +1550,7 @@ const mapStateToProps = createStructuredSelector({
|
|
|
1469
1550
|
Edit: makeSelectEdit(),
|
|
1470
1551
|
EmailCreate: makeSelectCreateEmail(),
|
|
1471
1552
|
Global: makeSelectAuthenticated(),
|
|
1553
|
+
Line: makeSelectLine(),
|
|
1472
1554
|
});
|
|
1473
1555
|
|
|
1474
1556
|
function mapDispatchToProps(dispatch) {
|
|
@@ -1480,6 +1562,7 @@ function mapDispatchToProps(dispatch) {
|
|
|
1480
1562
|
ebillActions: bindActionCreators(ebillActions, dispatch),
|
|
1481
1563
|
emailActions: bindActionCreators(emailActions, dispatch),
|
|
1482
1564
|
globalActions: bindActionCreators(globalActions, dispatch),
|
|
1565
|
+
lineActions: bindActionCreators(lineActions, dispatch),
|
|
1483
1566
|
};
|
|
1484
1567
|
}
|
|
1485
1568
|
|
|
@@ -46,6 +46,10 @@ export default defineMessages({
|
|
|
46
46
|
id: 'app.containers.Templates.ebillHeader',
|
|
47
47
|
defaultMessage: 'Ebill',
|
|
48
48
|
},
|
|
49
|
+
lineHeader: {
|
|
50
|
+
id: 'app.containers.Templates.lineHeader',
|
|
51
|
+
defaultMessage: 'Line',
|
|
52
|
+
},
|
|
49
53
|
selectWechatHeader: {
|
|
50
54
|
id: 'app.containers.Templates.selectWechatHeader',
|
|
51
55
|
defaultMessage: 'Select WECHAT Template',
|
package/package.json
CHANGED
package/routes.js
CHANGED
|
@@ -10,6 +10,8 @@ import * as mobilpushSagas from 'containers/MobilePush/Create/sagas';
|
|
|
10
10
|
import * as ebillSagas from 'containers/Ebill/sagas';
|
|
11
11
|
import * as emailSagas from 'containers/Email/sagas';
|
|
12
12
|
import * as templateSagas from 'containers/Templates/sagas';
|
|
13
|
+
import * as lineSagas from 'containers/Line/Create/sagas';
|
|
14
|
+
|
|
13
15
|
const errorLoading = (err) => {
|
|
14
16
|
console.error('Dynamic page loading failed', err); // eslint-disable-line no-console
|
|
15
17
|
};
|
|
@@ -440,6 +442,114 @@ export default function createRoutes(store) {
|
|
|
440
442
|
importModules.catch(errorLoading);
|
|
441
443
|
},
|
|
442
444
|
}, {
|
|
445
|
+
path: '/line',
|
|
446
|
+
name: 'line',
|
|
447
|
+
getComponent(nextState, cb) {
|
|
448
|
+
const importModules = Promise.all([
|
|
449
|
+
import('containers/Templates/reducer'),
|
|
450
|
+
import('containers/Line/Create/reducer'),
|
|
451
|
+
import('containers/Templates/sagas'),
|
|
452
|
+
import('containers/Templates'),
|
|
453
|
+
]);
|
|
454
|
+
|
|
455
|
+
const renderRoute = loadModule(cb);
|
|
456
|
+
|
|
457
|
+
importModules.then(([reducer, createReducer, sagas, component]) => {
|
|
458
|
+
injectReducer('templates', reducer.default);
|
|
459
|
+
injectReducer('lineTemplates', createReducer.default);
|
|
460
|
+
injectSagas(sagas.default);
|
|
461
|
+
injectSagas(rootSaga.default);
|
|
462
|
+
injectSagas(lineSagas.default);
|
|
463
|
+
renderRoute(component);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
importModules.catch(errorLoading);
|
|
467
|
+
},
|
|
468
|
+
}, {
|
|
469
|
+
path: '/line/create/:mode',
|
|
470
|
+
name: 'create line',
|
|
471
|
+
getComponent(nextState, cb) {
|
|
472
|
+
const importModules = Promise.all([
|
|
473
|
+
import('containers/Line/Create/reducer'),
|
|
474
|
+
import('containers/Line/Create/sagas'),
|
|
475
|
+
import('containers/Line/Create'),
|
|
476
|
+
]);
|
|
477
|
+
|
|
478
|
+
const renderRoute = loadModule(cb);
|
|
479
|
+
|
|
480
|
+
importModules.then(([reducer, sagas, component]) => {
|
|
481
|
+
injectReducer('line', reducer.default);
|
|
482
|
+
injectSagas(sagas.default);
|
|
483
|
+
injectSagas(rootSaga.default);
|
|
484
|
+
renderRoute(component);
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
importModules.catch(errorLoading);
|
|
488
|
+
},
|
|
489
|
+
}, {
|
|
490
|
+
path: '/line/view/:mode',
|
|
491
|
+
name: 'view',
|
|
492
|
+
getComponent(nextState, cb) {
|
|
493
|
+
const importModules = Promise.all([
|
|
494
|
+
import('containers/Line/Create/reducer'),
|
|
495
|
+
import('containers/Line/Create/sagas'),
|
|
496
|
+
import('containers/Line/Create'),
|
|
497
|
+
]);
|
|
498
|
+
|
|
499
|
+
const renderRoute = loadModule(cb);
|
|
500
|
+
|
|
501
|
+
importModules.then(([reducer, sagas, component]) => {
|
|
502
|
+
injectReducer('line', reducer.default);
|
|
503
|
+
injectSagas(sagas.default);
|
|
504
|
+
injectSagas(rootSaga.default);
|
|
505
|
+
renderRoute(component);
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
importModules.catch(errorLoading);
|
|
509
|
+
},
|
|
510
|
+
}, {
|
|
511
|
+
path: 'line/edit/text/:id',
|
|
512
|
+
name: 'edit_text',
|
|
513
|
+
getComponent(nextState, cb) {
|
|
514
|
+
const importModules = Promise.all([
|
|
515
|
+
import('containers/Line/Create/reducer'),
|
|
516
|
+
import('containers/Line/Create/sagas'),
|
|
517
|
+
import('containers/Line/Create'),
|
|
518
|
+
]);
|
|
519
|
+
|
|
520
|
+
const renderRoute = loadModule(cb);
|
|
521
|
+
|
|
522
|
+
importModules.then(([reducer, sagas, component]) => {
|
|
523
|
+
injectReducer('line', reducer.default);
|
|
524
|
+
injectSagas(sagas.default);
|
|
525
|
+
injectSagas(rootSaga.default);
|
|
526
|
+
renderRoute(component);
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
importModules.catch(errorLoading);
|
|
530
|
+
},
|
|
531
|
+
}, {
|
|
532
|
+
path: 'line/edit/image/:id',
|
|
533
|
+
name: 'edit_image',
|
|
534
|
+
getComponent(nextState, cb) {
|
|
535
|
+
const importModules = Promise.all([
|
|
536
|
+
import('containers/Line/Create/reducer'),
|
|
537
|
+
import('containers/Line/Create/sagas'),
|
|
538
|
+
import('containers/Line/Create'),
|
|
539
|
+
]);
|
|
540
|
+
|
|
541
|
+
const renderRoute = loadModule(cb);
|
|
542
|
+
|
|
543
|
+
importModules.then(([reducer, sagas, component]) => {
|
|
544
|
+
injectReducer('line', reducer.default);
|
|
545
|
+
injectSagas(sagas.default);
|
|
546
|
+
injectSagas(rootSaga.default);
|
|
547
|
+
renderRoute(component);
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
importModules.catch(errorLoading);
|
|
551
|
+
},
|
|
552
|
+
}, {
|
|
443
553
|
path: '*',
|
|
444
554
|
name: 'notfound',
|
|
445
555
|
getComponent(nextState, cb) {
|
package/services/api.js
CHANGED
|
@@ -296,3 +296,11 @@ export const getEdmTemplates = () => {
|
|
|
296
296
|
const url = `${API_ENDPOINT}/templates/email/default`;
|
|
297
297
|
return request(url, getAPICallObject('GET'));
|
|
298
298
|
};
|
|
299
|
+
|
|
300
|
+
// All about line
|
|
301
|
+
|
|
302
|
+
export const createLineTemplate = ({template}) => {
|
|
303
|
+
console.log('LINE : in api.js', template);
|
|
304
|
+
const url = `${API_ENDPOINT}/templates/LINE`;
|
|
305
|
+
return request(url, getAPICallObject('POST', template));
|
|
306
|
+
};
|