@capillarytech/creatives-library 7.11.10 → 7.11.12

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 (28) hide show
  1. package/config/app.js +0 -1
  2. package/package.json +1 -2
  3. package/v2Components/CapImageUpload/messages.js +1 -1
  4. package/v2Components/TemplatePreview/_templatePreview.scss +1 -1
  5. package/v2Components/TemplatePreview/index.js +30 -32
  6. package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +33 -1
  7. package/v2Components/TemplatePreview/tests/index.test.js +7 -7
  8. package/v2Containers/CreativesContainer/SlideBoxContent.js +2 -2
  9. package/v2Containers/CreativesContainer/tests/SlideBoxContent.test.js +24 -4
  10. package/v2Containers/CreativesContainer/tests/SlideBoxHeader.test.js +23 -4
  11. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxContent.test.js.snap +147 -2
  12. package/v2Containers/CreativesContainer/tests/__snapshots__/SlideBoxHeader.test.js.snap +98 -0
  13. package/v2Containers/CreativesContainer/tests/__snapshots__/index.test.js.snap +71 -0
  14. package/v2Containers/CreativesContainer/tests/index.test.js +21 -9
  15. package/v2Containers/MobilePush/Edit/index.js +21 -34
  16. package/v2Containers/Rcs/actions.js +34 -6
  17. package/v2Containers/Rcs/constants.js +21 -8
  18. package/v2Containers/Rcs/index.js +203 -78
  19. package/v2Containers/Rcs/index.scss +21 -3
  20. package/v2Containers/Rcs/messages.js +18 -5
  21. package/v2Containers/Rcs/reducer.js +49 -14
  22. package/v2Containers/Rcs/sagas.js +87 -18
  23. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +145080 -0
  24. package/v2Containers/Rcs/tests/index.test.js +226 -0
  25. package/v2Containers/Rcs/tests/mockData.js +169 -0
  26. package/v2Containers/Rcs/utils.js +24 -21
  27. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +4 -4
  28. package/v2Containers/mockdata.js +567 -1588
@@ -4,7 +4,7 @@ import { shallowWithIntl } from '../../../helpers/intl-enzym-test-helpers';
4
4
  import { Creatives } from '../index';
5
5
  import mockdata from '../../mockdata';
6
6
 
7
- const { Templates, editTemplateData } = mockdata;
7
+ const { whatsappTemplates, rcsTemplates, whatsappEditTemplateData, rcsEditTemplateData } = mockdata;
8
8
 
