@capillarytech/creatives-library 3.3.0 → 3.3.3

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 (43) hide show
  1. package/config/app.js +2 -0
  2. package/containers/Cap/messsages.js +63 -0
  3. package/index.js +6 -0
  4. package/initialState.js +3 -0
  5. package/package.json +2 -1
  6. package/routes.js +6 -1
  7. package/services/api.js +25 -9
  8. package/translations/en.json +56 -0
  9. package/translations/zh.json +56 -0
  10. package/v2Components/Header/index.js +46 -0
  11. package/v2Components/Header/tests/index.test.js +10 -0
  12. package/v2Components/MarketingObjective/MarketingObjective.style.js +73 -0
  13. package/v2Components/MarketingObjective/index.js +107 -0
  14. package/v2Components/MarketingObjective/messages.js +23 -0
  15. package/v2Components/NavigationBar/index.js +5 -10
  16. package/v2Components/NavigationBar/messages.js +28 -0
  17. package/v2Containers/App/constants.js +29 -0
  18. package/v2Containers/Assets/Gallery/index.js +11 -5
  19. package/v2Containers/Cap/index.js +3 -0
  20. package/v2Containers/CreativesContainer/SlideBoxContent.js +18 -0
  21. package/v2Containers/CreativesContainer/constants.js +1 -0
  22. package/v2Containers/CreativesContainer/index.js +10 -1
  23. package/v2Containers/Email/index.js +7 -0
  24. package/v2Containers/Email/messages.js +8 -0
  25. package/v2Containers/EmailWrapper/index.js +15 -1
  26. package/v2Containers/Facebook/Facebook.style.js +75 -0
  27. package/v2Containers/Facebook/actions.js +13 -0
  28. package/v2Containers/Facebook/constants.js +24 -0
  29. package/v2Containers/Facebook/index.js +358 -0
  30. package/v2Containers/Facebook/messages.js +167 -0
  31. package/v2Containers/Facebook/reducer.js +31 -0
  32. package/v2Containers/Facebook/sagas.js +41 -0
  33. package/v2Containers/Facebook/selectors.js +20 -0
  34. package/v2Containers/MobilePush/Create/index.js +8 -0
  35. package/v2Containers/MobilePush/Edit/index.js +8 -0
  36. package/v2Containers/Sms/Create/index.js +6 -1
  37. package/v2Containers/Sms/Edit/index.js +6 -1
  38. package/v2Containers/Templates/index.js +10 -4
  39. package/v2Containers/TemplatesV2/_templatesV2.scss +5 -0
  40. package/v2Containers/TemplatesV2/index.js +53 -22
  41. package/v2Containers/TemplatesV2/messages.js +4 -0
  42. package/v2Containers/WeChat/MapTemplates/index.js +9 -1
  43. package/v2Containers/WeChat/RichmediaTemplates/Create/index.js +9 -2
@@ -25,7 +25,8 @@ import * as creativesContainerActions from '../../CreativesContainer/actions';
25
25
  // import callNativeEvent from '../../../utils/callNativeEvent';
26
26
  import {showError} from '../commonMethods';
27
27
  import withCreatives from '../../../hoc/withCreatives';
