@capillarytech/creatives-library 2.0.62 → 2.0.63

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 (48) hide show
  1. package/assets/NoImage1.js +50 -0
  2. package/assets/WithImage1.js +57 -0
  3. package/components/EmailPreview/assets/images/iPad.svg +10 -0
  4. package/components/EmailPreview/assets/images/mobile.png +0 -0
  5. package/components/FormBuilder/_formBuilder.scss +7 -1
  6. package/components/FormBuilder/index.js +96 -65
  7. package/components/MobilePushPreviewV2/index.js +120 -0
  8. package/components/MobilePushPreviewV2/messages.js +13 -0
  9. package/components/MobilePushPreviewV2/tests/index.test.js +10 -0
  10. package/components/TemplatePreview/index.js +1 -1
  11. package/containers/CreativesContainer/SlideBoxContent.js +27 -4
  12. package/containers/CreativesContainer/SlideBoxFooter.js +3 -3
  13. package/containers/CreativesContainer/index.js +71 -24
  14. package/containers/MobilePush/Create/_mobilePushCreate.scss +13 -0
  15. package/containers/MobilePush/Create/actions.js +6 -0
  16. package/containers/MobilePush/Create/constants.js +1 -0
  17. package/containers/MobilePush/Create/index.js +630 -1130
  18. package/containers/MobilePush/Create/messages.js +5 -1
  19. package/containers/MobilePush/Create/reducer.js +2 -0
  20. package/containers/MobilePush/Create/selectors.js +3 -3
  21. package/containers/MobilePush/Edit/_mobilePushCreate.scss +10 -0
  22. package/containers/MobilePush/Edit/index.js +375 -1106
  23. package/containers/MobilePush/Edit/messages.js +4 -0
  24. package/containers/MobilePush/Edit/reducer.js +2 -1
  25. package/containers/MobilePush/Edit/selectors.js +3 -1
  26. package/containers/MobilePush/commonMethods.js +249 -0
  27. package/containers/MobilePush/eventsMap.js +127 -0
  28. package/containers/MobilePush/initialSchema.js +1751 -0
  29. package/containers/MobilepushWrapper/_mobilepushWrapper.scss +18 -0
  30. package/containers/MobilepushWrapper/index.js +95 -0
  31. package/containers/MobilepushWrapper/messages.js +25 -0
  32. package/containers/MobilepushWrapper/tests/index.test.js +10 -0
  33. package/containers/WeChat/_wechat.scss +8 -0
  34. package/containers/WeChat/actions.js +52 -0
  35. package/containers/WeChat/constants.js +28 -0
  36. package/containers/WeChat/index.js +1635 -0
  37. package/containers/WeChat/messages.js +73 -0
  38. package/containers/WeChat/reducer.js +74 -0
  39. package/containers/WeChat/sagas.js +86 -0
  40. package/containers/WeChat/selectors.js +25 -0
  41. package/containers/WeChat/tests/actions.test.js +18 -0
  42. package/containers/WeChat/tests/index.test.js +10 -0
  43. package/containers/WeChat/tests/reducer.test.js +9 -0
  44. package/containers/WeChat/tests/sagas.test.js +15 -0
  45. package/containers/WeChat/tests/selectors.test.js +10 -0
  46. package/index.js +1 -1
  47. package/package.json +1 -1
  48. package/services/api.js +3 -0
@@ -155,7 +155,7 @@ class TemplatePreview extends React.Component { // eslint-disable-line react/pre
155
155
  </div>
156
156
  : ''
157
157
  }
