@capillarytech/creatives-library 3.2.4 → 3.3.1

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 (69) hide show
  1. package/app.js +1 -1
  2. package/components/FormBuilder/index.js +1 -1
  3. package/components/Header/index.js +4 -3
  4. package/components/Header/messages.js +4 -0
  5. package/config/app.js +2 -0
  6. package/containers/Assets/Gallery/index.js +1 -1
  7. package/containers/Cap/index.js +4 -5
  8. package/containers/Email/index.js +2 -2
  9. package/containers/Email/messages.js +8 -0
  10. package/containers/LanguageProvider/index.js +28 -4
  11. package/containers/Templates/index.js +2 -2
  12. package/containers/Templates/messages.js +24 -4
  13. package/containers/WeChat/RichmediaTemplates/Create/messages.js +24 -0
  14. package/i18n.js +16 -9
  15. package/index.js +6 -0
  16. package/package.json +1 -4
  17. package/reducers.js +1 -1
  18. package/routes.js +2 -1
  19. package/services/api.js +11 -2
  20. package/translations/en.json +120 -63
  21. package/translations/zh.json +117 -60
  22. package/utils/smsCharCountV2.js +1 -1
  23. package/v2Components/CapTagList/index.js +2 -2
  24. package/v2Components/FormBuilder/index.js +7 -4
  25. package/v2Components/NavigationBar/index.js +11 -17
  26. package/v2Components/NavigationBar/messages.js +28 -0
  27. package/v2Components/NewCallTask/index.js +3 -1
  28. package/v2Components/TopBar/index.js +3 -0
  29. package/v2Components/TopBar/messages.js +8 -0
  30. package/v2Containers/Assets/Gallery/index.js +12 -6
  31. package/v2Containers/Assets/Gallery/messages.js +4 -0
  32. package/v2Containers/CallTask/index.js +3 -1
  33. package/v2Containers/Cap/index.js +3 -2
  34. package/v2Containers/CreativesContainer/SlideBoxContent.js +14 -1
  35. package/v2Containers/CreativesContainer/index.js +6 -1
  36. package/v2Containers/Email/index.js +10 -7
  37. package/v2Containers/Email/messages.js +16 -0
  38. package/v2Containers/EmailWrapper/index.js +12 -9
  39. package/v2Containers/LanguageProvider/actions.js +9 -4
  40. package/v2Containers/LanguageProvider/constants.js +7 -1
  41. package/v2Containers/LanguageProvider/index.js +49 -12
  42. package/v2Containers/LanguageProvider/reducer.js +11 -9
  43. package/v2Containers/LanguageProvider/selectors.js +1 -1
  44. package/v2Containers/MobilePush/Create/index.js +2 -1
  45. package/v2Containers/MobilePush/Create/messages.js +4 -0
  46. package/v2Containers/MobilePush/Edit/index.js +2 -1
  47. package/v2Containers/MobilePush/Edit/messages.js +4 -0
  48. package/v2Containers/Sms/Create/index.js +3 -1
  49. package/v2Containers/Sms/Create/messages.js +16 -0
  50. package/v2Containers/Sms/Edit/index.js +3 -1
  51. package/v2Containers/Sms/Edit/messages.js +16 -0
  52. package/v2Containers/TagList/index.js +43 -0
  53. package/v2Containers/Templates/_templates.scss +9 -1
  54. package/v2Containers/Templates/index.js +66 -53
  55. package/v2Containers/TemplatesV2/index.js +54 -54
  56. package/v2Containers/WeChat/MapTemplates/index.js +0 -1
  57. package/v2Containers/WeChat/MapTemplates/messages.js +1 -1
  58. package/v2Containers/WeChat/RichmediaTemplates/Create/_createRichmedia.scss +10 -0
  59. package/v2Containers/WeChat/RichmediaTemplates/Create/actions.js +9 -0
  60. package/v2Containers/WeChat/RichmediaTemplates/Create/constants.js +3 -0
  61. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +146 -4
  62. package/v2Containers/WeChat/RichmediaTemplates/Create/messages.js +86 -57
  63. package/v2Containers/WeChat/RichmediaTemplates/Create/reducer.js +24 -1
  64. package/v2Containers/WeChat/RichmediaTemplates/Create/sagas.js +45 -0
  65. package/v2Containers/WeChat/RichmediaTemplates/Edit/constants.js +4 -0
  66. package/v2Containers/WeChat/RichmediaTemplates/Edit/index.js +8 -1
  67. package/v2Containers/WeChat/Wrapper/_wrapper.scss +9 -1
  68. package/v2Containers/WeChat/Wrapper/messages.js +5 -5
  69. package/v2Containers/TemplatesV2/_templatesV2.scss +0 -5
