@capillarytech/creatives-library 3.1.31 → 3.1.33

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.
@@ -18,6 +18,10 @@ export default defineMessages({
18
18
  id: 'creatives.components.TemplatePreview.characters',
19
19
  defaultMessage: "characters",
20
20
  },
21
+ charactersPerSms: {
22
+ id: 'creatives.components.TemplatePreview.charactersPerSms',
23
+ defaultMessage: "SMS chars",
24
+ },
21
25
  charactersTotal: {
22
26
  id: 'creatives.components.TemplatePreview.charactersTotal',
23
27
  defaultMessage: "SMS char total",
@@ -28,7 +32,7 @@ export default defineMessages({
28
32
  },
29
33
  includesOptoutTag: {
30
34
  id: 'app.components.TemplatePreview.includesOptoutTag',
31
- defaultMessage: 'Includes Optout tag',
35
+ defaultMessage: 'Includes optout tag',
32
36
  },
33
37
  previewGenerated: {
34
38
  id: 'creatives.components.TemplatePreview.previewGenerated',
package/config/app.js CHANGED
@@ -16,7 +16,7 @@ const config = {
16
16
  api_endpoint: 'https://nightly.capillary.in/arya/api/v1/creatives',
17
17
  auth_endpoint: 'https://nightly.capillary.in/arya/api/v1/auth',
18
18
  arya_endpoint: 'https://nightly.capillary.in/arya/api/v1',
19
- subscription_api_endpoint: 'https://nightly.capillary.in/arya/api/v1/subscription',
19
+ subscription_api_endpoint: 'https://nightly.capillary.in/arya/api/v1/org-settings/subscription',
20
20
  login_url: 'auth/login',
21
21
  dashboard_url: '/sms',
22
22
  dashboard_url_v2: '/v2',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "3.1.31",
4
+ "version": "3.1.33",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -73,30 +73,27 @@ export function updateCharCount(content, isUnicodeEnabled) {
73
73
  var coding = '7bit';
74
74
  var parts = 1;
75
75
  var part = 1;
76
- var chars_used = showOptoutCount ? ((optoutUrl && optoutUrl.length || 0) * noOfOptout) : 0;
76
+ var chars_used = 0;
77
77
  var chars_sms = 160;
78
78
  var sms_parts_container = [];
79
79
  var partc = [];
80
80
  for (let i = 0; i < chars_arr.length; i++) {
81
81
  if (charset7bit.indexOf(chars_arr[i]) >= 0) {
82
82
  chars_used = chars_used + 1;
83
- console.log('X1:', chars_used);
84
83
  } else if (charset7bitext.indexOf(chars_arr[i]) >= 0) {
85
84
  chars_used = chars_used + 2;
86
- console.log('X2:', chars_used);
87
85
  } else {
88
86
  coding = '16bit';
89
87
  chars_used = chars_arr.length;
90
- console.log('X3:', chars_used);
91
88
  break;
92
89
  }
93
90
  }
91
+ chars_used = showOptoutCount ? (chars_used + (((optoutUrl && optoutUrl.length) || 0) * noOfOptout) - (optoutTagLength * noOfOptout)) : chars_used;
94
92
  if (coding == '7bit') {
95
93
  if (chars_used > 160) {
96
94
  var parts = Math.ceil(chars_used / 153);
97
95
  var part_chars_used = 7;
98
96
  chars_sms = 153;
99
- // partc.push(getUHDHtml(parts, part));
100
97
  for (let i = 0; i < chars_arr.length; i++) {
101
98
  if (part_chars_used + 1 > 160) {
102
99
  part = part + 1;
@@ -123,15 +120,12 @@ export function updateCharCount(content, isUnicodeEnabled) {
123
120
  }
124
121
  } else {
125
122
  if (chars_used > 70) {
126
-
127
123
  parts = Math.ceil(chars_used / 67);
128
124
  var part_chars_used = 3;
129
125
  chars_sms = 67;
130
- //partc.push(getUHDHtml(parts, part));
131
126
  for (let i = 0; i < chars_arr.length; i++) {
132
127
  if (part_chars_used + 1 > 70) {
133
128
  part = part + 1;
134
- // partc.push(getUHDHtml(parts, part));
135
129
  part_chars_used = 3;
136
130
  }
137
131
  partc = [...partc, charToSpan(chars_arr[i], coding, isUnicodeEnabled)];
@@ -144,8 +138,6 @@ export function updateCharCount(content, isUnicodeEnabled) {
144
138
  }
145
139
  }
146
140
  }
147
-
148
- chars_used = showOptoutCount ? (chars_used - (optoutTagLength * noOfOptout)) : chars_used;
149
141
  return {
150
142
  unicode: (coding === '7bit' ? false : true),
151
143
  parts,
@@ -12,8 +12,8 @@ import React from 'react';
12
12
  import _ from 'lodash';
13
13
  import { Tabs, Table, Modal} from 'antd';
14
14
  import { CapButton, CapInput, CapPopover, CapCheckbox, CapRadio, CapSelect, CapTable, CapRow, CapColumn, CapNotification, CapUploader, CapHeading, CapIcon} from '@capillarytech/cap-ui-library';
15
+ import { injectIntl, intlShape, FormattedMessage } from 'react-intl';
15
16
  import LabelHOC from '@capillarytech/cap-ui-library/assets/HOCs/ComponentWithLabelHOC';
16
- import { FormattedMessage, intlShape, injectIntl } from 'react-intl';
17
17
  import TemplatePreview from '../TemplatePreview';
18
18
  import TagList from '../../v2Containers/TagList';
19
19
  import SlideBox from '../SlideBox';
@@ -24,7 +24,7 @@ export default defineMessages({
24
24
  },
25
25
  optoutCharactersTotal: {
26
26
  id: 'app.components.TemplatePreview.optoutCharactersTotal',
27
- defaultMessage: "Includes Optout tag ({optoutUrlLength} characters)",
27
+ defaultMessage: "Includes optout tag ({optoutUrlLength} characters)",
28
28
  },
29
29
  smsFormatType: {
30
30
  id: 'creatives.componentsV2.TemplatePreview.smsFormatType',
@@ -60,6 +60,7 @@ function SlideBoxContent(props) {
60
60
  onValidationFail,
61
61
  channelsToHide,
62
62
  forwardedTags,
63
+ channelsToDisable,
63
64
  weChatTemplateType,
64
65
  onWechatTemplateChange,
65
66
  selectedWeChatAccount,
@@ -113,6 +114,7 @@ function SlideBoxContent(props) {
113
114
  cap={cap}
114
115
  channelsToHide={channelsToHide}
115
116
  forwardedTags={forwardedTags}
117
+ channelsToDisable={channelsToDisable}
116
118
  />
117
119
  )}
118
120
  {isPreview && (
@@ -323,6 +325,7 @@ SlideBoxContent.propTypes = {
323
325
  onValidationFail: PropTypes.func,
324
326
  channelsToHide: PropTypes.array,
325
327
  forwardedTags: PropTypes.object,
328
+ channelsToDisable: PropTypes.array,
326
329
  weChatTemplateType: PropTypes.string,
327
330
  onWechatTemplateChange: PropTypes.func,
328
331
  selectedWeChatAccount: PropTypes.object,
@@ -465,7 +465,7 @@ class Creatives extends React.Component {
465
465
  }
466
466
  render() {
467
467
  const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent, mobilePushCreateMode, isDiscardMessage, weChatTemplateType, weChatMaptemplateStep} = this.state;
468
- const {isFullMode, creativesMode, cap, isUploading, channelsToHide, selectedWeChatAccount, forwardedTags} = this.props;
468
+ const {isFullMode, creativesMode, cap, isUploading, channelsToHide, selectedWeChatAccount, forwardedTags, channelsToDisable} = this.props;
469
469
  const mapTemplateCreate = slidBoxContent === 'createTemplate' && weChatTemplateType === MAP_TEMPLATE && templateStep !== 'modeSelection';
470
470
  return (
471
471
  <SlideBoxWrapper className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'} ${mapTemplateCreate ? 'map-template-create' : ''}`)}>
@@ -522,6 +522,7 @@ class Creatives extends React.Component {
522
522
  onValidationFail={this.onValidationFail}
523
523
  channelsToHide={channelsToHide}
524
524
  forwardedTags={forwardedTags}
525
+ channelsToDisable={channelsToDisable}
525
526
  weChatTemplateType={weChatTemplateType}
526
527
  onWechatTemplateChange={this.onWechatTemplateChange}
527
528
  weChatMaptemplateStep={weChatMaptemplateStep}
@@ -573,6 +574,7 @@ Creatives.propTypes = {
573
574
  EmailLayout: PropTypes.string,
574
575
  channelsToHide: PropTypes.array,
575
576
  forwardedTags: PropTypes.object,
577
+ channelsToDisable: PropTypes.array,
576
578
  selectedWeChatAccount: PropTypes.object,
577
579
  };
578
580
  const mapStatesToProps = () => createStructuredSelector({
@@ -12,6 +12,7 @@ import { createStructuredSelector } from 'reselect';
12
12
  import { bindActionCreators } from 'redux';
13
13
  import { CapTab, CapCustomCard, CapButton, CapHeader, CapSpin, CapIcon } from '@capillarytech/cap-ui-library';
14
14
  import { find, get } from 'lodash';
15
+ import isEmpty from 'lodash/isEmpty';
15
16
  import Helmet from 'react-helmet';
16
17
 
17
18
  import { UserIsAuthenticated } from '../../utils/authWrapper';
@@ -31,7 +32,7 @@ const StyledCapTab = withStyles(CapTab, CapTabStyle);
31
32
  export class TemplatesV2 extends React.Component { // eslint-disable-line react/prefer-stateless-function
32
33
  constructor(props) {
33
34
  super(props);
34
- const defaultChannel = get(this, 'props.channel') || get(this, 'props.params.channel') || 'sms';
35
+ let defaultChannel = get(this, 'props.channel') || get(this, 'props.params.channel') || 'sms';
35
36
  const defaultPanes = {
36
37
  sms: {content: <div></div>, tab: props.intl.formatMessage(messages.sms), key: 'sms'},
37
38
  email: {content: <div></div>, tab: props.intl.formatMessage(messages.email), key: 'email'},
@@ -40,8 +41,8 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
40
41
  mPush: {content: <div></div>, tab: props.intl.formatMessage(messages.pushNotification), key: 'mobilepush'},
41
42
  };
42
43
  const channelsToHide = this.props.channelsToHide || [];
43
-
44
- const filteredPanes = Object.keys(defaultPanes)
44
+ const channelsToDisable = this.props.channelsToDisable || [];
45
+ let filteredPanes = Object.keys(defaultPanes)
45
46
  .filter((key) => !channelsToHide.includes(key)).reduce((obj = [], key) => {
46
47
  obj.push(defaultPanes[key]);
47
48
  return obj;
@@ -53,7 +54,26 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
53
54
  filteredPanes.push({content: <div></div>, tab: props.intl.formatMessage(messages.callTask), key: 'call_task'});
54
55
  }
55
56
 
57
+ filteredPanes = filteredPanes.map( (pane) => {
58
+ if (channelsToDisable.includes(pane.key)) {
59
+ pane.disabled = true;
60
+ }
61
+ return pane;
62
+ });
63
+
64
+ const channel = ['sms', 'email', 'mobilepush', 'call_task'];
65
+ if (!isEmpty(channelsToDisable)) {
66
+ channel.some((ch) => {
67
+ if (!channelsToDisable.includes(ch)) {
68
+ defaultChannel = ch;
69
+ return true;
70
+ }
71
+ return false;
72
+ });
73
+ }
74
+
56
75
  const panes = this.setChannelContent(defaultChannel, filteredPanes);
76
+
57
77
  this.state = {
58
78
  selectedChannel: defaultChannel,
59
79
  panes,
@@ -191,6 +211,7 @@ TemplatesV2.propTypes = {
191
211
  onChannelChange: PropTypes.func,
192
212
  channelsToHide: PropTypes.array,
193
213
  className: PropTypes.string.isRequired,
214
+ channelsToDisable: PropTypes.array,
194
215
  };
195
216
 
196
217
  TemplatesV2.defaultProps = {
@@ -8,7 +8,6 @@ import PropTypes from 'prop-types';
8
8
 
9
9
  import React from 'react';
10
10
  import { bindActionCreators } from 'redux';
11
- import Helmet from 'react-helmet';
12
11
  import { intlShape, FormattedMessage } from 'react-intl';
13
12
  import { createStructuredSelector } from 'reselect';
14
13
  import { CapRow, CapColumn, CapSpin, CapCustomCard, CapButton, CapHeading } from '@capillarytech/cap-ui-library';
@@ -1214,7 +1213,7 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
1214
1213
  if (!isLoading && this.props.setIsLoadingContent) {
1215
1214
  this.props.setIsLoadingContent(isLoading);
1216
1215
  }
1217
- return isLoading;
1216
+ return !!isLoading;
1218
1217
  }
1219
1218
 
1220
1219
  render() {
@@ -1233,9 +1232,6 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
1233
1232
  tip={this.props.intl.formatMessage(messages.gettingTemplateData)}
1234
1233
  spinning={spinning}>
1235
1234
  <div>
1236
- <Helmet
1237
- title="WeChat"
1238
- />
1239
1235
  <CapHeading type="h5">Template name</CapHeading>
1240
1236
  <CapHeading type="h3">{weChatData.title}</CapHeading>
1241
1237
  <CapRow className="wechat-container">
@@ -46,7 +46,7 @@ export default defineMessages({
46
46
  id: 'creatives.containersV2.WeChat.link',
47
47
  defaultMessage: 'Link',
48
48
  },
49
- 'Is this internal url': {
49
+ 'isInternalUrl': {
50
50
  id: 'creatives.containersV2.WeChat.isInternalUrl',
51
51
  defaultMessage: 'Is this internal url',
52
52
  },
@@ -94,12 +94,12 @@ export default defineMessages({
94
94
  id: 'creatives.containers.WeChat.newWechat',
95
95
  defaultMessage: 'New wechat',
96
96
  },
97
- "Link cannot be empty.": {
97
+ "linkErrorMessage": {
98
98
  id: 'creatives.containers.WeChat.linkErrorMessage',
99
99
  defaultMessage: 'Link cannot be empty.',
100
100
  },
101
- "Invalid content": {
101
+ "hasInvalidContent": {
102
102
  id: 'creatives.containers.WeChat.hasInvalidContent',
103
- defaultMessage: 'Invalid content.',
103
+ defaultMessage: 'has invalid content.',
104
104
  },
105
105
  });
@@ -17,14 +17,12 @@ import cloneDeep from 'lodash/cloneDeep';
17
17
  import forEach from 'lodash/forEach';
18
18
  import isEqual from 'lodash/isEqual';
19
19
  import get from 'lodash/get';
20
- import { CapRow, CapColumn, CapButton, CapCard, CapSpin, CapInput, CapHeading, CapDivider, CapIcon, CapLink, CapNotification, CapLabel } from '@capillarytech/cap-ui-library';
20
+ import { CapRow, CapColumn, CapButton, CapCard, CapSpin, CapInput, CapHeading, CapDivider, CapIcon, CapLink, CapLabel, CapNotification } from '@capillarytech/cap-ui-library';
21
21
  import makeSelectCreate, {makeSelectTemplates, getAssetDetails, getContentAssetDetails} from './selectors';
22
22
  import * as actions from './actions';
23
23
  import richmediaschema from './richmediaschema';
24
24
  import './_createRichmedia.scss';
25
25
  import messages from './messages';
26
- import * as globalActions from '../../../Cap/actions';
27
- import {getMessageObject} from '../../../../utils/messageUtils';
28
26
  import FormBuilder from '../../../../v2Components/FormBuilder';
29
27
  import WechatRichmediaTemplatePreview from '../../../../v2Components/TemplatePreview/WechatRichmediaTemplatePreview';
30
28
  import noImage from '../../../../assets/noImage.png';
@@ -146,12 +144,14 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
146
144
  }
147
145
  if (nextProps.Create.saveTemplateRes && !isEmpty(nextProps.Create.saveTemplateRes) && nextProps.Create.saveTemplateSuccess && !isEqual(nextProps.Create.saveTemplateRes, this.props.Create.saveTemplateRes)) {
148
146
  this.setState({loading: false});
149
- const message = getMessageObject('success', this.props.intl.formatMessage(messages.saveSuccess), true);
150
- this.props.globalActions.addMessageToQueue(message);
147
+ CapNotification.success({
148
+ message: this.props.intl.formatMessage(messages.saveSuccess),
149
+ });
151
150
  }
152
151
  if (!nextProps.Create.saveTemplateSuccess && nextProps.Create.saveTemplateSuccess !== undefined && nextProps.Create.saveTemplateErrorMessage && nextProps.Create.saveTemplateErrorMessage !== this.props.Create.saveTemplateErrorMessage) {
153
152
  this.setState({loading: false});
154
- this.showErrorMessage(nextProps.Create.saveTemplateErrorMessage);
153
+ this.showErrorMessage(this.props.intl.formatMessage(messages[nextProps.Create.saveTemplateErrorMessage] || messages.somethingWentWrong));
154
+ this.props.onValidationFail();
155
155
  }
156
156
  if (!isEqual(nextProps.templateName, this.props.templateName)) {
157
157
  this.setState({templateName: nextProps.templateName});
@@ -173,16 +173,13 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
173
173
  }
174
174
  onContentChange = (evt) => {
175
175
  const templateData = cloneDeep(this.state.templateData);
176
- console.log('oncontentchange onChange ', evt, evt.editor.getData(), templateData);
177
176
  templateData[this.state.currentContentId].formData['content-value'] = evt.editor.getData();
178
177
  this.setState({templateData});
179
178
  }
180
179
  getEditorInstanse = (instance, id) => {
181
- console.log('Got editor Instance ', instance, id);
182
180
  window.CKEDITOR.on( 'instanceReady', ( event ) => {
183
181
  this.setState({editorInstanse: event.editor});
184
182
  event.editor.on( 'focus', () => {
185
- console.log( 'focused', event.editor, this );
186
183
  this.setState({editorInstanse: event.editor});
187
184
  });
188
185
  });
@@ -198,7 +195,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
198
195
  this.setState({isFormValid});
199
196
  }
200
197
  getCurrentWindow(e) {
201
- console.log("moveToTemplates richmedia getCurrentWindow");
202
198
  const response = {
203
199
  action: e.action,
204
200
  value: 'edit',
@@ -281,8 +277,9 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
281
277
  return temp;
282
278
  }
283
279
  showErrorMessage = (errorMessage) => {
284
- const message = getMessageObject('error', errorMessage, true);
285
- this.props.globalActions.addMessageToQueue(message);
280
+ CapNotification.error({
281
+ message: errorMessage,
282
+ });
286
283
  }
287
284
  checkFormFieldsCount = () => {
288
285
  const templateData = cloneDeep(this.state.templateData);
@@ -545,9 +542,9 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
545
542
  }
546
543
  this.setState({loading: true});
547
544
  this.props.actions.saveTemplate(saveObj, (response) => {
548
- CapNotification.success({
549
- message: this.props.intl.formatMessage(messages.saveSuccess),
550
- });
545
+ // CapNotification.success({
546
+ // message: this.props.intl.formatMessage(messages.saveSuccess),
547
+ // });
551
548
  if (getFormData) {
552
549
  getFormData(this.getFormData({
553
550
  mediaId: response.mediaId,
@@ -562,7 +559,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
562
559
  }
563
560
  }
564
561
  uploadImage = (data, uploadId) => {
565
- console.log("uploadImage", data, uploadId);
566
562
  if (data.type === "wrong file") {
567
563
  this.showErrorMessage(this.props.intl.formatMessage(messages.wrongFormatFile));
568
564
  } else {
@@ -601,12 +597,10 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
601
597
  }
602
598
  viewContent = (id, e) => {
603
599
  e.stopPropagation();
604
- console.log("moveContentUpward viewContent", id);
605
600
  this.setState({currentContentId: id});
606
601
  }
607
602
  deleteContent = (id, e) => {
608
603
  e.stopPropagation();
609
- console.log("clicked delete", id);
610
604
  const modalContent = {
611
605
  title: this.props.intl.formatMessage(messages.modalTitle),
612
606
  body: this.props.intl.formatMessage(messages.deleteContent),
@@ -648,7 +642,6 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
648
642
  templateData[id] = cloneDeep(templateData[id - 1]);
649
643
  templateData[id - 1] = temp;
650
644
  currentContentId = id - 1;
651
- console.log("moveContentUpward", id, this.state.currentContentId, currentContentId);
652
645
  this.setState({templateData, currentContentId});
653
646
  }
654
647
  getCardActionBar = (contentBlocks, id) => (
@@ -981,7 +974,6 @@ Create.propTypes = {
981
974
  Templates: PropTypes.object,
982
975
  ImageData: PropTypes.object,
983
976
  actions: PropTypes.object,
984
- globalActions: PropTypes.object,
985
977
  Create: PropTypes.object,
986
978
  intl: intlShape.isRequired,
987
979
  ContentImageData: PropTypes.object,
@@ -1002,7 +994,6 @@ const mapStateToProps = createStructuredSelector({
1002
994
  function mapDispatchToProps(dispatch) {
1003
995
  return {
1004
996
  actions: bindActionCreators(actions, dispatch),
1005
- globalActions: bindActionCreators(globalActions, dispatch),
1006
997
  };
1007
998
  }
1008
999
 
@@ -7,187 +7,231 @@ import { defineMessages } from 'react-intl';
7
7
 
8
8
  export default defineMessages({
9
9
  "header": {
10
- id: 'creatives.containersV2.Create.header',
10
+ id: 'creatives.containersV2.richMedia.create.header',
11
11
  defaultMessage: 'This is Create container !',
12
12
  },
13
13
  "titleCharacterCount": {
14
- id: 'creatives.containersV2.Create.titleCharacterCount',
14
+ id: 'creatives.containersV2.richMedia.create.titleCharacterCount',
15
15
  defaultMessage: 'Title exceeds character count limit by',
16
16
  },
17
17
  "authorCharacterCount": {
18
- id: 'creatives.containersV2.Create.authorCharacterCount',
18
+ id: 'creatives.containersV2.richMedia.create.authorCharacterCount',
19
19
  defaultMessage: 'Author exceeds character count limit by',
20
20
  },
21
21
  "coverAbstractCharacterCount": {
22
- id: 'creatives.containersV2.Create.coverAbstractCharacterCount',
22
+ id: 'creatives.containersV2.richMedia.create.coverAbstractCharacterCount',
23
23
  defaultMessage: 'Cover abstract exceeds character count limit by',
24
24
  },
25
25
  "saveSuccess": {
26
- id: 'creatives.containersV2.Create.saveSuccess',
26
+ id: 'creatives.containersV2.richMedia.create.saveSuccess',
27
27
  defaultMessage: 'Template saved successfully',
28
28
  },
29
29
  "modalTitle": {
30
- id: 'creatives.containersV2.Create.modalTitle',
30
+ id: 'creatives.containersV2.richMedia.create.modalTitle',
31
31
  defaultMessage: 'Alert',
32
32
  },
33
33
  "modalBody": {
34
- id: 'creatives.containersV2.Create.modalBody',
34
+ id: 'creatives.containersV2.richMedia.create.modalBody',
35
35
  defaultMessage: 'Do you really want to go back? All your temporary changes will be lost!',
36
36
  },
37
37
  "deleteContent": {
38
- id: 'creatives.containersV2.Create.deleteContent',
38
+ id: 'creatives.containersV2.richMedia.create.deleteContent',
39
39
  defaultMessage: 'Do you really want to delete? All your temporary changes will be lost!',
40
40
  },
41
41
  "emptyTemplateName": {
42
- id: 'creatives.containersV2.Create.emptyTemplateName',
42
+ id: 'creatives.containersV2.richMedia.create.emptyTemplateName',
43
43
  defaultMessage: 'Cannot leave template name empty',
44
44
  },
45
45
  "wrongFormatFile": {
46
- id: 'creatives.containersV2.Create.wrongFormatFile',
46
+ id: 'creatives.containersV2.richMedia.create.wrongFormatFile',
47
47
  defaultMessage: 'Wrong file upoaded. Please upload image file',
48
48
  },
49
49
  "formEmpty": {
50
- id: 'creatives.containersV2.Create.formEmpty',
50
+ id: 'creatives.containersV2.richMedia.create.formEmpty',
51
51
  defaultMessage: 'Cannot leave form empty',
52
52
  },
53
53
  "titleEmpty": {
54
- id: 'creatives.containersV2.Create.titleEmpty',
54
+ id: 'creatives.containersV2.richMedia.create.titleEmpty',
55
55
  defaultMessage: 'Cannot leave title field empty',
56
56
  },
57
57
  "noImage": {
58
- id: 'creatives.containersV2.Create.noImage',
58
+ id: 'creatives.containersV2.richMedia.create.noImage',
59
59
  defaultMessage: 'Please upload an image',
60
60
  },
61
61
  "sourceLinkEmpty": {
62
- id: 'creatives.containersV2.Create.sourceLinkEmpty',
62
+ id: 'creatives.containersV2.richMedia.create.sourceLinkEmpty',
63
63
  defaultMessage: 'Cannot leave source link field empty',
64
64
  },
65
65
  "contentEmpty": {
66
- id: 'creatives.containersV2.Create.contentEmpty',
66
+ id: 'creatives.containersV2.richMedia.create.contentEmpty',
67
67
  defaultMessage: 'Cannot leave content field empty',
68
68
  },
69
69
  "titleNameRepeated": {
70
- id: 'creatives.containersV2.Create.titleNameRepeated',
70
+ id: 'creatives.containersV2.richMedia.create.titleNameRepeated',
71
71
  defaultMessage: 'Title name cannot be repeated',
72
72
  },
73
73
  "wrongUrl": {
74
- id: 'creatives.containersV2.Create.wrongUrl',
74
+ id: 'creatives.containersV2.richMedia.create.wrongUrl',
75
75
  defaultMessage: 'Enter correct URL',
76
76
  },
77
77
  "maxContentCount": {
78
- id: 'creatives.containersV2.Create.maxContentCount',
78
+ id: 'creatives.containersV2.richMedia.create.maxContentCount',
79
79
  defaultMessage: 'You have reached the maximum template size',
80
80
  },
81
81
  "addNewRichmedia": {
82
- id: 'creatives.containersV2.Create.addNewRichmedia',
82
+ id: 'creatives.containersV2.richMedia.create.addNewRichmedia',
83
83
  defaultMessage: 'Add richmedia content',
84
84
  },
85
85
  'Title': {
86
- id: 'creatives.containersV2.Create.Title',
86
+ id: 'creatives.containersV2.richMedia.create.Title',
87
87
  defaultMessage: 'Title',
88
88
  },
89
89
  'Please input title': {
90
- id: 'creatives.containersV2.Create.Please_input_title',
90
+ id: 'creatives.containersV2.richMedia.create.Please_input_title',
91
91
  defaultMessage: 'Please input title',
92
92
  },
93
93
  'Author': {
94
- id: 'creatives.containersV2.Create.Author',
94
+ id: 'creatives.containersV2.richMedia.create.Author',
95
95
  defaultMessage: 'Author',
96
96
  },
97
97
  'Please input author': {
98
- id: 'creatives.containersV2.Create.Please_input_author',
98
+ id: 'creatives.containersV2.richMedia.create.Please_input_author',
99
99
  defaultMessage: 'Please input author',
100
100
  },
101
101
  'Cover image': {
102
- id: 'creatives.containersV2.Create.Cover_image',
102
+ id: 'creatives.containersV2.richMedia.create.Cover_image',
103
103
  defaultMessage: 'Cover image',
104
104
  },
105
105
  'Cover abstract': {
106
- id: 'creatives.containersV2.Create.Cover_abstract',
106
+ id: 'creatives.containersV2.richMedia.create.Cover_abstract',
107
107
  defaultMessage: 'Cover abstract',
108
108
  },
109
109
  'Please input cover abstract': {
110
- id: 'creatives.containersV2.Create.Please_input_cover_abstract',
110
+ id: 'creatives.containersV2.richMedia.create.Please_input_cover_abstract',
111
111
  defaultMessage: 'Please input cover abstract',
112
112
  },
113
113
  'Content': {
114
- id: 'creatives.containersV2.Create.Content',
114
+ id: 'creatives.containersV2.richMedia.create.Content',
115
115
  defaultMessage: 'Content',
116
116
  },
117
117
  'Please input content': {
118
- id: 'creatives.containersV2.Create.Please_input_content',
118
+ id: 'creatives.containersV2.richMedia.create.Please_input_content',
119
119
  defaultMessage: 'Please input content',
120
120
  },
121
121
  'Show cover picture': {
122
- id: 'creatives.containersV2.Create.Show_cover_picture',
122
+ id: 'creatives.containersV2.richMedia.create.Show_cover_picture',
123
123
  defaultMessage: 'Show cover picture',
124
124
  },
125
125
  'Who can post comments on this content': {
126
- id: 'creatives.containersV2.Create.Who_can_post_comments_on_this_content',
126
+ id: 'creatives.containersV2.richMedia.create.Who_can_post_comments_on_this_content',
127
127
  defaultMessage: 'Who can post comments on this content',
128
128
  },
129
129
  'No one': {
130
- id: 'creatives.containersV2.Create.No_one',
130
+ id: 'creatives.containersV2.richMedia.create.No_one',
131
131
  defaultMessage: 'No one',
132
132
  },
133
133
  'Anyone': {
134
- id: 'creatives.containersV2.Create.Anyone',
134
+ id: 'creatives.containersV2.richMedia.create.Anyone',
135
135
  defaultMessage: 'Anyone',
136
136
  },
137
137
  'Only followers': {
138
- id: 'creatives.containersV2.Create.Only_followers',
138
+ id: 'creatives.containersV2.richMedia.create.Only_followers',
139
139
  defaultMessage: 'Only followers',
140
140
  },
141
141
  'visibility': {
142
- id: 'creatives.containersV2.Create.visibility',
142
+ id: 'creatives.containersV2.richMedia.create.visibility',
143
143
  defaultMessage: 'visibility',
144
144
  },
145
145
  'delete': {
146
- id: 'creatives.containersV2.Create.delete',
146
+ id: 'creatives.containersV2.richMedia.create.delete',
147
147
  defaultMessage: 'delete',
148
148
  },
149
149
  'This field is required!': {
150
- id: 'creatives.containersV2.Create.requiredField',
150
+ id: 'creatives.containersV2.richMedia.create.requiredField',
151
151
  defaultMessage: 'This field is required!',
152
152
  },
153
153
  "Write a brief headline to draw customer's attention": {
154
- id: 'creatives.containersV2.Create.titleInductiveText',
154
+ id: 'creatives.containersV2.richMedia.create.titleInductiveText',
155
155
  defaultMessage: "Write a brief headline to draw customer's attention",
156
156
  },
157
157
  "Brand/name that your customer will recognise": {
158
- id: 'creatives.containersV2.Create.authorInductiveText',
158
+ id: 'creatives.containersV2.richMedia.create.authorInductiveText',
159
159
  defaultMessage: "Brand/name that your customer will recognise",
160
160
  },
161
161
  'Resolution 360 x 200': {
162
- id: 'creatives.containersV2.Create.resolutionText',
162
+ id: 'creatives.containersV2.richMedia.create.resolutionText',
163
163
  defaultMessage: 'Resolution 360 x 200',
164
164
  },
165
165
  'The relevant image that complements title.': {
166
- id: 'creatives.containersV2.Create.coverImageTitle',
166
+ id: 'creatives.containersV2.richMedia.create.coverImageTitle',
167
167
  defaultMessage: 'The relevant image that complements title.',
168
168
  },
169
169
  'Upload Image': {
170
- id: 'creatives.containersV2.Create.uploadImage',
170
+ id: 'creatives.containersV2.richMedia.create.uploadImage',
171
171
  defaultMessage: 'Upload Image',
172
172
  },
173
173
  'A short description help customers learn more': {
174
- id: 'creatives.containersV2.Create.coverAbstractInductive',
174
+ id: 'creatives.containersV2.richMedia.create.coverAbstractInductive',
175
175
  defaultMessage: 'A short description help customers learn more',
176
176
  },
177
177
  'Article content': {
178
- id: 'creatives.containersV2.Create.articleContent',
178
+ id: 'creatives.containersV2.richMedia.create.articleContent',
179
179
  defaultMessage: 'Article content',
180
180
  },
181
181
  'Insert Image': {
182
- id: 'creatives.containersV2.Create.insertImage',
182
+ id: 'creatives.containersV2.richMedia.create.insertImage',
183
183
  defaultMessage: 'Insert Image',
184
184
  },
185
185
  'Read more link': {
186
- id: 'creatives.containersV2.Create.readMoreLink',
186
+ id: 'creatives.containersV2.richMedia.create.readMoreLink',
187
187
  defaultMessage: 'Read more link',
188
188
  },
189
189
  'Link to help customers discover more about the brand.': {
190
- id: 'creatives.containersV2.Create.linkInductiveText',
190
+ id: 'creatives.containersV2.richMedia.create.linkInductiveText',
191
191
  defaultMessage: 'Link to help customers discover more about the brand.',
192
192
  },
193
+ 'somethingWentWrong': {
194
+ id: 'creatives.containersV2.richMedia.create.somethingWentWrong',
195
+ defaultMessage: 'Something went wrong!!',
196
+ },
197
+ 'Template with the same name exists. Please try another template name.': {
198
+ id: 'creatives.containersV2.richMedia.create.templateNameExists',
199
+ defaultMessage: 'Template with the same name exists. Please try another template name.',
200
+ },
201
+ 'Template name cannot be blank!': {
202
+ id: 'creatives.containersV2.richMedia.create.templateNameBlank',
203
+ defaultMessage: 'Template name cannot be blank',
204
+ },
205
+ 'Template name contains only whitespaces': {
206
+ id: 'creatives.containersV2.richMedia.create.templateNameContainsWS',
207
+ defaultMessage: 'Template name contains only whitespaces',
208
+ },
209
+ 'Please provide payload to the wechat template': {
210
+ id: 'creatives.containersV2.richMedia.create.payloadMissing',
211
+ defaultMessage: 'Please provide payload to create wechat template',
212
+ },
213
+ 'Please provide source account identifier': {
214
+ id: 'creatives.containersV2.richMedia.create.sourceIdentMissing',
215
+ defaultMessage: 'Please provide source account identifier',
216
+ },
217
+ 'Please provide sufficient parameters to generate richmedia message payload': {
218
+ id: 'creatives.containersV2.richMedia.create.sufficientPayload',
219
+ defaultMessage: 'Please provide sufficient parameters to generate richmedia message payload',
220
+ },
221
+ 'Please provide sufficient params to create richmedia wechat template': {
222
+ id: 'creatives.containersV2.richMedia.create.sufficientParam',
223
+ defaultMessage: 'Please provide sufficient params to create richmedia wechat template',
224
+ },
225
+ 'Upload has failed': {
226
+ id: 'creatives.containersV2.richMedia.create.uploadFailed',
227
+ defaultMessage: 'Upload has failed',
228
+ },
229
+ 'Template with the same name exists': {
230
+ id: 'creatives.containersV2.richMedia.create.sameTemplateExists',
231
+ defaultMessage: 'Template with the same name exists',
232
+ },
233
+ 'Failed to get File content': {
234
+ id: 'creatives.containersV2.richMedia.create.fileContentFailed',
235
+ defaultMessage: 'Failed to get File content',
236
+ },
193
237
  });
@@ -25,7 +25,7 @@ export function* saveTemplate({template, callback}) {
25
25
  if (!result.success || result.status.code === 500) {
26
26
  errorMsg = result.message;
27
27
  }
28
- if (callback) {
28
+ if (callback && !errorMsg) {
29
29
  yield call(callback, result.response);
30
30
  }
31
31
  yield put({ type: types.SAVE_TEMPLATE_SUCCESS, data: result.response, statusCode: result.status ? result.status.code : '', errorMsg});
@@ -8,7 +8,6 @@ import PropTypes from 'prop-types';
8
8
 
9
9
  import React from 'react';
10
10
  import { connect } from 'react-redux';
11
- import Helmet from 'react-helmet';
12
11
  import { FormattedMessage } from 'react-intl';
13
12
  import { createStructuredSelector } from 'reselect';
14
13
  import makeSelectView from './selectors';
@@ -18,12 +17,6 @@ export class View extends React.PureComponent { // eslint-disable-line react/pre
18
17
  render() {
19
18
  return (
20
19
  <div>
21
- <Helmet
22
- title="View"
23
- meta={[
24
- { name: 'description', content: 'Description of View' },
25
- ]}
26
- />
27
20
  <FormattedMessage {...messages.header} />
28
21
  </div>
29
22
  );