@capillarytech/creatives-library 3.2.3 → 3.3.0

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 (63) hide show
  1. package/components/FormBuilder/index.js +1 -1
  2. package/components/Header/index.js +4 -3
  3. package/components/Header/messages.js +4 -0
  4. package/config/app.js +1 -1
  5. package/containers/Assets/Gallery/index.js +1 -1
  6. package/containers/Cap/index.js +3 -5
  7. package/containers/Email/index.js +2 -2
  8. package/containers/Email/messages.js +8 -0
  9. package/containers/LanguageProvider/index.js +2 -1
  10. package/containers/Templates/index.js +2 -2
  11. package/containers/Templates/messages.js +24 -4
  12. package/containers/WeChat/RichmediaTemplates/Create/messages.js +24 -0
  13. package/i18n.js +16 -9
  14. package/package.json +1 -1
  15. package/translations/en.json +108 -60
  16. package/translations/zh.json +108 -60
  17. package/utils/smsCharCountV2.js +1 -1
  18. package/v2Components/CapTagList/index.js +2 -2
  19. package/v2Components/FormBuilder/index.js +5 -2
  20. package/v2Components/NavigationBar/index.js +9 -10
  21. package/v2Components/NewCallTask/index.js +3 -1
  22. package/v2Components/TopBar/index.js +3 -0
  23. package/v2Components/TopBar/messages.js +8 -0
  24. package/v2Containers/Assets/Gallery/index.js +1 -1
  25. package/v2Containers/Assets/Gallery/messages.js +4 -0
  26. package/v2Containers/CallTask/index.js +3 -1
  27. package/v2Containers/Cap/index.js +3 -2
  28. package/v2Containers/CreativesContainer/SlideBoxContent.js +11 -1
  29. package/v2Containers/CreativesContainer/index.js +4 -1
  30. package/v2Containers/Email/index.js +5 -2
  31. package/v2Containers/Email/messages.js +8 -0
  32. package/v2Containers/EmailWrapper/index.js +3 -0
  33. package/v2Containers/LanguageProvider/constants.js +0 -1
  34. package/v2Containers/LanguageProvider/index.js +2 -0
  35. package/v2Containers/LanguageProvider/reducer.js +1 -7
  36. package/v2Containers/MobilePush/Create/index.js +2 -1
  37. package/v2Containers/MobilePush/Create/messages.js +4 -0
  38. package/v2Containers/MobilePush/Edit/index.js +2 -1
  39. package/v2Containers/MobilePush/Edit/messages.js +4 -0
  40. package/v2Containers/Sms/Create/index.js +3 -1
  41. package/v2Containers/Sms/Create/messages.js +16 -0
  42. package/v2Containers/Sms/Edit/index.js +3 -1
  43. package/v2Containers/Sms/Edit/messages.js +16 -0
  44. package/v2Containers/TagList/index.js +43 -0
  45. package/v2Containers/Templates/_templates.scss +9 -1
  46. package/v2Containers/Templates/index.js +65 -52
  47. package/v2Containers/TemplatesV2/index.js +1 -0
  48. package/v2Containers/WeChat/MapTemplates/index.js +0 -1
  49. package/v2Containers/WeChat/RichmediaTemplates/Create/_createRichmedia.scss +10 -0
  50. package/v2Containers/WeChat/RichmediaTemplates/Create/actions.js +9 -0
  51. package/v2Containers/WeChat/RichmediaTemplates/Create/constants.js +3 -0
  52. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +146 -4
  53. package/v2Containers/WeChat/RichmediaTemplates/Create/messages.js +86 -57
  54. package/v2Containers/WeChat/RichmediaTemplates/Create/reducer.js +24 -1
  55. package/v2Containers/WeChat/RichmediaTemplates/Create/sagas.js +45 -0
  56. package/v2Containers/WeChat/RichmediaTemplates/Edit/constants.js +4 -0
  57. package/v2Containers/WeChat/RichmediaTemplates/Edit/index.js +8 -1
  58. package/v2Containers/WeChat/Wrapper/_wrapper.scss +9 -1
  59. package/v2Containers/WeChat/Wrapper/messages.js +5 -5
  60. package/containers/Cap/messsages.js +0 -63
  61. package/v2Components/Header/index.js +0 -46
  62. package/v2Components/Header/tests/index.test.js +0 -10
  63. package/v2Containers/TemplatesV2/_templatesV2.scss +0 -5