@@ -120,15 +120,18 @@ export class Gallery extends React.Component { // eslint-disable-line react/pref
120
120
  getAllAssets = ({params, getNextPage, resetPage}, isReRender = false) => {
121
121
  let queryParams = params;
122
122
  let page = this.state.page;
123
+ let shouldFetchGalleryAssets = false;
123
124
  if (!this.props.Gallery.fetchingAllAssets && ((resetPage || (page === 1 && this.state.totalCount === 0) || page <= (this.state.totalCount / this.state.perPageLimit)) || isReRender )) {
124
125
  if (getNextPage) {
125
126
  page += 1;
127
+ shouldFetchGalleryAssets = true;
126
128
  }
127
129
 
128
130
  let totalCount = this.state.totalCount;
129
131
  if (resetPage) {
130
132
  page = 1;
131
133
  totalCount = 0;
134
+ shouldFetchGalleryAssets = true;
132
135
  }
133
136
  if ((!params || _.isEmpty(params))) {
134
137
  queryParams = {
@@ -137,12 +140,15 @@ export class Gallery extends React.Component { // eslint-disable-line react/pref
137
140
  }
138
141
  if (this.state.searchText !== "") {
139
142
  queryParams = {...queryParams, name: this.state.searchText};
143
+ shouldFetchGalleryAssets = true;
144
+ }
145
+ if (!this.props.Gallery.fetchingAllAssets && (_.isEmpty(this.props.Gallery.assetList) || shouldFetchGalleryAssets)) {
146
+ this.setState({page, totalCount}, () => {
147
+ queryParams.page = page;
148
+ queryParams.perPage = this.state.perPageLimit;
149
+ this.props.actions.getAllAssets('image', queryParams);
150
+ });
140
151
  }
141
- this.setState({page, totalCount}, () => {
142
- queryParams.page = page;
143
- queryParams.perPage = this.state.perPageLimit;
144
- this.props.actions.getAllAssets('image', queryParams);
145
- });
146
152
  }
147
153
  };
148
154
  handleGallery = (e) => {
@@ -431,7 +437,7 @@ export class Gallery extends React.Component { // eslint-disable-line react/pref
431
437
  </div>
432
438
  ) : <input style={{ display: 'none'}} id="fileName" type="file" onChange={(e) => this.uploadImages(e, {files: e.target.files})} accept="image/*" multiple/>;
433
439
  const isLoading = this.props.Gallery.assetUploading || this.props.Gallery.fetchingAllAssets;
434
- const loadingTip = "Loading gallery... ";
440
+ const loadingTip = <FormattedMessage {...messages.loadingGallery} />;
435
441
 
436
442
  return (
437
443
  <div>
@@ -102,4 +102,8 @@ export default defineMessages({
102
102
  id: `creatives.containersV2.Assets.Gallery.noTemplatesFound`,
103
103
  defaultMessage: 'No templates found',
104
104
  },
105
+ loadingGallery: {
106
+ id: `creatives.containersV2.Assets.Gallery.loadingGallery`,
107
+ defaultMessage: 'Loading gallery...',
108
+ },
105
109
  });
@@ -70,7 +70,7 @@ export class CallTask extends React.Component { // eslint-disable-line react/pre
70
70
  };
71
71
  }
72
72
  render() {
73
- const { intl, onCallTaskSubmit, templateData, loadingMetaEntities, metaEntities } = this.props;
73
+ const { intl, onCallTaskSubmit, templateData, loadingMetaEntities, metaEntities, selectedOfferDetails } = this.props;
74
74
  const { formatMessage } = intl;
75
75
  const { mode } = this.state;
76
76
  return (
@@ -82,6 +82,7 @@ export class CallTask extends React.Component { // eslint-disable-line react/pre
82
82
  mode={mode}
83
83
  templateData={templateData}
84
84
  onCallTaskSubmit={onCallTaskSubmit}
85
+ selectedOfferDetails={selectedOfferDetails}
85
86
  />
86
87
  :
87
88
  <div>
@@ -132,6 +133,7 @@ CallTask.propTypes = {
132
133
  showContentInSlidebox: PropTypes.bool,
133
134
  onCreateNew: PropTypes.func,
134
135
  isFullMode: PropTypes.bool,
136
+ selectedOfferDetails: PropTypes.array,
135
137
  };
136
138
 
137
139
 
@@ -74,7 +74,6 @@ export class Cap extends React.Component { // eslint-disable-line react/prefer-s
74
74
  //locale = 'zh';
75
75
  console.log('Setting final locale as', locale);
76
76
  moment.locale(locale);
77
- this.props.locationActions.changeLocale(locale);
78
77
  }
79
78
 
80
79
  componentWillReceiveProps(nextProps) {
@@ -132,8 +131,10 @@ export class Cap extends React.Component { // eslint-disable-line react/prefer-s
132
131
 
133
132
  getMappedLocale(locale) {
134
133
  const map = {
135
- 'en': 'en',
134
+ 'en': 'en-US',
136
135
  'zh-cn': 'zh',
136
+ 'en-US': 'en-US',
137
+ 'zh': 'zh',
137
138
  };
138
139
  return map[locale];
139
140
  }
@@ -60,6 +60,8 @@ function SlideBoxContent(props) {
60
60
  onValidationFail,
61
61
  channelsToHide,
62
62
  forwardedTags,
63
+ selectedOfferDetails,
64
+ channelsToDisable,
63
65
  weChatTemplateType,
64
66
  onWechatTemplateChange,
65
67
  selectedWeChatAccount,
@@ -113,6 +115,7 @@ function SlideBoxContent(props) {
113
115
  cap={cap}
114
116
  channelsToHide={channelsToHide}
115
117
  forwardedTags={forwardedTags}
118
+ channelsToDisable={channelsToDisable}
116
119
  />
117
120
  )}
118
121
  {isPreview && (
@@ -174,6 +177,7 @@ function SlideBoxContent(props) {
174
177
  getDefaultTags={type}
175
178
  templateData={templateData}
176
179
  forwardedTags={forwardedTags}
180
+ selectedOfferDetails={selectedOfferDetails}
177
181
  />
178
182
  )}
179
183
  {
@@ -183,6 +187,7 @@ function SlideBoxContent(props) {
183
187
  templateData={templateData}
184
188
  onCallTaskSubmit={onCallTaskSubmit}
185
189
  forwardedTags={forwardedTags}
190
+ selectedOfferDetails={selectedOfferDetails}
186
191
  />
187
192
  }
188
193
  {
@@ -191,6 +196,7 @@ function SlideBoxContent(props) {
191
196
  mode={'create'}
192
197
  onCallTaskSubmit={onCallTaskSubmit}
193
198
  forwardedTags={forwardedTags}
199
+ selectedOfferDetails={selectedOfferDetails}
194
200
  />
195
201
  }
196
202
  {isCreateSms && (
@@ -204,6 +210,7 @@ function SlideBoxContent(props) {
204
210
  getDefaultTags={type}
205
211
  isFullMode={isFullMode}
206
212
  forwardedTags={forwardedTags}
213
+ selectedOfferDetails={selectedOfferDetails}
207
214
  />
208
215
  )}
209
216
  {isEmailCreate && (
@@ -225,6 +232,7 @@ function SlideBoxContent(props) {
225
232
  showTemplateName={showTemplateName}
226
233
  onValidationFail={onValidationFail}
227
234
  forwardedTags={forwardedTags}
235
+ selectedOfferDetails={selectedOfferDetails}
228
236
  />
229
237
  )}
230
238
  {(isEditEmailWithId || isEmailEditWithContent) && (
@@ -247,6 +255,7 @@ function SlideBoxContent(props) {
247
255
  showTemplateName={showTemplateName}
248
256
  onValidationFail={onValidationFail}
249
257
  forwardedTags={forwardedTags}
258
+ selectedOfferDetails={selectedOfferDetails}
250
259
  />
251
260
  )}
252
261
  {isEditMPush &&
@@ -266,6 +275,7 @@ function SlideBoxContent(props) {
266
275
  getDefaultTags={type}
267
276
  onValidationFail={onValidationFail}
268
277
  forwardedTags={forwardedTags}
278
+ selectedOfferDetails={selectedOfferDetails}
269
279
  />
270
280
  }
271
281
  {isCreateMPush &&
@@ -289,7 +299,8 @@ function SlideBoxContent(props) {
289
299
  showTemplateName={showTemplateName}
290
300
  query={query}
291
301
  forwardedTags={forwardedTags}
292
- onValidationFail={onValidationFail}/>
302
+ onValidationFail={onValidationFail}
303
+ selectedOfferDetails={selectedOfferDetails}/>
293
304
  }
294
305
  </CreativesWrapper>
295
306
  );
@@ -323,6 +334,8 @@ SlideBoxContent.propTypes = {
323
334
  onValidationFail: PropTypes.func,
324
335
  channelsToHide: PropTypes.array,
325
336
  forwardedTags: PropTypes.object,
337
+ selectedOfferDetails: PropTypes.array,
338
+ channelsToDisable: PropTypes.array,
326
339
  weChatTemplateType: PropTypes.string,
327
340
  onWechatTemplateChange: PropTypes.func,
328
341
  selectedWeChatAccount: PropTypes.object,
@@ -465,8 +465,9 @@ 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, selectedOfferDetails} = this.props;
469
469
  const mapTemplateCreate = slidBoxContent === 'createTemplate' && weChatTemplateType === MAP_TEMPLATE && templateStep !== 'modeSelection';
470
+ /* TODO: Instead of passing down same props separately to each component down, write common function to these props and pass it accordingly */
470
471
  return (
471
472
  <SlideBoxWrapper className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'} ${mapTemplateCreate ? 'map-template-create' : ''}`)}>
472
473
  <CapSlideBox
@@ -522,6 +523,8 @@ class Creatives extends React.Component {
522
523
  onValidationFail={this.onValidationFail}
523
524
  channelsToHide={channelsToHide}
524
525
  forwardedTags={forwardedTags}
526
+ selectedOfferDetails={selectedOfferDetails}
527
+ channelsToDisable={channelsToDisable}
525
528
  weChatTemplateType={weChatTemplateType}
526
529
  onWechatTemplateChange={this.onWechatTemplateChange}
527
530
  weChatMaptemplateStep={weChatMaptemplateStep}
@@ -573,6 +576,8 @@ Creatives.propTypes = {
573
576
  EmailLayout: PropTypes.string,
574
577
  channelsToHide: PropTypes.array,
575
578
  forwardedTags: PropTypes.object,
579
+ selectedOfferDetails: PropTypes.array,
580
+ channelsToDisable: PropTypes.array,
576
581
  selectedWeChatAccount: PropTypes.object,
577
582
  };
578
583
  const mapStatesToProps = () => createStructuredSelector({
@@ -58,7 +58,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
58
58
  showImageSelectionBox: false,
59
59
  isDragDrop: false,
60
60
  showConfirmationModal: false,
61
- modalContent: {title: this.props.intl.formatMessage(messages.alertMessage), body: this.props.intl.formatMessage(messages.deleteLanguageConfirmation), type: 'confirm', id: 'email-language-delete-modal'},
61
+ modalContent: {title: this.props.intl.formatMessage(messages.alert), body: this.props.intl.formatMessage(messages.deleteLanguageConfirmation), type: 'confirm', id: 'email-language-delete-modal'},
62
62
  showModal: false,
63
63
  page: 1,
64
64
  perPageLimit: 25,
@@ -906,14 +906,14 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
906
906
  let modalContent = {};
907
907
  if (type === 'delete-version') {
908
908
  modalContent = {
909
- title: this.props.intl.formatMessage(messages.alertMessage),
909
+ title: this.props.intl.formatMessage(messages.alert),
910
910
  body: this.props.intl.formatMessage(messages.deleteVersionConfirmation),
911
911
  type: 'confirm',
912
912
  id: 'email-version-delete-modal',
913
913
  };
914
914
  } else if (type === 'delete-language') {
915
915
  modalContent = {
916
- title: this.props.intl.formatMessage(messages.alertMessage),
916
+ title: this.props.intl.formatMessage(messages.alert),
917
917
  body: this.props.intl.formatMessage(messages.deleteLanguageConfirmation),
918
918
  type: 'confirm',
919
919
  id: 'email-language-delete-modal',
@@ -1001,7 +1001,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
1001
1001
  showImageSelectionBox: false,
1002
1002
  isDragDrop: false,
1003
1003
  showConfirmationModal: false,
1004
- modalContent: {title: this.props.intl.formatMessage(messages.alertMessage), body: this.props.intl.formatMessage(messages.deleteLanguageConfirmation), type: 'confirm', id: 'email-language-delete-modal'},
1004
+ modalContent: {title: this.props.intl.formatMessage(messages.alert), body: this.props.intl.formatMessage(messages.deleteLanguageConfirmation), type: 'confirm', id: 'email-language-delete-modal'},
1005
1005
  showModal: false,
1006
1006
  page: 1,
1007
1007
  perPageLimit: 25,
@@ -1823,7 +1823,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
1823
1823
 
1824
1824
  moveToTemplates = () => {
1825
1825
  const modalContent = {
1826
- title: this.props.intl.formatMessage(messages.alertMessage),
1826
+ title: this.props.intl.formatMessage(messages.alert),
1827
1827
  body: this.props.intl.formatMessage(messages.goBackTemporaryChangesLost),
1828
1828
  type: 'confirm',
1829
1829
  id: 'template-back-confirm-modal',
@@ -2559,9 +2559,10 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
2559
2559
  // const actionComponents = '';
2560
2560
  const schema = this.state.schema;
2561
2561
  const isLoading = this.isEmailLoading();
2562
- const previewHeader = (<h3>Email Preview</h3>);
2563
- const imagePreviewHeader = (<h3>Image Selection</h3>);
2562
+ const previewHeader = (<h3>{this.props.intl.formatMessage(messages.h3emailPreview)}</h3>);
2563
+ const imagePreviewHeader = (<h3>{this.props.intl.formatMessage(messages.h3imageSelection)}</h3>);
2564
2564
  const imagePreviewContent = this.getImagePreviewContent();
2565
+ const { selectedOfferDetails } = this.props;
2565
2566
  if (!this.props.currentOrgDetails || !this.props.currentOrgDetails.basic_details) {
2566
2567
  return (<div>Loading...</div>);
2567
2568
  }
@@ -2617,6 +2618,7 @@ export class Email extends React.Component { // eslint-disable-line react/prefer
2617
2618
  getValidationData={this.saveValidationData}
2618
2619
  saveForm={this.state.saveForm}
2619
2620
  stopValidation={this.stopValidation}
2621
+ selectedOfferDetails={selectedOfferDetails}
2620
2622
  /> : ''}
2621
2623
  </Col>
2622
2624
  </Row>
@@ -2669,6 +2671,7 @@ Email.propTypes = {
2669
2671
  defaultData: PropTypes.object,
2670
2672
  showTemplateName: PropTypes.func,
2671
2673
  onValidationFail: PropTypes.func,
2674
+ selectedOfferDetails: PropTypes.array,
2672
2675
  };
2673
2676
 
2674
2677
  const mapStateToProps = (state, props) => createStructuredSelector({
@@ -278,4 +278,20 @@ export default defineMessages({
278
278
  id: 'creatives.containersV2.Email.alertMessage',
279
279
  defaultMessage: 'Alert',
280
280
  },
281
+ "h3emailPreview": {
282
+ id: 'creatives.containersV2.Email.h3emailPreview',
283
+ defaultMessage: 'Email preview',
284
+ },
285
+ "h3imageSelection": {
286
+ id: 'creatives.containersV2.Email.h3imageSelection',
287
+ defaultMessage: 'Image selection',
288
+ },
289
+ "English": {
290
+ id: 'creatives.containersV2.Email.english',
291
+ defaultMessage: 'English',
292
+ },
293
+ "Add label": {
294
+ id: 'creatives.containersV2.Email.addLabel',
295
+ defaultMessage: 'Add label',
296
+ },
281
297
  });
@@ -173,6 +173,7 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
173
173
  setIsLoadingContent,
174
174
  onValidationFail,
175
175
  forwardedTags,
176
+ selectedOfferDetails,
176
177
  } = this.props;
177
178
  const {
178
179
  templateName,
@@ -203,15 +204,15 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
203
204
  </CardContainer>
204
205
  <div>
205
206
  {emailCreateMode === "upload" &&
206
- <div style={{ marginLeft: '8px'}}>
207
- <CapUploader onChange={this.useFileUpload} accept=".zip, .html, .htm" showUploadList={false}>
208
- <CapButton>{this.props.intl.formatMessage(messages.upload)}</CapButton>
209
- </CapUploader>
210
- {!_.isEmpty(EmailLayout) &&
211
- <div>{_.get(modeContent, "file.name")}</div>
212
- }
213
- </div>
214
- }
207
+ <div style={{ marginLeft: '8px' }}>
208
+ <CapUploader onChange={this.useFileUpload} accept=".zip, .html, .htm" showUploadList={false}>
209
+ <CapButton>{this.props.intl.formatMessage(messages.upload)}</CapButton>
210
+ </CapUploader>
211
+ {!_.isEmpty(EmailLayout) &&
212
+ <div>{_.get(modeContent, "file.name")}</div>
213
+ }
214
+ </div>
215
+ }
215
216
  </div>
216
217
  </div>
217
218
  :
@@ -232,6 +233,7 @@ export class EmailWrapper extends React.Component { // eslint-disable-line react
232
233
  showTemplateName={showTemplateName}
233
234
  onValidationFail={onValidationFail}
234
235
  forwardedTags={forwardedTags}
236
+ selectedOfferDetails={selectedOfferDetails}
235
237
  />}
236
238
  {CmsTemplates && !isShowEmailCreate && <CmsTemplatesComponent cmsTemplates={CmsTemplates} handleEdmDefaultTemplateSelection={this.useEditor} />}
237
239
  </div>
@@ -263,6 +265,7 @@ EmailWrapper.propTypes = {
263
265
  showTemplateName: PropTypes.func,
264
266
  onValidationFail: PropTypes.func,
265
267
  forwardedTags: PropTypes.object,
268
+ selectedOfferDetails: PropTypes.array,
266
269
  };
267
270
 
268
271
  const mapStateToProps = createStructuredSelector({
@@ -4,14 +4,19 @@
4
4
  *
5
5
  */
6
6
 
7
- import {
8
- CHANGE_LOCALE,
9
- } from './constants';
7
+ import * as types from './constants';
10
8
 
11
9
  export function changeLocale(languageLocale) {
12
10
  console.log('trying to change locale', languageLocale);
13
11
  return {
14
- type: CHANGE_LOCALE,
12
+ type: types.CHANGE_LOCALE,
15
13
  locale: languageLocale,
16
14
  };
17
15
  }
16
+
17
+ export function getLocizMessage(locale) {
18
+ return {
19
+ type: types.GET_LOCIZ_MESSAGE_REQUEST,
20
+ locale,
21
+ };
22
+ }
@@ -4,5 +4,11 @@
4
4
  *
5
5
  */
6
6
 
7
- export const CHANGE_LOCALE = 'app/LanguageToggle/CHANGE_LOCALE';
8
7
  export const DEFAULT_LOCALE = 'en';
8
+
9
+ export const GET_LOCIZ_MESSAGE_REQUEST =
10
+ 'app/LanguageProvider/GET_LOCIZ_MESSAGE_REQUEST';
11
+ export const GET_LOCIZ_MESSAGE_SUCCESS =
12
+ 'app/LanguageProvider/GET_LOCIZ_MESSAGE_SUCCESS';
13
+ export const GET_LOCIZ_MESSAGE_FAILURE =
14
+ 'app/LanguageProvider/GET_LOCIZ_MESSAGE_FAILURE';
@@ -9,37 +9,74 @@
9
9
  import PropTypes from 'prop-types';
10
10
 
11
11
  import React from 'react';
12
+ import { ConfigProvider } from 'antd';
13
+ import enUS from 'antd/es/locale-provider/en_US';
14
+ import zhCN from 'antd/es/locale-provider/zh_CN';
12
15
  import { connect } from 'react-redux';
13
- import { createSelector } from 'reselect';
16
+ import { createStructuredSelector } from 'reselect';
14
17
  import { IntlProvider } from 'react-intl';
15
-
18
+ import moment from 'moment';
19
+ import { bindActionCreators } from 'redux';
20
+ import * as actions from './actions';
16
21
  import { makeSelectLocale } from './selectors';
17
22
 
23
+
18
24
  export class LanguageProvider extends React.PureComponent { // eslint-disable-line react/prefer-stateless-function
25
+ componentDidMount() {
26
+ const user = localStorage.getItem('user');
27
+ let locale = localStorage.getItem('jlocale') || 'en';
28
+ moment.locale(locale);
29
+ if (user) {
30
+ locale = JSON.parse(user).lang;
31
+ }
32
+ locale = this.getMappedLocale(locale);
33
+ this.props.actions.getLocizMessage(locale);
34
+ }
35
+ /*global getMappedLocale */
36
+ getMappedLocale = (locale) => {
37
+ const map = {
38
+ 'en': 'en-US',
39
+ 'zh-cn': 'zh',
40
+ 'zh': 'zh',
41
+ 'en-US': 'en-US',
42
+ };
43
+ return map[locale];
44
+ };
45
+
19
46
  render() {
47
+ const { locale, messages} = this.props.language;
48
+ const mappedLocale = {
49
+ 'en': enUS,
50
+ 'zh-cn': zhCN,
51
+ 'en-US': enUS,
52
+ 'zh': zhCN,
53
+ };
54
+ const jLocale = localStorage.getItem('jlocale') || 'en';
55
+ const file = mappedLocale[jLocale];
20
56
  return (
21
- <IntlProvider locale={this.props.locale} key={this.props.locale} messages={this.props.messages[this.props.locale]}>
22
- {React.Children.only(this.props.children)}
23
- </IntlProvider>
57
+ <ConfigProvider locale={file}>
58
+ <IntlProvider locale={locale} key={locale} messages={messages}>
59
+ {React.Children.only(this.props.children)}
60
+ </IntlProvider>
61
+ </ConfigProvider>
24
62
  );
25
63
  }
26
64
  }
27
65
 
28
66
  LanguageProvider.propTypes = {
29
- locale: PropTypes.string,
30
- messages: PropTypes.object,
67
+ language: PropTypes.object,
68
+ actions: PropTypes.object,
31
69
  children: PropTypes.element.isRequired,
32
70
  };
33
71
 
34
72
 
35
- const mapStateToProps = createSelector(
36
- makeSelectLocale(),
37
- (locale) => ({ locale })
38
- );
73
+ const mapStateToProps = createStructuredSelector({
74
+ language: makeSelectLocale(),
75
+ });
39
76
 
40
77
  function mapDispatchToProps(dispatch) {
41
78
  return {
42
- dispatch,
79
+ actions: bindActionCreators(actions, dispatch),
43
80
  };
44
81
  }
45
82
 
@@ -6,22 +6,24 @@
6
6
 
7
7
  import { fromJS } from 'immutable';
8
8
 
9
- import {
10
- CHANGE_LOCALE,
11
- } from './constants';
12
- import {
13
- DEFAULT_LOCALE,
14
- } from '../Cap/constants'; // eslint-disable-line
9
+ import * as types from './constants';
15
10
 
16
11
  const initialState = fromJS({
17
- locale: DEFAULT_LOCALE,
12
+ locale: types.DEFAULT_LOCALE,
13
+ messages: {},
14
+ localeLoading: false,
18
15
  });
19
16
 
20
17
  function languageProviderReducer(state = initialState, action) {
21
18
  switch (action.type) {
22
- case CHANGE_LOCALE:
19
+ case types.GET_LOCIZ_MESSAGE_REQUEST:
20
+ return state.set('localeLoading', true);
21
+ case types.GET_LOCIZ_MESSAGE_SUCCESS:
23
22
  return state
24
- .set('locale', action.locale);
23
+ .set('localeLoading', false)
24
+ .set('messages', fromJS(action.data));
25
+ case types.GET_LOCIZ_MESSAGE_FAILURE:
26
+ return state.set('localeLoading', false);
25
27
  default:
26
28
  return state;
27
29
  }
@@ -11,7 +11,7 @@ const selectLanguage = (state) => state.get('language');
11
11
 
12
12
  const makeSelectLocale = () => createSelector(
13
13
  selectLanguage,
14
- (languageState) => languageState.get('locale')
14
+ (languageState) => languageState.toJS()
15
15
  );
16
16
 
17
17
  export {
@@ -978,7 +978,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
978
978
  size={"label"}/>
979
979
  </CapColumn>
980
980
  <CapColumn span={6}>
981
- <CapLink title="change" onClick={() => this.addSecondoryCtaIos(true, this.state.formData, {id: "add-sec-cta-ios"})}/>
981
+ <CapLink title={this.props.intl.formatMessage(messages.change)} onClick={() => this.addSecondoryCtaIos(true, this.state.formData, {id: "add-sec-cta-ios"})}/>
982
982
  </CapColumn>
983
983
  </CapRow>,
984
984
  primitive: true,
@@ -1705,6 +1705,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
1705
1705
  setModalContent={this.setModalContent}
1706
1706
  startValidation={this.state.startValidation}
1707
1707
  stopValidation={this.stopValidation}
1708
+ selectedOfferDetails={this.props.selectedOfferDetails}
1708
1709
  />
1709
1710
  </CapColumn>
1710
1711
  {this.props.iosCtasData && this.state.showIosCtaTable &&
@@ -290,4 +290,8 @@ export default defineMessages({
290
290
  id: 'creatives.containersV2.MobilePush.Create.here',
291
291
  defaultMessage: 'here .',
292
292
  },
293
+ "change": {
294
+ id: 'creatives.containersV2.MobilePush.Create.change',
295
+ defaultMessage: 'change',
296
+ },
293
297
  });
@@ -967,7 +967,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
967
967
  size={"label"}/>
968
968
  </CapColumn>
969
969
  <CapColumn span={6}>
970
- <CapLink title="change" onClick={() => this.addSecondoryCtaIos(true, this.state.formData, {id: "add-sec-cta-ios"})}/>
970
+ <CapLink title={this.props.intl.formatMessage(messages.change)} onClick={() => this.addSecondoryCtaIos(true, this.state.formData, {id: "add-sec-cta-ios"})}/>
971
971
  </CapColumn>
972
972
  </CapRow>,
973
973
  primitive: true,
@@ -1792,6 +1792,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1792
1792
  setModalContent={this.setModalContent}
1793
1793
  startValidation={this.state.startValidation}
1794
1794
  stopValidation={this.stopValidation}
1795
+ selectedOfferDetails={this.props.selectedOfferDetails}
1795
1796
  />}
1796
1797
  </CapColumn>
1797
1798
  {this.props.iosCtasData && this.state.showIosCtaTable &&
@@ -282,4 +282,8 @@ export default defineMessages({
282
282
  id: 'creatives.containersV2.MobilePush.Edit.pleaseInput',
283
283
  defaultMessage: "Please input",
284
284
  },
285
+ "change": {
286
+ id: 'creatives.containersV2.MobilePush.Edit.change',
287
+ defaultMessage: "change",
288
+ },
285
289
  });
@@ -176,7 +176,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
176
176
  const unicodeEnabled = _.get(this.state, `formData[0]['unicode-validity']`);
177
177
  const smsDetails = updateCharCount(content || "", unicodeEnabled || false);
178
178
  if (this.smsCount.current) {
179
- this.smsCount.current.innerText = `${smsDetails.parts}SMS (${smsDetails.chars_used} characters)`;
179
+ this.smsCount.current.innerText = `${smsDetails.parts}${this.props.intl.formatMessage(messages.sms)} (${smsDetails.chars_used} ${this.props.intl.formatMessage(messages.characters)})`;
180
180
  }
181
181
  }
182
182
 
@@ -970,6 +970,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
970
970
  router={this.props.router}
971
971
  startValidation={this.state.startValidation}
972
972
  stopValidation={this.stopValidation}
973
+ selectedOfferDetails={this.props.selectedOfferDetails}
973
974
  />
974
975
  </CapColumn>
975
976
  </CapRow>
@@ -995,6 +996,7 @@ Create.propTypes = {
995
996
  isFullMode: PropTypes.bool,
996
997
  getFormSubscriptionData: PropTypes.func,
997
998
  isLoadingMetaEntities: PropTypes.bool,
999
+ selectedOfferDetails: PropTypes.array,
998
1000
  };
999
1001
 
1000
1002
  const mapStateToProps = createStructuredSelector({
@@ -110,4 +110,20 @@ export default defineMessages({
110
110
  id: 'creatives.containersV2.Create.templateNotValid',
111
111
  defaultMessage: 'Template data is not valid',
112
112
  },
113
+ "Creative name": {
114
+ id: 'creatives.containersV2.Create.creativeName',
115
+ defaultMessage: 'Creative name',
116
+ },
117
+ "Add label": {
118
+ id: 'creatives.containersV2.Create.addLabel',
119
+ defaultMessage: 'Add label',
120
+ },
121
+ "sms": {
122
+ id: 'creatives.containersV2.Create.sms',
123
+ defaultMessage: 'SMS',
124
+ },
125
+ "characters" : {
126
+ id: 'creatives.containersV2.Create.characters',
127
+ defaultMessage: 'characters',
128
+ },
113
129
  });
@@ -194,7 +194,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
194
194
  const unicodeEnabled = _.get(this.state, `formData[0]['unicode-validity']`);
195
195
  const smsDetails = updateCharCount(content || "", unicodeEnabled || false);
196
196
  if (this.smsCount.current) {
197
- this.smsCount.current.innerText = `${smsDetails.parts}SMS (${smsDetails.chars_used} characters)`;
197
+ this.smsCount.current.innerText = `${smsDetails.parts}${this.props.intl.formatMessage(messages.sms)} (${smsDetails.chars_used} ${this.props.intl.formatMessage(messages.characters)})`;
198
198
  }
199
199
  }
200
200
 
@@ -966,6 +966,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
966
966
  router={this.props.router}
967
967
  startValidation={this.state.startValidation}
968
968
  stopValidation={this.stopValidation}
969
+ selectedOfferDetails={this.props.selectedOfferDetails}
969
970
  />
970
971
  </CapColumn>
971
972
  </CapRow>
@@ -994,6 +995,7 @@ Edit.propTypes = {
994
995
  setIsLoadingContent: PropTypes.func,
995
996
  // route: PropTypes.object,
996
997
  injectedTags: PropTypes.object,
998
+ selectedOfferDetails: PropTypes.array,
997
999
  };
998
1000
 
999
1001
  const mapStateToProps = createStructuredSelector({