@capillarytech/creatives-library 0.1.26 → 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.
Files changed (34) hide show
  1. package/components/CardGrid/index.js +1 -1
  2. package/components/FormBuilder/index.js +72 -0
  3. package/components/PreviewSideBar/index.js +10 -1
  4. package/components/TemplatePreview/index.js +16 -1
  5. package/containers/Cap/index.js +5 -1
  6. package/containers/Email/index.js +12 -2
  7. package/containers/Email/reducer.js +1 -1
  8. package/containers/Line/Create/_lineCreate.scss +37 -0
  9. package/containers/Line/Create/actions.js +90 -0
  10. package/containers/Line/Create/constants.js +39 -0
  11. package/containers/Line/Create/index.js +810 -0
  12. package/containers/Line/Create/messages.js +173 -0
  13. package/containers/Line/Create/reducer.js +99 -0
  14. package/containers/Line/Create/sagas.js +108 -0
  15. package/containers/Line/Create/selectors.js +36 -0
  16. package/containers/Line/Edit/_lineEdit.scss +25 -0
  17. package/containers/Line/Edit/actions.js +72 -0
  18. package/containers/Line/Edit/constants.js +27 -0
  19. package/containers/Line/Edit/index.js +1043 -0
  20. package/containers/Line/Edit/messages.js +157 -0
  21. package/containers/Line/Edit/reducer.js +83 -0
  22. package/containers/Line/Edit/sagas.js +81 -0
  23. package/containers/Line/Edit/selectors.js +29 -0
  24. package/containers/Line/Edit/tests/actions.test.js +18 -0
  25. package/containers/Line/Edit/tests/index.test.js +10 -0
  26. package/containers/Line/Edit/tests/reducer.test.js +9 -0
  27. package/containers/Line/Edit/tests/sagas.test.js +15 -0
  28. package/containers/Line/Edit/tests/selectors.test.js +10 -0
  29. package/containers/MobilePush/Create/index.js +0 -1
  30. package/containers/Templates/index.js +105 -22
  31. package/containers/Templates/messages.js +4 -0
  32. package/package.json +1 -1
  33. package/routes.js +110 -0
  34. 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: `/mobilepush/create/text`,
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: `/mobilepush/create/image`,
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: `/mobilepush/create/${ev.key.toLowerCase()}`,
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "0.1.26",
4
+ "version": "0.1.28",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
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
+ };