158
- {this.props.templateData &&
158
+ {this.props.templateData && this.props.templateData.updatedByName &&
159
159
  [<p className="preview-info" key="preview-info-modified"><FormattedMessage {...messages.lastModified} />: {moment(this.props.templateData.updatedAt).format('MM-DD-YYYY')}</p>,
160
160
  <p style={{marginBottom: '8px'}} className="preview-info" key="preview-info-updated"><FormattedMessage {...messages.uploadedBy} /> : {this.props.templateData.updatedByName}</p>,
161
161
  ]
@@ -7,6 +7,7 @@ import SmsCreate from '../Sms/Create';
7
7
  import SmsEdit from '../Sms/Edit';
8
8
  import Email from '../Email';
9
9
  import EmailWrapper from '../EmailWrapper';
10
+ import MobilepusWrapper from '../MobilepushWrapper';
10
11
  import EmailPreviewV2 from '../../components/EmailPreviewV2';
11
12
  import CallTask from '../CallTask';
12
13
  import MobliPushEdit from '../MobilePush/Edit';
@@ -33,8 +34,10 @@ function SlideBoxContent(props) {
33
34
  onChannelChange,
34
35
  onEmailModeChange,
35
36
  emailCreateMode,
37
+ onMobilepushModeChange,
38
+ mobilePushCreateMode,
36
39
  templateStep,
37
- onEmailNextStep,
40
+ onCreateNextStep,
38
41
  cap,
39
42
  onResetStep,
40
43
  isFullMode,
@@ -152,7 +155,7 @@ function SlideBoxContent(props) {
152
155
  templateData={templateData}
153
156
  type={type}
154
157
  step={templateStep}
155
- showNextStep={onEmailNextStep}
158
+ showNextStep={onCreateNextStep}
156
159
  isFullMode={isFullMode}
157
160
  cap={cap}
158
161
  onResetStep={onResetStep}
@@ -181,7 +184,7 @@ function SlideBoxContent(props) {
181
184
  getFormLibraryData={getFormData}
182
185
  setIsLoadingContent={setIsLoadingContent}
183
186
  location={{
184
- pathname: `/mobilepush`,
187
+ pathname: `/mobilepush/edit/`,
185
188
  query,
186
189
  }}
187
190
  isFullMode={false}
@@ -190,6 +193,24 @@ function SlideBoxContent(props) {
190
193
  templateData={templateData}
191
194
  />
192
195
  }
196
+ {isCreateMPush &&
197
+ <MobilepusWrapper
198
+ key="creatives-mobilepush-wrapper"
199
+ date={new Date().getMilliseconds()}
200
+ setIsLoadingContent={setIsLoadingContent}
201
+ onMobilepushModeChange={onMobilepushModeChange}
202
+ mobilePushCreateMode={mobilePushCreateMode}
203
+ isGetFormData={isGetFormData}
204
+ getFormData={getFormData}
205
+ templateData={templateData}
206
+ type={type}
207
+ step={templateStep}
208
+ showNextStep={onCreateNextStep}
209
+ isFullMode={isFullMode}
210
+ cap={cap}
211
+ onResetStep={onResetStep}
212
+ query={query}/>
213
+ }
193
214
  </CreativesWrapper>
194
215
  );
195
216
  }
@@ -208,11 +229,13 @@ SlideBoxContent.propTypes = {
208
229
  onEmailModeChange: PropTypes.func,
209
230
  emailCreateMode: PropTypes.string,
210
231
  templateStep: PropTypes.string,
211
- onEmailNextStep: PropTypes.func,
232
+ onCreateNextStep: PropTypes.func,
212
233
  cap: PropTypes.object,
213
234
  onResetStep: PropTypes.func,
214
235
  onCallTaskSubmit: PropTypes.func,
215
236
  isFullMode: PropTypes.bool,
216
237
  setIsLoadingContent: PropTypes.func,
238
+ onMobilepushModeChange: PropTypes.func,
239
+ mobilePushCreateMode: PropTypes.string,
217
240
  };
218
241
  export default SlideBoxContent;
@@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl';
3
3
  import { CapButton } from '@capillarytech/cap-ui-library';
4
4
  import PropTypes from 'prop-types';
5
5
  function SlideBoxFooter(props) {
6
- const { slidBoxContent, onSave, messages, onEditTemplate, onEmailNextStep} = props;
6
+ const { slidBoxContent, onSave, messages, onEditTemplate, onCreateNextStep} = props;
7
7
  return (
8
8
  <div>
9
9
  <div>
@@ -13,7 +13,7 @@ function SlideBoxFooter(props) {
13
13
  </CapButton>
14
14
  )}
15
15
  {props.shouldShowContinueFooter() &&
16
- <CapButton onClick={onEmailNextStep}>
16
+ <CapButton onClick={onCreateNextStep}>
17
17
  <FormattedMessage {...messages.continue} />
18
18
  </CapButton>
19
19
  }
@@ -31,7 +31,7 @@ SlideBoxFooter.propTypes = {
31
31
  onSave: PropTypes.func,
32
32
  messages: PropTypes.object,
33
33
  onEditTemplate: PropTypes.func,
34
- onEmailNextStep: PropTypes.func,
34
+ onCreateNextStep: PropTypes.func,
35
35
  shouldShowContinueFooter: PropTypes.func,
36
36
  shouldShowDoneFooter: PropTypes.func,
37
37
  };
@@ -5,7 +5,7 @@ import {
5
5
  } from '@capillarytech/cap-ui-library';
6
6
  import { injectIntl } from 'react-intl';
7
7
  import classnames from 'classnames';
8
- import {isEmpty, get} from 'lodash';
8
+ import {isEmpty, get, forEach} from 'lodash';
9
9
  import { connect } from 'react-redux';
10
10
  import { createStructuredSelector } from 'reselect';
11
11
  import { bindActionCreators } from 'redux';
@@ -71,11 +71,11 @@ class Creatives extends React.Component {
71
71
  onChannelChange = (channel) => {
72
72
  this.setState({currentChannel: channel});
73
73
  }
74
- onEmailNextStep = () => {
74
+ onCreateNextStep = () => {
75
75
  this.setState((prevState) => {
76
76
  let templateStep = prevState.templateStep + 1;
77
77
  const {emailCreateMode, currentChannel} = prevState;
78
- if (currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") {
78
+ if ((currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") || currentChannel.toUpperCase() === constants.MOBILE_PUSH) {
79
79
  templateStep = prevState.templateStep + 2;
80
80
  }
81
81
 
@@ -88,7 +88,9 @@ class Creatives extends React.Component {
88
88
  onEmailModeChange = (mode) => {
89
89
  this.setState({ emailCreateMode: mode});
90
90
  }
91
-
91
+ onMobilepushModeChange = (mode) => {
92
+ this.setState({ mobilePushCreateMode: mode});
93
+ }
92
94
 
93
95
  onCallTaskSubmit = (data) => {
94
96
  this.props.getCreativesData({
@@ -118,10 +120,11 @@ class Creatives extends React.Component {
118
120
  const formData = {
119
121
  subject: templateData.emailSubject,
120
122
  html_content: templateData.emailBody,
121
- is_drag_drop: false,
122
- lang_id: 411,
123
- iso_code: "en",
124
- language: "English",
123
+ is_drag_drop: templateData.is_drag_drop,
124
+ lang_id: templateData.lang_id,
125
+ iso_code: templateData.iso_code,
126
+ language: templateData.language,
127
+ drag_drop_id: templateData.drag_drop_id,
125
128
  };
126
129
  creativesTeplateData = {
127
130
  base: formData,
@@ -136,6 +139,19 @@ class Creatives extends React.Component {
136
139
  edit: true,
137
140
  type: channel,
138
141
  };
142
+ } else if (channel === constants.MOBILE_PUSH) {
143
+ const mode = get(templateData, 'androidContent.type') || get(templateData, 'iosContent.type');
144
+ creativesTeplateData = {
145
+ type: channel,
146
+ name: templateData.messageSubject,
147
+ versions: {
148
+ base: {
149
+ ANDROID: templateData.androidContent,
150
+ IOS: templateData.iosContent,
151
+ },
152
+ },
153
+ definition: {accountId: templateData.accountId, mode: mode.toLowerCase()},
154
+ };
139
155
  }
140
156
  return creativesTeplateData;
141
157
  }
@@ -143,12 +159,14 @@ class Creatives extends React.Component {
143
159
  }
144
160
 
145
161
  getCreativesData = (channel, template) => { //from creatives to consumers
146
- const templateData = {channel };
162
+ let templateData = {channel };
147
163
  if (channel === constants.SMS && template.value.base) {
148
164
  templateData.messageBody = template.value.base['sms-editor'];
149
165
  } else if (channel === constants.EMAIL && template.value.base) {
150
- templateData.emailBody = template.value.base.html_content;
151
- templateData.emailSubject = template.value.base.subject;
166
+ const emailBase = template.value.base;
167
+ templateData = {...templateData, ...emailBase, emailBody: emailBase.html_content, emailSubject: emailBase.subject};
168
+ delete templateData.html_content;
169
+ delete templateData.subject;
152
170
  } else if (channel === constants.MOBILE_PUSH && get(template, "value.versions.base")) {
153
171
  const mobilpushTemplate = template.value;
154
172
  templateData.accountId = get(mobilpushTemplate, 'definition.accountId');
@@ -157,6 +175,11 @@ class Creatives extends React.Component {
157
175
  delete androidContent.cuid;
158
176
  delete androidContent.luid;
159
177
  delete androidContent.communicationId;
178
+ const custom = {};
179
+ forEach(androidContent.custom, (customKeyValue) => {
180
+ custom[customKeyValue.key] = customKeyValue.value;
181
+ } );
182
+ androidContent.custom = custom;
160
183
  templateData.androidContent = androidContent;
161
184
  templateData.androidContent.type = get(mobilpushTemplate, 'definition.mode').toUpperCase();
162
185
  templateData.androidContent.deviceType = 'ANDROID';
@@ -166,6 +189,11 @@ class Creatives extends React.Component {
166
189
  delete iosContent.cuid;
167
190
  delete iosContent.luid;
168
191
  delete iosContent.communicationId;
192
+ const custom = {};
193
+ forEach(iosContent.custom, (customKeyValue) => {
194
+ custom[customKeyValue.key] = customKeyValue.value;
195
+ } );
196
+ iosContent.custom = custom;
169
197
  templateData.iosContent = iosContent;
170
198
  templateData.iosContent.type = get(mobilpushTemplate, 'definition.mode').toUpperCase();
171
199
  templateData.iosContent.deviceType = 'IOS';
@@ -229,15 +257,19 @@ class Creatives extends React.Component {
229
257
  };
230
258
  shouldShowFooter = () => {
231
259
  const {isFullMode } = this.props;
232
- const {slidBoxContent, currentChannel, emailCreateMode, templateStep} = this.state;
260
+ const {slidBoxContent, currentChannel, emailCreateMode, templateStep, mobilePushCreateMode} = this.state;
233
261
  const channel = currentChannel.toUpperCase();
234
262
  const currentStep = this.creativesTemplateSteps[templateStep];
235
263
  let showFooter = false;
264
+ const isMobilepush = channel === constants.MOBILE_PUSH;
236
265
  if (!isFullMode ) {
237
266
  const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
238
267
  const isCreate = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
239
268
  const isCallTask = channel === constants.CALL_TASK;
240
269
  showFooter = (isCreate || (isEmailCreate && emailCreateMode) || slidBoxContent === 'preview') && !isCallTask;
270
+ if (isMobilepush) {
271
+ showFooter = currentStep === "modeSelection" || (currentStep === 'createTemplateContent' && !isEmpty(mobilePushCreateMode));
272
+ }
241
273
  } else if (channel === constants.EMAIL && isFullMode) {
242
274
  const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
243
275
  showFooter = isEmailCreate && emailCreateMode;
@@ -257,23 +289,36 @@ class Creatives extends React.Component {
257
289
  shouldShowDoneFooter = () => {
258
290
  const {slidBoxContent, templateStep, currentChannel} = this.state;
259
291
  const currentStep = this.creativesTemplateSteps[templateStep];
260
- const isEmailCreate = slidBoxContent === 'createTemplate' && currentChannel.toUpperCase() === constants.EMAIL && currentStep !== 'createTemplateContent';
261
- const isCreate = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
262
- return isCreate;
292
+ let showDone = false;
293
+ const channel = currentChannel.toUpperCase();
294
+ if (channel === constants.EMAIL || channel === constants.SMS) {
295
+ const isEmailCreate = slidBoxContent === 'createTemplate' && currentChannel.toUpperCase() === constants.EMAIL && currentStep !== 'createTemplateContent';
296
+ showDone = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
297
+ } else if (channel === constants.MOBILE_PUSH) {
298
+ showDone = currentStep === "createTemplateContent" || slidBoxContent === "editTemplate";
299
+ }
300
+
301
+ return showDone;
263
302
  }
264
303
  shouldShowContinueFooter = () => { // only for email for now, has to be modified according to channel
265
- const {slidBoxContent, templateStep, currentChannel, emailCreateMode} = this.state;
304
+ const {slidBoxContent, templateStep, currentChannel, emailCreateMode, mobilePushCreateMode} = this.state;
266
305
  let isShowContinueFooter = false;
267
- if ((emailCreateMode === "upload" && !isEmpty(this.props.EmailLayout)) || emailCreateMode === "editor") {
268
- const currentStep = this.creativesTemplateSteps[templateStep];
269
- let isEmailCreate = slidBoxContent === 'createTemplate';
270
- isEmailCreate = currentChannel.toUpperCase() === constants.EMAIL && ((emailCreateMode === "upload" && currentStep !== 'createTemplateContent') || ( emailCreateMode === "editor" && currentStep !== 'createTemplateContent' && currentStep !== "templateSelection"));
271
- isShowContinueFooter = isEmailCreate && emailCreateMode;
306
+ const currentStep = this.creativesTemplateSteps[templateStep];
307
+ const channel = currentChannel.toUpperCase();
308
+ if (channel === constants.EMAIL || channel === constants.SMS) {
309
+ if ((emailCreateMode === "upload" && !isEmpty(this.props.EmailLayout)) || emailCreateMode === "editor") {
310
+ let isEmailCreate = slidBoxContent === 'createTemplate';
311
+ isEmailCreate = currentChannel.toUpperCase() === constants.EMAIL && ((emailCreateMode === "upload" && currentStep !== 'createTemplateContent') || ( emailCreateMode === "editor" && currentStep !== 'createTemplateContent' && currentStep !== "templateSelection"));
312
+ isShowContinueFooter = isEmailCreate && emailCreateMode;
313
+ }
314
+ } else if (currentChannel.toUpperCase() === constants.MOBILE_PUSH) {
315
+ isShowContinueFooter = !isEmpty(mobilePushCreateMode) && currentStep === "modeSelection";
272
316
  }
317
+
273
318
  return isShowContinueFooter;
274
319
  }
275
320
  render() {
276
- const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent} = this.state;
321
+ const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent, mobilePushCreateMode} = this.state;
277
322
  const {isFullMode, creativesMode, cap, isUploading} = this.props;
278
323
  return (
279
324
  <div className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'}`)}>
@@ -308,10 +353,12 @@ class Creatives extends React.Component {
308
353
  onEmailModeChange={this.onEmailModeChange}//used when create is clicked in email
309
354
  emailCreateMode={emailCreateMode}// upload zip || use editor are values
310
355
  templateStep={this.creativesTemplateSteps[templateStep]}
311
- onEmailNextStep={this.onEmailNextStep}
356
+ onCreateNextStep={this.onCreateNextStep}
312
357
  onResetStep={this.resetStep}
313
358
  cap={cap}
314
359
  setIsLoadingContent={this.setIsLoadingContent}
360
+ onMobilepushModeChange={this.onMobilepushModeChange}
361
+ mobilePushCreateMode={mobilePushCreateMode}
315
362
  />
316
363
  }
317
364
  footer={this.shouldShowFooter() &&
@@ -320,7 +367,7 @@ class Creatives extends React.Component {
320
367
  onSave={this.saveMessage}
321
368
  onEditTemplate={this.onEditTemplate}
322
369
  slidBoxContent={slidBoxContent}
323
- onEmailNextStep={this.onEmailNextStep}
370
+ onCreateNextStep={this.onCreateNextStep}
324
371
  currentChannel={currentChannel.toUpperCase()}
325
372
  templateStep={this.creativesTemplateSteps[templateStep]}
326
373
  emailCreateMode={emailCreateMode}
@@ -19,3 +19,16 @@
19
19
  padding: 16px 16px 16px 0;
20
20
  border: solid 1px #D6D6D6;
21
21
  }
22
+
23
+ .ant-tabs-tab {
24
+ .form-tab-header{
25
+ .unsupported-channel {
26
+ .ant-tabs-nav & {
27
+ display: none;
28
+
29
+ }
30
+ }
31
+ }
32
+ }
33
+
34
+
@@ -44,3 +44,9 @@ export function clearAsset() {
44
44
  type: types.CLEAR_ASSET,
45
45
  };
46
46
  }
47
+
48
+ export function resetStore() {
49
+ return {
50
+ type: types.RESET_STORE,
51
+ };
52
+ }
@@ -21,3 +21,4 @@ export const CLEAR_CREATE_RESPONSE_FAILURE = 'app/containers/PushMessage/Create/
21
21
  export const GET_IOS_CTAS = 'app/containers/PushMessage/Create/GET_IOS_CTAS';
22
22
  export const GET_IOS_CTAS_SUCCESS = 'app/containers/PushMessage/Create/GET_IOS_CTAS_SUCCESS';
23
23
  export const GET_IOS_CTAS_FAILURE = 'app/containers/PushMessage/Create/GET_IOS_CTAS_FAILURE';
24
+ export const RESET_STORE = 'app/containers/PushMessage/Create/RESET_STORE';