9
9
  jest.mock("../../../v2Components/FormBuilder", () => ({
10
10
  __esModule: true,
@@ -20,10 +20,10 @@ describe('Test SlideBoxContent container', () => {
20
20
  jest.clearAllMocks();
21
21
  });
22
22
 
23
- const renderFunction = (channel, mode, templateData) => {
23
+ const renderFunction = (channel, mode, templates, templateData) => {
24
24
  renderedComponent = shallowWithIntl(
25
25
  <Creatives
26
- Templates={Templates}
26
+ Templates={templates}
27
27
  channel={channel}
28
28
  slidBoxContent={mode}
29
29
  templateData={templateData}
@@ -34,12 +34,12 @@ describe('Test SlideBoxContent container', () => {
34
34
  };
35
35
 
36
36
  it('Should render correct component for whatsapp channel create mode', () => {
37
- renderFunction("WHATSAPP", "createTemplate", { mode: "create" });
37
+ renderFunction("WHATSAPP", "createTemplate", whatsappTemplates, { mode: "create" });
38
38
  expect(renderedComponent).toMatchSnapshot();
39
39
  });
40
40
 
41
41
  it('Should render correct component for whatsapp channel edit mode', () => {
42
- renderFunction("WHATSAPP", "editTemplate", editTemplateData);
42
+ renderFunction("WHATSAPP", "editTemplate", whatsappTemplates, whatsappEditTemplateData);
43
43
  renderedComponent.instance().onEditTemplate();
44
44
  renderedComponent.find('CapSlideBox').props().content.props.handleClose();
45
45
  expect(renderedComponent).toMatchSnapshot();
@@ -47,12 +47,24 @@ describe('Test SlideBoxContent container', () => {
47
47
  expect(handleCloseCreatives).toHaveBeenCalledWith(true);
48
48
  });
49
49
 
50
-
51
- it('Text getCreatives data', () => {
52
- renderFunction("WHATSAPP", "editTemplate", editTemplateData);
50
+ it('Text getCreatives data for whatsapp', () => {
51
+ renderFunction("WHATSAPP", "editTemplate", whatsappTemplates, whatsappEditTemplateData);
53
52
  renderedComponent.instance().onEditTemplate();
54
- renderedComponent.find('CapSlideBox').props().content.props.getFormData(editTemplateData);
53
+ renderedComponent.find('CapSlideBox').props().content.props.getFormData(whatsappEditTemplateData);
55
54
  expect(getCreativesData).toHaveBeenCalledTimes(1);
56
55
  expect(getCreativesData).toHaveBeenCalledWith({ channel: "WHATSAPP" });
57
56
  });
57
+
58
+ it('Should render correct component for rcs channel create mode', () => {
59
+ renderFunction("RCS", "createTemplate", rcsTemplates, { mode: "create" });
60
+ expect(renderedComponent).toMatchSnapshot();
61
+ });
62
+
63
+ it('Text getCreatives data for rcs', () => {
64
+ renderFunction("RCS", "editTemplate", rcsTemplates, rcsEditTemplateData);
65
+ renderedComponent.instance().onEditTemplate();
66
+ renderedComponent.find('CapSlideBox').props().content.props.getFormData(rcsEditTemplateData);
67
+ expect(getCreativesData).toHaveBeenCalledTimes(1);
68
+ expect(getCreativesData).toHaveBeenCalledWith({ channel: "RCS" });
69
+ });
58
70
  });
@@ -60,7 +60,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
60
60
  this.getLinkTypeFields = getLinkTypeFields.bind(this);
61
61
  }
62
62
  componentWillMount() {
63
-
64
63
  this.props.actions.getWeCrmAccounts("mobilepush");
65
64
  if (!this.props.Templates.selectedWeChatAccount && this.props.location.query.type !== 'embedded') {
66
65
  const type = this.props.location.query.type;
@@ -76,7 +75,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
76
75
  version: "v2",
77
76
  };
78
77
  this.props.globalActions.fetchSchemaForEntity(query);
79
-
80
78
  }
81
79
  }
82
80
  componentDidMount() {
@@ -106,10 +104,9 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
106
104
  } else if (nextProps.isGetFormData && this.props.isGetFormData !== nextProps.isGetFormData && this.props.isFullMode && !this.props.Create.createTemplateInProgress) {
107
105
  this.startValidation();
108
106
  }
109
- const selectedWeChatAccount = (!_.isEmpty(this.props.Templates.selectedWeChatAccount) ? this.props.Templates.selectedWeChatAccount :
107
+ const selectedWeChatAccount = (!_.isEmpty(this.props.Templates.selectedWeChatAccount) ? this.props.Templates.selectedWeChatAccount :
110
108
  (!_.isEmpty(this.props.Edit.selectedWeChatAccount) ? this.props.Edit.selectedWeChatAccount : nextProps.Edit.selectedWeChatAccount));
111
109
  if (this.props.location.query.type === 'embedded' && !nextProps.Edit.fetchingWeCrmAccounts && !_.isEqual(this.props.Edit.weCrmAccounts, nextProps.Edit.weCrmAccounts) && (!selectedWeChatAccount || _.isEmpty(selectedWeChatAccount))) {
112
-
113
110
  this.setMobilePushAccountOptions(nextProps.Edit.weCrmAccounts, get(this.props, "templateData.definition.accountId"));
114
111
  }
115
112
  if (!_.isEmpty(nextProps.Edit.selectedWeChatAccount) && !_.isEqual(this.props.Edit.selectedWeChatAccount, nextProps.Edit.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && this.props.location.query.module === "loyalty") {
@@ -175,7 +172,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
175
172
  });
176
173
  };
177
174
  onFormDataChange = (formData, tabCount, currentTab, inputField) => {
178
-
179
175
  const newFormData = _.cloneDeep(formData);
180
176
  const {templateCta} = this.state;
181
177
  if (!_.isEmpty(templateCta) && this.state.currentTab === 2) {
@@ -241,12 +237,10 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
241
237
  };
242
238
 
243
239
  onTabChange = (data) => {
244
-
245
240
  this.setState({currentTab: data});
246
241
  };
247
242
 
248
243
  onTagSelect = (data, currentTab, srcComp) => {
249
-
250
244
  const editorId = srcComp.target;
251
245
  this.insertAtCursor(document.getElementById(editorId), `{{${data}}}`, currentTab);
252
246
  document.getElementById(editorId).focus();
@@ -259,10 +253,10 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
259
253
  onUpdateTemplateComplete = (response) => {
260
254
  const obj = this.getTransformedData(this.state.formData);
261
255
  const content = getContent(obj);
262
- const {
256
+ const {
263
257
  definition: {
264
- mode: definitionMode
265
- }
258
+ mode: definitionMode,
259
+ },
266
260
  } = obj || {};
267
261
  const label = this.props.location.pathname.indexOf('image') >= 0 ? 'image' : 'text';
268
262
  const timeTaken = GA.timeTracker.stopTimer(TRACK_EDIT_MPUSH, {
@@ -278,12 +272,12 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
278
272
  timeTaken,
279
273
  content,
280
274
  mode: EDIT,
281
- imageAdded: definitionMode === 'image'
282
- })
283
- } catch(e) {
275
+ imageAdded: definitionMode === 'image',
276
+ });
277
+ } catch (e) {
284
278
  console.log(e);
285
279
  }
286
-
280
+
287
281
  this.resetSchema();
288
282
  this.setState({
289
283
  formData: {},
@@ -535,7 +529,8 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
535
529
  delete cta.ioscdeepLinkName;
536
530
  }
537
531
  obj.versions.base.IOS.expandableDetails.ctas.push(cta);
538
- obj.versions.base.IOS.expandableDetails.categoryId = get(this.state, "templateCta.id");
532
+ obj.versions.base.IOS.expandableDetails.categoryId = get(this.state, "templateCta.id") || get(this.state.editData, 'versions.base.IOS.expandableDetails.categoryId');
533
+
539
534
  if (obj.versions.base.IOS.expandableDetails.ctas[obj.versions.base.IOS.expandableDetails.ctas.length - 1].type === "DEEP_LINK") {
540
535
  const params = _.map(ios, (field, key) => {
541
536
  let actionLink;
@@ -603,13 +598,12 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
603
598
  getMappedEvent = (id, event) => {
604
599
  const map = this.state.eventsMap;
605
600
  if (!map[id] || !map[id][event]) {
606
-
601
+
607
602
  }
608
603
  return map[id][event];
609
604
  };
610
605
 
611
606
  getCurrentWindow = (e) => {
612
-
613
607
  const response = {
614
608
  action: e.action,
615
609
  value: 'edit',
@@ -619,13 +613,12 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
619
613
  };
620
614
 
621
615
  getFormData = (e) => {
622
-
623
616
  const response = {
624
617
  action: "getFormData",
625
618
  value: this.getTransformedData(this.state.formData),
626
619
  validity: this.state.isFormValid,
627
620
  };
628
-
621
+
629
622
  this.setState({checkValidation: true}, this.showError);
630
623
  if (e) {
631
624
  e.source.postMessage(JSON.stringify(response), e.origin);
@@ -635,7 +628,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
635
628
 
636
629
 
637
630
  setEditState(data, schema) {
638
-
639
631
  const tabCount = Object.keys(data.versions.base).length;
640
632
  const formData = {};
641
633
  if (this.props.location.query.type === 'embedded' && this.props.location.query.module === "loyalty") {
@@ -775,7 +767,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
775
767
  formData[0].base = true;
776
768
  // formData[0].tabKey = '1';
777
769
  // formData[1].tabKey = '2';
778
-
770
+
779
771
  this.setState({templateCta}, () => {
780
772
  this.getSchemaForFormData(formData, schema);
781
773
  this.setState({tabCount, formData, editData: data, currentTab: 1}, () => {
@@ -1361,7 +1353,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1361
1353
 
1362
1354
 
1363
1355
  startTemplateCreation = (data) => {
1364
-
1365
1356
  if (!this.state.isContentEditLoaded && this.state.fullSchema && this.props.Edit.weCrmAccounts) {
1366
1357
  const schema = JSON.stringify(data).indexOf("BIG_PICTURE") > -1 ? this.state.fullSchema.imageSchema : this.state.fullSchema.textSchema;
1367
1358
  this.setMobilePushAccountOptions(this.props.Edit.weCrmAccounts, data.content.accId);
@@ -1377,7 +1368,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1377
1368
  }
1378
1369
  };
1379
1370
  discardValues = () => {
1380
-
1381
1371
  this.resetSchema();
1382
1372
  this.setState({
1383
1373
  formData: {},
@@ -1403,7 +1393,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1403
1393
 
1404
1394
  };
1405
1395
  moveToTemplates = () => {
1406
-
1407
1396
  const modalContent = {
1408
1397
  title: this.props.intl.formatMessage(messages.alertMessage),
1409
1398
  body: this.props.intl.formatMessage(messages.goBackTemporaryChangesLost),
@@ -1478,17 +1467,16 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1478
1467
  };
1479
1468
 
1480
1469
  saveFormData = (formData) => {
1481
-
1482
1470
  const obj = this.getTransformedData(formData);
1483
-
1471
+
1484
1472
  this.props.actions.editTemplate(obj, this.onUpdateTemplateComplete);
1485
1473
  };
1486
1474
  handleFrameTasks = (e) => {
1487
- //
1475
+ //
1488
1476
  const type = e.data;
1489
-
1477
+
1490
1478
  if (typeof type === 'object') {
1491
- //
1479
+ //
1492
1480
  const action = type.action;
1493
1481
  switch (action) {
1494
1482
  case "startTemplateCreation":
@@ -1509,15 +1497,15 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1509
1497
  this.getFormData(e);
1510
1498
  break;
1511
1499
  case "startTemplateCreation":
1512
-
1500
+
1513
1501
  //this.getFormData(e);
1514
1502
  break;
1515
1503
  case "moveToTemplates":
1516
-
1504
+
1517
1505
  this.moveToTemplates();
1518
1506
  break;
1519
1507
  case "validateContent":
1520
-
1508
+
1521
1509
  this.validateContent(e);
1522
1510
  break;
1523
1511
  default:
@@ -1726,7 +1714,7 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1726
1714
  tempContainer = this.injectContainer(tempContainer);
1727
1715
  return tempContainer;
1728
1716
  });
1729
-
1717
+
1730
1718
  this.setState({schema, loadingContentEdit: false}, () => {
1731
1719
  this.removeStandAlone();
1732
1720
  });
@@ -1747,7 +1735,6 @@ export class Edit extends React.Component { // eslint-disable-line react/prefer-
1747
1735
  this.setState({ schema });
1748
1736
  };
1749
1737
  handleOnTagsContextChange = (data) => {
1750
-
1751
1738
  const query = {
1752
1739
  layout: 'mobilepush',
1753
1740
  type: 'TAG',
@@ -1,12 +1,16 @@
1
1
  import {
2
- UPLOAD_ASSET_REQUEST,
3
- CLEAR_ASSET,
4
- CREATE_TEMPLATE_REQUEST,
2
+ RCS,
3
+ UPLOAD_RCS_ASSET_REQUEST,
4
+ CLEAR_RCS_ASSET,
5
+ CREATE_RCS_TEMPLATE_REQUEST,
5
6
  CLEAR_CREATE_RESPONSE_REQUEST,
7
+ GET_RCS_TEMPLATE_DETAILS_REQUEST,
8
+ CLEAR_EDIT_RESPONSE_REQUEST,
9
+ EDIT_RCS_TEMPLATE_REQUEST,
6
10
  } from './constants';
7
11
 
8
12
  export const uploadRcsAsset = (file, assetType, fileParams, templateType) => ({
9
- type: UPLOAD_ASSET_REQUEST,
13
+ type: UPLOAD_RCS_ASSET_REQUEST,
10
14
  file,
11
15
  assetType,
12
16
  fileParams,
@@ -14,7 +18,7 @@ export const uploadRcsAsset = (file, assetType, fileParams, templateType) => ({
14
18
  });
15
19
 
16
20
  export const clearRcsAsset = (templateType) => ({
17
- type: CLEAR_ASSET,
21
+ type: CLEAR_RCS_ASSET,
18
22
  templateType,
19
23
  });
20
24
 
@@ -23,7 +27,31 @@ export const clearCreateResponse = () => ({
23
27
  });
24
28
 
25
29
  export const createTemplate = (template, callback) => ({
26
- type: CREATE_TEMPLATE_REQUEST,
30
+ type: CREATE_RCS_TEMPLATE_REQUEST,
27
31
  template,
28
32
  callback,
29
33
  });
34
+
35
+ // FOR EDIT
36
+ export function getTemplateDetails(id, callback) {
37
+ return {
38
+ type: GET_RCS_TEMPLATE_DETAILS_REQUEST,
39
+ id,
40
+ channel: RCS,
41
+ callback,
42
+ };
43
+ }
44
+
45
+ export function editTemplate(template, callback) {
46
+ return {
47
+ type: EDIT_RCS_TEMPLATE_REQUEST,
48
+ template,
49
+ callback,
50
+ };
51
+ }
52
+
53
+ export function clearEditResponse() {
54
+ return {
55
+ type: CLEAR_EDIT_RESPONSE_REQUEST,
56
+ };
57
+ }
@@ -14,7 +14,9 @@ export const RCS_DLT_MODE = {
14
14
  TEMPLATES: 'templates',
15
15
  EDIT: 'editTemplate',
16
16
  };
17
- export const TEMPLATE_MESSAGE_MAX_LENGTH = 1000;
17
+ export const TEMPLATE_DESC_MAX_LENGTH = 1000;
18
+ export const FALLBACK_MESSAGE_MAX_LENGTH = 160;
19
+ export const TEMPLATE_TITLE_MAX_LENGTH = 200;
18
20
  export const TAG = 'TAG';
19
21
  export const EMBEDDED = 'embedded';
20
22
  export const DEFAULT = 'default';
@@ -27,12 +29,23 @@ export const RCS_IMG_HEIGHT = 720;
27
29
  export const RCS_IMG_SIZE = 2000000; // 2MB
28
30
 
29
31
  const prefix = 'app/v2Containers/Rcs';
30
- export const UPLOAD_ASSET_REQUEST = `${prefix}/UPLOAD_ASSET_REQUEST`;
31
- export const UPLOAD_ASSET_SUCCESS = `${prefix}/UPLOAD_ASSET_SUCCESS`;
32
- export const UPLOAD_ASSET_FAILURE = `${prefix}/UPLOAD_ASSET_FAILURE`;
33
- export const CLEAR_ASSET = `${prefix}/CLEAR_ASSET`;
32
+ export const UPLOAD_RCS_ASSET_REQUEST = `${prefix}/UPLOAD_RCS_ASSET_REQUEST`;
33
+ export const UPLOAD_RCS_ASSET_SUCCESS = `${prefix}/UPLOAD_RCS_ASSET_SUCCESS`;
34
+ export const UPLOAD_RCS_ASSET_FAILURE = `${prefix}/UPLOAD_RCS_ASSET_FAILURE`;
35
+ export const CLEAR_RCS_ASSET = `${prefix}/CLEAR_RCS_ASSET`;
34
36
 
35
- export const CREATE_TEMPLATE_REQUEST = `${prefix}/CREATE_TEMPLATE_REQUEST`;
36
- export const CREATE_TEMPLATE_SUCCESS = `${prefix}/CREATE_TEMPLATE_SUCCESS`;
37
- export const CREATE_TEMPLATE_FAILURE = `${prefix}/CREATE_TEMPLATE_FAILURE`;
37
+ export const CREATE_RCS_TEMPLATE_REQUEST = `${prefix}/CREATE_RCS_TEMPLATE_REQUEST`;
38
+ export const CREATE_RCS_TEMPLATE_SUCCESS = `${prefix}/CREATE_RCS_TEMPLATE_SUCCESS`;
39
+ export const CREATE_RCS_TEMPLATE_FAILURE = `${prefix}/CREATE_RCS_TEMPLATE_FAILURE`;
38
40
  export const CLEAR_CREATE_RESPONSE_REQUEST = `${prefix}/Create/CLEAR_CREATE_RESPONSE_REQUEST`;
41
+
42
+
43
+ export const GET_RCS_TEMPLATE_DETAILS_REQUEST = `${prefix}/GET_RCS_TEMPLATE_DETAILS_REQUEST`;
44
+ export const GET_RCS_TEMPLATE_DETAILS_SUCCESS = `${prefix}/GET_RCS_TEMPLATE_DETAILS_SUCCESS`;
45
+ export const GET_RCS_TEMPLATE_DETAILS_FAILURE = `${prefix}/GET_RCS_TEMPLATE_DETAILS_FAILURE`;
46
+
47
+ export const EDIT_RCS_TEMPLATE_REQUEST = `${prefix}/EDIT_RCS_TEMPLATE_REQUEST`;
48
+ export const EDIT_RCS_TEMPLATE_SUCCESS = `${prefix}/EDIT_RCS_TEMPLATE_SUCCESS`;
49
+ export const EDIT_RCS_TEMPLATE_FAILURE = `${prefix}/EDIT_RCS_TEMPLATE_FAILURE`;
50
+ export const CLEAR_EDIT_RESPONSE_REQUEST = `${prefix}/Edit/CLEAR_EDIT_RESPONSE_REQUEST`;
51
+