28
-
28
+ import { TRACK_EDIT_SMS } from '../../App/constants'
29
+ import { GA } from '@capillarytech/cap-ui-utils';
29
30
  export class Edit extends React.Component { // eslint-disable-line react/prefer-stateless-function
30
31
  constructor(props) {
31
32
  super(props);
@@ -219,6 +220,10 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
219
220
  this.setState({currentTab: data});
220
221
  }
221
222
  onUpdateTemplateComplete = (editResponse) => {
223
+ GA.timeTracker.stopTimer(TRACK_EDIT_SMS, {
224
+ category: 'Creatives',
225
+ action: 'Edit',
226
+ });
222
227
  if (editResponse.templateId) {
223
228
  this.resetSchema();
224
229
  this.setState({
@@ -50,13 +50,14 @@ import Pagination from '../../v2Components/Pagination';
50
50
  import EmailPreview from '../../v2Components/EmailPreview';
51
51
  import CreativesContainer from '../CreativesContainer';
52
52
  import WechatRichmediaTemplatePreview from '../../v2Components/TemplatePreview/WechatRichmediaTemplatePreview';
53
+ import { CHANNEL_CREATE_TRACK_MAPPING, CHANNEL_EDIT_TRACK_MAPPING } from '../App/constants'
53
54
  import { MOBILE_PUSH, WECHAT, SMS, EMAIL, EBILL, LINE } from '../CreativesContainer/constants';
54
55
  import emailIllustration from '../Assets/images/emailIllustration.svg';
55
56
  import smsIllustration from '../Assets/images/smsIllustration.svg';
56
57
  import pushIllustration from '../Assets/images/pushIllustration.svg';
57
58
  import { CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
58
-
59
-
59
+ import { GA } from '@capillarytech/cap-ui-utils';
60
+ const { timeTracker } = GA;
60
61
  const {CapCustomCardList} = CapCustomCard;
61
62
  const InlineDiv = styled.div`
62
63
  display: inline;
@@ -75,6 +76,8 @@ const WECHAT_FILTERS = {
75
76
  RICHMEDIA: 'richmedia',
76
77
  MAPTEMPLATES: 'maptemplate',
77
78
  };
79
+
80
+
78
81
  export class Templates extends React.Component { // eslint-disable-line react/prefer-stateless-function
79
82
  constructor(props) {
80
83
  super(props);
@@ -163,6 +166,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
163
166
  }
164
167
 
165
168
  componentDidMount() {
169
+
166
170
  if (this.props.location.query.type === 'embedded' && this.isEnabledInLibraryModule("setLocale")) {
167
171
  this.setLocale();
168
172
  }
@@ -922,13 +926,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
922
926
  break;
923
927
  }
924
928
  };
925
-
929
+
926
930
  createTemplate(ev) {
927
931
  const type = this.props.location.query.type;
928
932
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
929
933
  const channel = this.state.channel.toLowerCase();
930
934
  //const keyType = ev.key && ev.key.toLowerCase() !== undefined ? ev.state.toLowerCase() : '';
931
935
  let routeParams = {};
936
+ timeTracker.startTimer(CHANNEL_CREATE_TRACK_MAPPING[channel]);
932
937
  if (this.isEnabledInLibraryModule("callCreateFromProps")) {
933
938
  this.props.createNew();
934
939
  } else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
@@ -1123,6 +1128,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1123
1128
  };
1124
1129
 
1125
1130
  handleEditClick(e, template, modeType, path) {
1131
+ timeTracker.startTimer(CHANNEL_EDIT_TRACK_MAPPING[this.state.channel.toLowerCase()]);
1126
1132
  if (modeType && modeType !== undefined) {
1127
1133
  this.setState({modeType});
1128
1134
  }
@@ -1572,7 +1578,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1572
1578
  });
1573
1579
  }
1574
1580
  return (<CapSpin spinning={fetchingWeCrmAccounts}>
1575
- {isEmpty(weCrmAccounts) && !fetchingWeCrmAccounts ? <FormattedMessage {...messages.noAccountsPresentWeChat} /> :
1581
+ {isEmpty(weCrmAccounts) && !fetchingWeCrmAccounts ? <FormattedMessage {...(channel === WECHAT ? messages.noAccountsPresentWeChat : messages.noAccountsPresent)} /> :
1576
1582
  <div style={{ overflowX: "auto", paddingBottom: CAP_SPACE_16 }}>
1577
1583
  <CapHeader
1578
1584
  title={isMobilePushChannel ? this.props.intl.formatMessage(messages.mobilepushAccount) : this.props.intl.formatMessage(messages.wechatAccount)}
@@ -0,0 +1,5 @@
1
+ .cap-tab-v2-wrapper{
2
+ .ant-tabs-tabpane {
3
+ border: none;
4
+ }
5
+ }
@@ -21,6 +21,7 @@ import messages from './messages';
21
21
  import * as actions from './actions';
22
22
  import Templates from '../Templates';
23
23
  import CallTask from '../CallTask';
24
+ import Facebook from '../Facebook';
24
25
  import Gallery from '../Assets/Gallery';
25
26
  import withStyles from '../../hoc/withStyles';
26
27
  import styles, { CapTabStyle } from './TemplatesV2.style';
@@ -33,32 +34,44 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
33
34
  constructor(props) {
34
35
  super(props);
35
36
  let defaultChannel = get(this, 'props.channel') || get(this, 'props.params.channel') || 'sms';
37
+ const {
38
+ intl,
39
+ channelsToHide = [],
40
+ channelsToDisable = [],
41
+ isFullMode,
42
+ onChannelChange,
43
+ } = props;
44
+
36
45
  const defaultPanes = {
37
- sms: {content: <div></div>, tab: props.intl.formatMessage(messages.sms), key: 'sms'},
38
- email: {content: <div></div>, tab: props.intl.formatMessage(messages.email), key: 'email'},
39
- weChat: {content: <div></div>, tab: props.intl.formatMessage(messages.wechat), key: 'wechat'},
46
+ sms: {content: <div></div>, tab: intl.formatMessage(messages.sms), key: 'sms'},
47
+ email: {content: <div></div>, tab: intl.formatMessage(messages.email), key: 'email'},
48
+ weChat: {content: <div></div>, tab: intl.formatMessage(messages.wechat), key: 'wechat'},
40
49
  //'wechat': {content: this.getTemplatesComponent('wechat'), tab: 'Wechat', key: 'wechat'},
41
- mPush: {content: <div></div>, tab: props.intl.formatMessage(messages.pushNotification), key: 'mobilepush'},
50
+ mPush: {content: <div></div>, tab: intl.formatMessage(messages.pushNotification), key: 'mobilepush'},
42
51
  };
43
- const channelsToHide = this.props.channelsToHide || [];
44
- const channelsToDisable = this.props.channelsToDisable || [];
45
52
  let filteredPanes = Object.keys(defaultPanes)
46
53
  .filter((key) => !channelsToHide.includes(key)).reduce((obj = [], key) => {
47
54
  obj.push(defaultPanes[key]);
48
55
  return obj;
49
56
  }, []);
50
57
 
51
- if (props.isFullMode ) {
52
- filteredPanes.push({content: <div></div>, tab: props.intl.formatMessage(messages.gallery), key: 'assets'});
53
- } else if (!channelsToHide.includes('callTask')) {
54
- filteredPanes.push({content: <div></div>, tab: props.intl.formatMessage(messages.callTask), key: 'call_task'});
58
+ if (isFullMode ) {
59
+ filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.gallery), key: 'assets'});
60
+ } else {
61
+ if (!channelsToHide.includes('callTask')) {
62
+ filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.callTask), key: 'call_task'});
63
+ }
64
+ if (!channelsToHide.includes('facebook')) {
65
+ filteredPanes.push({content: <div></div>, tab: intl.formatMessage(messages.facebook), key: 'facebook'});
66
+ }
55
67
  }
56
68
 
57
69
  filteredPanes = filteredPanes.map( (pane) => {
58
70
  if (channelsToDisable.includes(pane.key)) {
71
+ // eslint-disable-next-line no-param-reassign
59
72
  pane.disabled = true;
60
73
  }
61
- return pane;
74
+ return pane;
62
75
  });
63
76
 
64
77
  const channel = ['sms', 'email', 'mobilepush', 'call_task'];
@@ -78,7 +91,9 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
78
91
  selectedChannel: defaultChannel,
79
92
  panes,
80
93
  };
81
- !props.isFullMode && this.props.onChannelChange(defaultChannel);
94
+ if (!isFullMode) {
95
+ onChannelChange(defaultChannel);
96
+ }
82
97
  }
83
98
  componentWillReceiveProps(nextProps) {
84
99
  if (this.props.channel !== nextProps.channel) {
@@ -122,6 +137,17 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
122
137
  />
123
138
  );
124
139
 
140
+ getFacebookComponent = () => {
141
+ const { messageDetails, cap, onFacebookSubmit } = this.props;
142
+ return (
143
+ <Facebook
144
+ messageDetails={messageDetails}
145
+ cap={cap}
146
+ onFacebookSubmit={onFacebookSubmit}
147
+ />
148
+ );
149
+ }
150
+
125
151
  getTemplatesComponent(channel) {
126
152
  // const templates = this.props.Templates[`${channel}Templates`];
127
153
  let query = {};
@@ -134,6 +160,8 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
134
160
  return this.getCallTaskComponent();
135
161
  case 'assets':
136
162
  return this.getGalleryComponent(location);
163
+ case 'facebook':
164
+ return this.getFacebookComponent();
137
165
  default:
138
166
  return (<Templates
139
167
  key={channel}
@@ -182,16 +210,16 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
182
210
  { name: 'description', content: this.props.intl.formatMessage(messages.creativesDesc) },
183
211
  ]}
184
212
  />}
185
- <div className="component-wrapper">
186
- {isFullMode && <CapHeader title={<FormattedMessage {...messages.creatives}/>} description={<FormattedMessage {...messages.creativesDesc}/>}/>}
187
- <StyledCapTab
188
- panes={this.state.panes}
189
- onChange={this.channelChange}
190
- activeKey={this.state.selectedChannel}
191
- defaultActiveKey={this.state.selectedChannel}
192
- isFullMode={isFullMode}
193
- />
194
- </div>
213
+ <div className="component-wrapper">
214
+ {isFullMode && <CapHeader title={<FormattedMessage {...messages.creatives}/>} description={<FormattedMessage {...messages.creativesDesc}/>}/>}
215
+ <StyledCapTab
216
+ panes={this.state.panes}
217
+ onChange={this.channelChange}
218
+ activeKey={this.state.selectedChannel}
219
+ defaultActiveKey={this.state.selectedChannel}
220
+ isFullMode={isFullMode}
221
+ />
222
+ </div>
195
223
  </div>
196
224
 
197
225
  );
@@ -213,6 +241,9 @@ TemplatesV2.propTypes = {
213
241
  channelsToHide: PropTypes.array,
214
242
  className: PropTypes.string.isRequired,
215
243
  channelsToDisable: PropTypes.array,
244
+ onFacebookSubmit: PropTypes.func,
245
+ messageDetails: PropTypes.object,
246
+ cap: PropTypes.object,
216
247
  };
217
248
 
218
249
  TemplatesV2.defaultProps = {
@@ -42,6 +42,10 @@ export default defineMessages({
42
42
  id: 'creatives.containersV2.TemplatesV2.callTask',
43
43
  defaultMessage: 'Call Task',
44
44
  },
45
+ facebook: {
46
+ id: 'creatives.containersV2.TemplatesV2.facebook',
47
+ defaultMessage: 'Facebook',
48
+ },
45
49
  gallery: {
46
50
  id: 'creatives.containersV2.TemplatesV2.gallery',
47
51
  defaultMessage: 'Gallery',
@@ -29,6 +29,8 @@ import {getMessageObject} from '../../../utils/messageUtils';
29
29
  import * as templateActions from '../../Templates/actions';
30
30
  import './_mapTemplates.scss';
31
31
  import withCreatives from '../../../hoc/withCreatives';
32
+ import { GA } from '@capillarytech/cap-ui-utils';
33
+ import { TRACK_CREATE_WECHAT, TRACK_EDIT_WECHAT } from '../../App/constants'
32
34
 
33
35
  const SELECT_TEMPLATE_MODE = "selectTemplate";
34
36
  const MAP_TEMPLATE_MODE = "mapTemplateMode";
@@ -955,8 +957,9 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
955
957
  saveFormData(formData) {
956
958
  const obj = {};
957
959
  let selectedWechatData = {};
960
+ const isEdit = this.state.isEdit;
958
961
  const { getFormData } = this.props;
959
- if (this.state.isEdit) {
962
+ if (isEdit) {
960
963
  obj['_id'] = this.state.editTemplateData._id;
961
964
  selectedWechatData = {
962
965
  'template_id': this.state.editTemplateData.versions.base.template_id,
@@ -1010,6 +1013,11 @@ export class MapTemplates extends React.Component { // eslint-disable-line react
1010
1013
  getFormData(this.getFormData(obj));
1011
1014
  }, 0);
1012
1015
  }
1016
+ GA.timeTracker.stopTimer(isEdit ? TRACK_EDIT_WECHAT : TRACK_CREATE_WECHAT, {
1017
+ category: 'Creatives',
1018
+ action: isEdit ? 'Edit' : 'Create',
1019
+ label : 'MapTemplates',
1020
+ });
1013
1021
  console.log("Template created successfully", response, obj);
1014
1022
  });
1015
1023
  }
@@ -28,7 +28,8 @@ import WechatRichmediaTemplatePreview from '../../../../v2Components/TemplatePre
28
28
  import noImage from '../../../../assets/noImage.png';
29
29
  import Pagination from '../../../../v2Components/Pagination';
30
30
  import { CAP_SPACE_08, CAP_SPACE_12, CAP_SPACE_20, CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
31
-
31
+ import { GA } from '@capillarytech/cap-ui-utils';
32
+ import { TRACK_CREATE_WECHAT, TRACK_EDIT_WECHAT } from '../../../App/constants'
32
33
  export class Create extends React.Component { // eslint-disable-line react/prefer-stateless-function
33
34
  constructor(props) {
34
35
  super(props);
@@ -544,7 +545,8 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
544
545
  msgtype: "MPNEWS",
545
546
  msgcontent: "RICH_MEDIA_WECHAT",
546
547
  };
547
- if (this.state.isEdit) {
548
+ const isEdit = this.state.isEdit;
549
+ if (isEdit) {
548
550
  saveObj._id = this.props.templateId;
549
551
  saveObj.mediaId = this.props.mediaId;
550
552
  saveObj.type = "WECHAT";
@@ -554,6 +556,11 @@ export class Create extends React.Component { // eslint-disable-line react/prefe
554
556
  // CapNotification.success({
555
557
  // message: this.props.intl.formatMessage(messages.saveSuccess),
556
558
  // });
559
+ GA.timeTracker.stopTimer(isEdit ? TRACK_EDIT_WECHAT : TRACK_CREATE_WECHAT, {
560
+ category: 'Creatives',
561
+ action: isEdit ? 'Edit' : 'Create',
562
+ label : 'RichMedia',
563
+ });
557
564
  if (getFormData) {
558
565
  getFormData(this.getFormData({
559
566
  mediaId: response.mediaId,