@@ -78,6 +78,7 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
78
78
  selectedChannel: defaultChannel,
79
79
  panes,
80
80
  };
81
+ !props.isFullMode && this.props.onChannelChange(defaultChannel);
81
82
  }
82
83
  componentWillReceiveProps(nextProps) {
83
84
  if (this.props.channel !== nextProps.channel) {
@@ -426,7 +426,6 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
426
426
 
427
427
  getFormData(formData) {
428
428
  let { editTemplateData} = this.state;
429
- const { formData: stateFormData } = this.state;
430
429
  const selectedWeChatAccount = (!isEmpty(this.props.Templates.selectedWeChatAccount) ? this.props.Templates.selectedWeChatAccount : this.props.WeChat.selectedWeChatAccount);
431
430
  if (isEmpty(editTemplateData)) {
432
431
  editTemplateData = formData;
@@ -59,6 +59,16 @@
59
59
  border-bottom-left-radius: 4px;
60
60
  border-bottom-right-radius: 4px;
61
61
  }
62
+
63
+ .existing-template-title-card {
64
+ padding: 12px;
65
+ background-color: white;
66
+ height: 44px;
67
+ width: 244px;
68
+ border-bottom-left-radius: 4px;
69
+ border-bottom-right-radius: 4px;
70
+ }
71
+
62
72
  .custom-image {
63
73
  position: relative;
64
74
  .name-container {
@@ -10,6 +10,15 @@ export function defaultAction() {
10
10
  type: types.DEFAULT_ACTION,
11
11
  };
12
12
  }
13
+
14
+ export function getAllTemplates(channel, queryParams) {
15
+ return {
16
+ type: types.GET_ALL_TEMPLATES_REQUEST,
17
+ channel,
18
+ queryParams,
19
+ };
20
+ }
21
+
13
22
  export function uploadAsset(file, assetType, fileParams, mode, wechatParams, contentId, uploadId) {
14
23
  return {
15
24
  type: types.UPLOAD_ASSET_REQUEST,
@@ -13,3 +13,6 @@ export const SAVE_TEMPLATE_REQUEST = 'app/v2Containers/Wechat/RichmediaTemplates
13
13
  export const SAVE_TEMPLATE_SUCCESS = 'app/v2Containers/Wechat/RichmediaTemplates/Create/SAVE_TEMPLATE_SUCCESS';
14
14
  export const SAVE_TEMPLATE_FAILURE = 'app/v2Containers/Wechat/RichmediaTemplates/Create/SAVE_TEMPLATE_FAILURE';
15
15
  export const CLEAR_CONTENT_ASSET = 'app/v2Containers/Wechat/RichmediaTemplates/Create/CLEAR_CONTENT_ASSET';
16
+ export const GET_ALL_TEMPLATES_REQUEST = 'app/v2Containers/Wechat/RichmediaTemplates/Create/GET_ALL_TEMPLATES_REQUEST';
17
+ export const GET_ALL_TEMPLATES_SUCCESS = 'app/v2Containers/Wechat/RichmediaTemplates/Create/GET_ALL_TEMPLATES_SUCCESS';
18
+ export const GET_ALL_TEMPLATES_FAILURE = 'app/v2Containers/Wechat/RichmediaTemplates/Create/GET_ALL_TEMPLATES_FAILURE';
@@ -17,7 +17,7 @@ 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, CapLabel, CapNotification } from '@capillarytech/cap-ui-library';
20
+ import { CapRow, CapColumn, CapButton, CapCard, CapSpin, CapInput, CapHeading, CapDivider, CapIcon, CapLink, CapLabel, CapNotification, CapSlideBox } 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';
@@ -26,6 +26,8 @@ import messages from './messages';
26
26
  import FormBuilder from '../../../../v2Components/FormBuilder';
27
27
  import WechatRichmediaTemplatePreview from '../../../../v2Components/TemplatePreview/WechatRichmediaTemplatePreview';
28
28
  import noImage from '../../../../assets/noImage.png';
29
+ import Pagination from '../../../../v2Components/Pagination';
30
+ import { CAP_SPACE_08, CAP_SPACE_12, CAP_SPACE_20, CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
29
31
 
30
32
  export class Create extends React.Component { // eslint-disable-line react/prefer-stateless-function
31
33
  constructor(props) {
@@ -102,6 +104,13 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
102
104
  type: 'confirm',
103
105
  id: 'template-back-confirm-modal',
104
106
  },
107
+ showExistingTemplates: false,
108
+ existingTemplatesPageNo: 1,
109
+ existingTemplatesPageLimit: 25,
110
+ sortBy: 'Most Recent',
111
+ searchText: '',
112
+ pagination: true,
113
+ scrollDebounce: true,
105
114
  };
106
115
  this.onFormDataChange = this.onFormDataChange.bind(this);
107
116
  this.cancelHandler = this.cancelHandler.bind(this);
@@ -836,6 +845,126 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
836
845
  });
837
846
  return true;
838
847
  }
848
+
849
+ onChooseExistingTemplate = (template, e) => {
850
+ e.stopPropagation();
851
+ const content = get(template, 'versions.base.mediaList[0]', {});
852
+ let postCommentsValue = 'No one';
853
+ const templateData = cloneDeep(this.state.templateData);
854
+
855
+ if (content.only_fans_can_comment && content.need_open_comment) {
856
+ postCommentsValue = 'Only followers';
857
+ } else if (content.need_open_comment) {
858
+ postCommentsValue = 'Anyone';
859
+ }
860
+
861
+ templateData[this.state.currentContentId] = {
862
+ formData: {
863
+ 'title-value': content.title,
864
+ 'author-value': content.author,
865
+ 'cover-abstract-value': content.digest,
866
+ 'content-value': content.content,
867
+ 'source-link-value': content.content_source_url,
868
+ 'post-comments-value': postCommentsValue,
869
+ 'show-cover-pic-value': content.show_cover_pic,
870
+ },
871
+ imageUrl: content.image_url,
872
+ mediaId: content.thumb_media_id,
873
+ };
874
+ this.setState({ templateData });
875
+ this.onCloseExistingTemplatesSlideBox();
876
+ }
877
+
878
+ getExistingTemplates = () => {
879
+ const { searchText, sortBy, existingTemplatesPageNo, existingTemplatesPageLimit } = this.state;
880
+ const { selectedWeChatAccount } = this.props.Templates;
881
+
882
+ this.setState({showExistingTemplates: true});
883
+ const queryParams = {
884
+ name: searchText || '',
885
+ sortBy: sortBy,
886
+ wecrmId: selectedWeChatAccount.configs.wecrm_app_id,
887
+ wecrmToken: selectedWeChatAccount.configs.wecrm_token,
888
+ originalId: selectedWeChatAccount.sourceAccountIdentifier,
889
+ page: existingTemplatesPageNo,
890
+ perPage: existingTemplatesPageLimit,
891
+ };
892
+ this.props.actions.getAllTemplates('wechat', queryParams);
893
+ }
894
+
895
+ searchTemplate = (data) => {
896
+ this.setState({searchText: data}, () => {
897
+ this.getExistingTemplates();
898
+ });
899
+ }
900
+
901
+ onPaginationChange = () => {
902
+ if (this.props.Create.pagination && this.state.scrollDebounce) {
903
+ this.setState((prevState) => ({
904
+ existingTemplatesPageNo: prevState.existingTemplatesPageNo + 1,
905
+ scrollDebounce: false,
906
+ }),
907
+ () => {
908
+ this.getExistingTemplates();
909
+ setTimeout(() => {
910
+ this.setState({ scrollDebounce: true })
911
+ }, 500);
912
+ });
913
+ }
914
+ }
915
+
916
+ existingTemplatesContent = () => {
917
+ const { getAllTemplatesInProgress, templates = [] } = this.props.Create;
918
+ return (
919
+ <CapSpin style={{textAlign: "center"}} spinning={getAllTemplatesInProgress}>
920
+ <CapInput.Search
921
+ className="search-text"
922
+ style={{ width: '100%', marginBottom: CAP_SPACE_16 }}
923
+ placeholder={this.props.intl.formatMessage(messages.searchText)}
924
+ value={this.state.searchText}
925
+ onChange={(e) => this.searchTemplate(e.target.value)}
926
+ onClear={() => this.searchTemplate('')}
927
+ />
928
+ <Pagination style={{ height: 'calc(100vh - 150px)', overflowY: 'auto' }} onPageChange={templates.length && this.onPaginationChange}>
929
+ { templates.map((template) => (
930
+ <CapCard
931
+ key={template._id}
932
+ bordered={false}
933
+ bodyStyle={{
934
+ padding: 0,
935
+ borderRadius: '4px',
936
+ width: '276px',
937
+ border: '16px solid #f4f5f7',
938
+ }}
939
+ onClick={(e) => this.onChooseExistingTemplate(template, e)}
940
+ style={{ paddingBottom: CAP_SPACE_12 }}
941
+ >
942
+ <div>
943
+ <div className="custom-image">
944
+ <img alt="" width="244px" height="136px" src={template.versions.base.mediaList[0].image_url} />
945
+ </div>
946
+ <div className="existing-template-title-card">
947
+ <CapHeading type="h5" className="overflow-wrap-fields">{template.name || "Title"}</CapHeading>
948
+ </div>
949
+ </div>
950
+ </CapCard>
951
+ ))
952
+ }
953
+ </Pagination>
954
+ </CapSpin>
955
+ );
956
+ }
957
+
958
+ onCloseExistingTemplatesSlideBox = () => {
959
+ this.setState({
960
+ showExistingTemplates: false,
961
+ existingTemplatesPageNo: 1,
962
+ existingTemplatesPageLimit: 25,
963
+ searchText: '',
964
+ pagination: true,
965
+ });
966
+ }
967
+
839
968
  updateContentData = () => {
840
969
  this.state.editorInstanse.insertHtml(`<img src='${this.props.ContentImageData.metaInfo.wechatUrl}' alt='Capillary Image'>`);
841
970
  this.props.actions.clearContentImageStore();
@@ -845,8 +974,9 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
845
974
  const addRichMediaMenu = (
846
975
  <>
847
976
  <div style={{width: '292px'}}><CapDivider /></div>
848
- <CapHeading type="h5" style={{marginBottom: '8px'}}>Add rich media content</CapHeading>
849
- <CapButton type="dashed" onClick={this.menuOnClickEvent} prefix={<CapIcon size="s" type="add-media" />} style={{backgroundColor: 'white'}}>New media</CapButton>
977
+ <CapHeading type="h5" style={{marginBottom: '8px'}}>{this.props.intl.formatMessage(messages.addRichMediaContent)}</CapHeading>
978
+ <CapButton type="dashed" onClick={this.getExistingTemplates} prefix={<CapIcon size="s" type="media" />} style={{backgroundColor: 'white', width: '142px', marginRight: CAP_SPACE_08, paddingLeft: CAP_SPACE_12}}>{this.props.intl.formatMessage(messages.existingMedia)}</CapButton>
979
+ <CapButton type="dashed" onClick={this.menuOnClickEvent} prefix={<CapIcon size="s" type="add-media" />} style={{backgroundColor: 'white'}}>{this.props.intl.formatMessage(messages.newMedia)}</CapButton>
850
980
  </>
851
981
  );
852
982
  return addRichMediaMenu;
@@ -902,6 +1032,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
902
1032
  const schema = this.returnCurrentSchema();
903
1033
  const formData = this.returnCurrentFormData();
904
1034
  const { isIframe } = this.state;
1035
+ const { intl } = this.props;
905
1036
  this.updateImageData();
906
1037
  if (this.props.ContentImageData && this.props.ContentImageData.metaInfo && this.props.ContentImageData.metaInfo.wechatUrl) {
907
1038
  this.updateContentData();
@@ -927,7 +1058,7 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
927
1058
  </CapColumn>
928
1059
  <CapColumn span={15}>
929
1060
  { !isIframe && <CapInput
930
- label="Name of the template"
1061
+ label={this.props.intl.formatMessage(messages.nameOfTemplate)}
931
1062
  value={this.state.templateName}
932
1063
  onChange={this.templateNameHandler}
933
1064
  size="large"
@@ -956,6 +1087,17 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
956
1087
  </CapRow>
957
1088
  </div>
958
1089
  </div>
1090
+ <CapSlideBox
1091
+ header={(
1092
+ <CapHeading type="h3">
1093
+ {intl.formatMessage(messages.existingMediaHeader)}
1094
+ </CapHeading>
1095
+ )}
1096
+ content={this.existingTemplatesContent()}
1097
+ show={this.state.showExistingTemplates}
1098
+ handleClose={this.onCloseExistingTemplatesSlideBox}
1099
+ size="size-s"
1100
+ />
959
1101
  </CapSpin>
960
1102
  </div>
961
1103
  );
@@ -5,233 +5,262 @@
5
5
  */
6
6
  import { defineMessages } from 'react-intl';
7
7
 
8
+ const scope = 'creatives.containersV2.richMedia.Create';
8
9
  export default defineMessages({
9
10
  "header": {
10
- id: 'creatives.containersV2.richMedia.create.header',
11
+ id: `${scope}.header`,
11
12
  defaultMessage: 'This is Create container !',
12
13
  },
13
14
  "titleCharacterCount": {
14
- id: 'creatives.containersV2.richMedia.create.titleCharacterCount',
15
+ id: `${scope}.titleCharacterCount`,
15
16
  defaultMessage: 'Title exceeds character count limit by',
16
17
  },
17
18
  "authorCharacterCount": {
18
- id: 'creatives.containersV2.richMedia.create.authorCharacterCount',
19
+ id: `${scope}.authorCharacterCount`,
19
20
  defaultMessage: 'Author exceeds character count limit by',
20
21
  },
21
22
  "coverAbstractCharacterCount": {
22
- id: 'creatives.containersV2.richMedia.create.coverAbstractCharacterCount',
23
+ id: `${scope}.coverAbstractCharacterCount`,
23
24
  defaultMessage: 'Cover abstract exceeds character count limit by',
24
25
  },
25
26
  "saveSuccess": {
26
- id: 'creatives.containersV2.richMedia.create.saveSuccess',
27
+ id: `${scope}.saveSuccess`,
27
28
  defaultMessage: 'Template saved successfully',
28
29
  },
29
30
  "modalTitle": {
30
- id: 'creatives.containersV2.richMedia.create.modalTitle',
31
+ id: `${scope}.modalTitle`,
31
32
  defaultMessage: 'Alert',
32
33
  },
33
34
  "modalBody": {
34
- id: 'creatives.containersV2.richMedia.create.modalBody',
35
+ id: `${scope}.modalBody`,
35
36
  defaultMessage: 'Do you really want to go back? All your temporary changes will be lost!',
36
37
  },
37
38
  "deleteContent": {
38
- id: 'creatives.containersV2.richMedia.create.deleteContent',
39
+ id: `${scope}.deleteContent`,
39
40
  defaultMessage: 'Do you really want to delete? All your temporary changes will be lost!',
40
41
  },
41
42
  "emptyTemplateName": {
42
- id: 'creatives.containersV2.richMedia.create.emptyTemplateName',
43
+ id: `${scope}.emptyTemplateName`,
43
44
  defaultMessage: 'Cannot leave template name empty',
44
45
  },
45
46
  "wrongFormatFile": {
46
- id: 'creatives.containersV2.richMedia.create.wrongFormatFile',
47
+ id: `${scope}.wrongFormatFile`,
47
48
  defaultMessage: 'Wrong file upoaded. Please upload image file',
48
49
  },
49
50
  "formEmpty": {
50
- id: 'creatives.containersV2.richMedia.create.formEmpty',
51
+ id: `${scope}.formEmpty`,
51
52
  defaultMessage: 'Cannot leave form empty',
52
53
  },
53
54
  "titleEmpty": {
54
- id: 'creatives.containersV2.richMedia.create.titleEmpty',
55
+ id: `${scope}.titleEmpty`,
55
56
  defaultMessage: 'Cannot leave title field empty',
56
57
  },
57
58
  "noImage": {
58
- id: 'creatives.containersV2.richMedia.create.noImage',
59
+ id: `${scope}.noImage`,
59
60
  defaultMessage: 'Please upload an image',
60
61
  },
61
62
  "sourceLinkEmpty": {
62
- id: 'creatives.containersV2.richMedia.create.sourceLinkEmpty',
63
+ id: `${scope}.sourceLinkEmpty`,
63
64
  defaultMessage: 'Cannot leave source link field empty',
64
65
  },
65
66
  "contentEmpty": {
66
- id: 'creatives.containersV2.richMedia.create.contentEmpty',
67
+ id: `${scope}.contentEmpty`,
67
68
  defaultMessage: 'Cannot leave content field empty',
68
69
  },
69
70
  "titleNameRepeated": {
70
- id: 'creatives.containersV2.richMedia.create.titleNameRepeated',
71
+ id: `${scope}.titleNameRepeated`,
71
72
  defaultMessage: 'Title name cannot be repeated',
72
73
  },
73
74
  "wrongUrl": {
74
- id: 'creatives.containersV2.richMedia.create.wrongUrl',
75
+ id: `${scope}.wrongUrl`,
75
76
  defaultMessage: 'Enter correct URL',
76
77
  },
77
78
  "maxContentCount": {
78
- id: 'creatives.containersV2.richMedia.create.maxContentCount',
79
+ id: `${scope}.maxContentCount`,
79
80
  defaultMessage: 'You have reached the maximum template size',
80
81
  },
81
82
  "addNewRichmedia": {
82
- id: 'creatives.containersV2.richMedia.create.addNewRichmedia',
83
+ id: `${scope}.addNewRichmedia`,
83
84
  defaultMessage: 'Add richmedia content',
84
85
  },
85
86
  'Title': {
86
- id: 'creatives.containersV2.richMedia.create.Title',
87
+ id: `${scope}.Title`,
87
88
  defaultMessage: 'Title',
88
89
  },
89
90
  'Please input title': {
90
- id: 'creatives.containersV2.richMedia.create.Please_input_title',
91
+ id: `${scope}.Please_input_title`,
91
92
  defaultMessage: 'Please input title',
92
93
  },
93
94
  'Author': {
94
- id: 'creatives.containersV2.richMedia.create.Author',
95
+ id: `${scope}.Author`,
95
96
  defaultMessage: 'Author',
96
97
  },
97
98
  'Please input author': {
98
- id: 'creatives.containersV2.richMedia.create.Please_input_author',
99
+ id: `${scope}.Please_input_author`,
99
100
  defaultMessage: 'Please input author',
100
101
  },
101
102
  'Cover image': {
102
- id: 'creatives.containersV2.richMedia.create.Cover_image',
103
+ id: `${scope}.Cover_image`,
103
104
  defaultMessage: 'Cover image',
104
105
  },
105
106
  'Cover abstract': {
106
- id: 'creatives.containersV2.richMedia.create.Cover_abstract',
107
+ id: `${scope}.Cover_abstract`,
107
108
  defaultMessage: 'Cover abstract',
108
109
  },
109
110
  'Please input cover abstract': {
110
- id: 'creatives.containersV2.richMedia.create.Please_input_cover_abstract',
111
+ id: `${scope}.Please_input_cover_abstract`,
111
112
  defaultMessage: 'Please input cover abstract',
112
113
  },
113
114
  'Content': {
114
- id: 'creatives.containersV2.richMedia.create.Content',
115
+ id: `${scope}.Content`,
115
116
  defaultMessage: 'Content',
116
117
  },
117
118
  'Please input content': {
118
- id: 'creatives.containersV2.richMedia.create.Please_input_content',
119
+ id: `${scope}.Please_input_content`,
119
120
  defaultMessage: 'Please input content',
120
121
  },
121
122
  'Show cover picture': {
122
- id: 'creatives.containersV2.richMedia.create.Show_cover_picture',
123
+ id: `${scope}.Show_cover_picture`,
123
124
  defaultMessage: 'Show cover picture',
124
125
  },
125
126
  'Who can post comments on this content': {
126
- id: 'creatives.containersV2.richMedia.create.Who_can_post_comments_on_this_content',
127
+ id: `${scope}.Who_can_post_comments_on_this_content`,
127
128
  defaultMessage: 'Who can post comments on this content',
128
129
  },
129
130
  'No one': {
130
- id: 'creatives.containersV2.richMedia.create.No_one',
131
+ id: `${scope}.No_one`,
131
132
  defaultMessage: 'No one',
132
133
  },
133
134
  'Anyone': {
134
- id: 'creatives.containersV2.richMedia.create.Anyone',
135
+ id: `${scope}.Anyone`,
135
136
  defaultMessage: 'Anyone',
136
137
  },
137
138
  'Only followers': {
138
- id: 'creatives.containersV2.richMedia.create.Only_followers',
139
+ id: `${scope}.Only_followers`,
139
140
  defaultMessage: 'Only followers',
140
141
  },
141
142
  'visibility': {
142
- id: 'creatives.containersV2.richMedia.create.visibility',
143
+ id: `${scope}.visibility`,
143
144
  defaultMessage: 'visibility',
144
145
  },
145
146
  'delete': {
146
- id: 'creatives.containersV2.richMedia.create.delete',
147
+ id: `${scope}.delete`,
147
148
  defaultMessage: 'delete',
148
149
  },
149
150
  'This field is required!': {
150
- id: 'creatives.containersV2.richMedia.create.requiredField',
151
+ id: `${scope}.requiredField`,
151
152
  defaultMessage: 'This field is required!',
152
153
  },
153
154
  "Write a brief headline to draw customer's attention": {
154
- id: 'creatives.containersV2.richMedia.create.titleInductiveText',
155
+ id: `${scope}.titleInductiveText`,
155
156
  defaultMessage: "Write a brief headline to draw customer's attention",
156
157
  },
157
158
  "Brand/name that your customer will recognise": {
158
- id: 'creatives.containersV2.richMedia.create.authorInductiveText',
159
+ id: `${scope}.authorInductiveText`,
159
160
  defaultMessage: "Brand/name that your customer will recognise",
160
161
  },
161
162
  'Resolution 360 x 200': {
162
- id: 'creatives.containersV2.richMedia.create.resolutionText',
163
+ id: `${scope}.resolutionText`,
163
164
  defaultMessage: 'Resolution 360 x 200',
164
165
  },
165
166
  'The relevant image that complements title.': {
166
- id: 'creatives.containersV2.richMedia.create.coverImageTitle',
167
+ id: `${scope}.coverImageTitle`,
167
168
  defaultMessage: 'The relevant image that complements title.',
168
169
  },
169
170
  'Upload Image': {
170
- id: 'creatives.containersV2.richMedia.create.uploadImage',
171
+ id: `${scope}.uploadImage`,
171
172
  defaultMessage: 'Upload Image',
172
173
  },
173
174
  'A short description help customers learn more': {
174
- id: 'creatives.containersV2.richMedia.create.coverAbstractInductive',
175
+ id: `${scope}.coverAbstractInductive`,
175
176
  defaultMessage: 'A short description help customers learn more',
176
177
  },
177
178
  'Article content': {
178
- id: 'creatives.containersV2.richMedia.create.articleContent',
179
+ id: `${scope}.articleContent`,
179
180
  defaultMessage: 'Article content',
180
181
  },
181
182
  'Insert Image': {
182
- id: 'creatives.containersV2.richMedia.create.insertImage',
183
+ id: `${scope}.insertImage`,
183
184
  defaultMessage: 'Insert Image',
184
185
  },
185
186
  'Read more link': {
186
- id: 'creatives.containersV2.richMedia.create.readMoreLink',
187
+ id: `${scope}.readMoreLink`,
187
188
  defaultMessage: 'Read more link',
188
189
  },
189
190
  'Link to help customers discover more about the brand.': {
190
- id: 'creatives.containersV2.richMedia.create.linkInductiveText',
191
+ id: `${scope}.linkInductiveText`,
191
192
  defaultMessage: 'Link to help customers discover more about the brand.',
192
193
  },
193
194
  'somethingWentWrong': {
194
- id: 'creatives.containersV2.richMedia.create.somethingWentWrong',
195
+ id: `${scope}.somethingWentWrong`,
195
196
  defaultMessage: 'Something went wrong!!',
196
197
  },
197
198
  'Template with the same name exists. Please try another template name.': {
198
- id: 'creatives.containersV2.richMedia.create.templateNameExists',
199
+ id: `${scope}.templateNameExists`,
199
200
  defaultMessage: 'Template with the same name exists. Please try another template name.',
200
201
  },
202
+ 'Template name already exists': {
203
+ id: 'creatives.containersV2.richMedia.create.templateNameAlreadyExists',
204
+ defaultMessage: 'Template name already exists',
205
+ },
201
206
  'Template name cannot be blank!': {
202
- id: 'creatives.containersV2.richMedia.create.templateNameBlank',
207
+ id: `${scope}.templateNameBlank`,
203
208
  defaultMessage: 'Template name cannot be blank',
204
209
  },
205
210
  'Template name contains only whitespaces': {
206
- id: 'creatives.containersV2.richMedia.create.templateNameContainsWS',
211
+ id: `${scope}.templateNameContainsWS`,
207
212
  defaultMessage: 'Template name contains only whitespaces',
208
213
  },
209
214
  'Please provide payload to the wechat template': {
210
- id: 'creatives.containersV2.richMedia.create.payloadMissing',
215
+ id: `${scope}.payloadMissing`,
211
216
  defaultMessage: 'Please provide payload to create wechat template',
212
217
  },
213
218
  'Please provide source account identifier': {
214
- id: 'creatives.containersV2.richMedia.create.sourceIdentMissing',
219
+ id: `${scope}.sourceIdentMissing`,
215
220
  defaultMessage: 'Please provide source account identifier',
216
221
  },
217
222
  'Please provide sufficient parameters to generate richmedia message payload': {
218
- id: 'creatives.containersV2.richMedia.create.sufficientPayload',
223
+ id: `${scope}.sufficientPayload`,
219
224
  defaultMessage: 'Please provide sufficient parameters to generate richmedia message payload',
220
225
  },
221
226
  'Please provide sufficient params to create richmedia wechat template': {
222
- id: 'creatives.containersV2.richMedia.create.sufficientParam',
227
+ id: `${scope}.sufficientParam`,
223
228
  defaultMessage: 'Please provide sufficient params to create richmedia wechat template',
224
229
  },
225
230
  'Upload has failed': {
226
- id: 'creatives.containersV2.richMedia.create.uploadFailed',
231
+ id: `${scope}.uploadFailed`,
227
232
  defaultMessage: 'Upload has failed',
228
233
  },
229
234
  'Template with the same name exists': {
230
- id: 'creatives.containersV2.richMedia.create.sameTemplateExists',
235
+ id: `${scope}.sameTemplateExists`,
231
236
  defaultMessage: 'Template with the same name exists',
232
237
  },
233
238
  'Failed to get File content': {
234
- id: 'creatives.containersV2.richMedia.create.fileContentFailed',
239
+ id: `${scope}.fileContentFailed`,
235
240
  defaultMessage: 'Failed to get File content',
236
241
  },
242
+ 'addRichMediaContent': {
243
+ id: `${scope}.addRichMediaContent`,
244
+ defaultMessage: 'Add rich media content',
245
+ },
246
+ 'newMedia': {
247
+ id: `${scope}.newMedia`,
248
+ defaultMessage: 'New media',
249
+ },
250
+ 'nameOfTemplate': {
251
+ id: `${scope}.nameOfTemplate`,
252
+ defaultMessage: 'Name of the template',
253
+ },
254
+ 'existingMedia': {
255
+ id: `${scope}.existingMedia`,
256
+ defaultMessage: 'Existing media',
257
+ },
258
+ 'existingMediaHeader': {
259
+ id: `${scope}.existingMediaHeader`,
260
+ defaultMessage: 'Rich media templates',
261
+ },
262
+ 'searchText': {
263
+ id: `${scope}.searchText`,
264
+ defaultMessage: 'Search Templates',
265
+ },
237
266
  });
@@ -5,9 +5,13 @@
5
5
  */
6
6
 
7
7
  import { fromJS } from 'immutable';
8
+ import unionBy from 'lodash/unionBy';
8
9
  import * as types from './constants';
9
10
 
10
- const initialState = fromJS({});
11
+ const initialState = fromJS({
12
+ getAllTemplatesInProgress: false,
13
+ templates: [],
14
+ });
11
15
 
12
16
  function createReducer(state = initialState, action) {
13
17
  switch (action.type) {
@@ -52,6 +56,25 @@ function createReducer(state = initialState, action) {
52
56
  return state
53
57
  .set('saveTemplateSuccess', false)
54
58
  .set('savingTemplate', false);
59
+ case types.GET_ALL_TEMPLATES_REQUEST:
60
+ return state
61
+ .set('getAllTemplatesInProgress', true).set('templateError', {});
62
+ case types.GET_ALL_TEMPLATES_SUCCESS:
63
+ const { data, isReset } = action;
64
+ if (isReset) {
65
+ return state
66
+ .set('getAllTemplatesInProgress', false)
67
+ .set('pagination', true)
68
+ .set('templates', data ? data.templates : [])
69
+ .set('isSearch', data ? data.search : false);
70
+ }
71
+ return state
72
+ .set('getAllTemplatesInProgress', false)
73
+ .set('pagination', data ? Boolean(data.templates.length) : true)
74
+ .set('templates', data ? unionBy(state.get('templates'), data.templates, '_id') : state.get('templates'))
75
+ .set('isSearch', data ? data.search : false);
76
+ case types.GET_ALL_TEMPLATES_FAILURE:
77
+ return state.set('getAllTemplatesInProgress', false).set('templateError', action.error);
55
78
  default:
56
79
  return state;
57
80
  }