@capillarytech/creatives-library 8.0.129 → 8.0.131

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 (55) hide show
  1. package/containers/Login/index.js +1 -2
  2. package/containers/Templates/constants.js +10 -1
  3. package/containers/Templates/index.js +45 -45
  4. package/package.json +1 -1
  5. package/services/api.js +14 -7
  6. package/services/tests/haptic-api.test.js +387 -0
  7. package/utils/createMobilePushPayload.js +322 -0
  8. package/utils/tests/{createPayload.test.js → createMobilePushPayload.test.js} +333 -64
  9. package/utils/tests/vendorDataTransformers.test.js +512 -0
  10. package/utils/vendorDataTransformers.js +108 -0
  11. package/v2Components/CapDeviceContent/index.js +1 -1
  12. package/v2Components/CapDocumentUpload/index.js +2 -2
  13. package/v2Components/CapImageUpload/index.js +2 -2
  14. package/v2Components/CapMpushCTA/index.js +13 -12
  15. package/v2Components/CapTagList/index.js +5 -5
  16. package/v2Components/CapVideoUpload/index.js +17 -7
  17. package/v2Components/MobilePushPreviewV2/index.js +28 -15
  18. package/v2Components/TemplatePreview/_templatePreview.scss +131 -29
  19. package/v2Components/TemplatePreview/index.js +130 -131
  20. package/v2Components/TemplatePreview/tests/__snapshots__/index.test.js.snap +10 -10
  21. package/v2Containers/CreativesContainer/index.js +6 -4
  22. package/v2Containers/Line/Container/tests/__snapshots__/index.test.js.snap +4748 -4658
  23. package/v2Containers/Login/index.js +1 -2
  24. package/v2Containers/MobilePush/tests/commonMethods.test.js +401 -0
  25. package/v2Containers/MobilePushNew/components/CtaButtons.js +18 -16
  26. package/v2Containers/MobilePushNew/components/MediaUploaders.js +46 -45
  27. package/v2Containers/MobilePushNew/components/PlatformContentFields.js +12 -11
  28. package/v2Containers/MobilePushNew/components/tests/CtaButtons.test.js +134 -367
  29. package/v2Containers/MobilePushNew/components/tests/MediaUploaders.test.js +1209 -143
  30. package/v2Containers/MobilePushNew/components/tests/PlatformContentFields.test.js +314 -3
  31. package/v2Containers/MobilePushNew/constants.js +1 -0
  32. package/v2Containers/MobilePushNew/hooks/tests/usePlatformSync.test.js +163 -0
  33. package/v2Containers/MobilePushNew/hooks/tests/useUpload.test.js +1131 -895
  34. package/v2Containers/MobilePushNew/hooks/usePlatformSync.js +172 -52
  35. package/v2Containers/MobilePushNew/hooks/useUpload.js +88 -74
  36. package/v2Containers/MobilePushNew/index.js +278 -1532
  37. package/v2Containers/MobilePushNew/messages.js +30 -0
  38. package/v2Containers/MobilePushNew/sagas.js +2 -7
  39. package/v2Containers/MobilePushNew/tests/sagas.test.js +41 -40
  40. package/v2Containers/MobilePushNew/tests/selectors.test.js +240 -0
  41. package/v2Containers/MobilePushNew/tests/utils.test.js +118 -19
  42. package/v2Containers/MobilePushNew/utils.js +53 -2
  43. package/v2Containers/Rcs/tests/__snapshots__/index.test.js.snap +1171 -971
  44. package/v2Containers/SmsTrai/Edit/tests/__snapshots__/index.test.js.snap +684 -424
  45. package/v2Containers/Templates/_templates.scss +0 -1
  46. package/v2Containers/Templates/index.js +58 -29
  47. package/v2Containers/Templates/sagas.js +0 -1
  48. package/v2Containers/Whatsapp/constants.js +32 -0
  49. package/v2Containers/Whatsapp/index.js +104 -25
  50. package/v2Containers/Whatsapp/tests/__snapshots__/index.test.js.snap +3992 -3677
  51. package/v2Containers/Whatsapp/tests/haptic.test.js +405 -0
  52. package/assets/loading_img.gif +0 -0
  53. package/utils/createPayload.js +0 -405
  54. /package/v2Components/TemplatePreview/assets/images/{Android _ With date and time.svg → Android_With_date_and_time.svg} +0 -0
  55. /package/v2Components/TemplatePreview/assets/images/{iOS _ With date and time.svg → iOS_With_date_and_time.svg} +0 -0
@@ -16,7 +16,6 @@ import * as actions from '../../containers/Cap/actions';
16
16
  import { capSaga } from '../Cap/sagas';
17
17
  import injectSaga from '../../utils/injectSaga';
18
18
  import { UserIsNotAuthenticated } from '../../utils/authWrapper';
19
- import loaderGif from '../../assets/loading_img.gif';
20
19
  const logo = require('./assets/images/capillary_logo.png');
21
20
 
22
21
  export class Login extends React.Component { // eslint-disable-line react/prefer-stateless-function
@@ -84,7 +83,7 @@ export class Login extends React.Component { // eslint-disable-line react/prefer
84
83
  ? <div className="cap-loader-box">
85
84
  <img
86
85
  className="loader-image"
87
- src={loaderGif}
86
+ src={"https://storage.crm.n.content-cdn.io/capillary/capillary_loading_logo.gif"}
88
87
  alt="Capillary"/>
89
88
  </div>
90
89
  : <Col className="login-box" style={{textAlign: 'center'}}>
@@ -47,5 +47,14 @@ export const CLEAR_TEMPLATE_STORE_DATA = "app/containers/Templates/CLEAR_TEMPLAT
47
47
 
48
48
  export const TRUE = 'true';
49
49
  export const FALSE = 'false';
50
+
51
+ // Channel constants
50
52
  export const EMAIL = 'email';
51
- export const TYPE_EMBEDDED = 'embedded';
53
+ export const SMS = 'sms';
54
+ export const LINE = 'line';
55
+ export const EBILL = 'ebill';
56
+ export const WECHAT = 'wechat';
57
+ export const WHATSAPP = 'whatsapp';
58
+ export const MOBILEPUSH = 'mobilepush';
59
+
60
+ export const TYPE_EMBEDDED = 'embedded';
@@ -112,7 +112,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
112
112
  componentWillMount() {
113
113
  if (this.state.channel === '') {
114
114
  let channel = '';
115
-
115
+
116
116
  switch (this.props.route.name.toLowerCase()) {
117
117
  case "sms":
118
118
  channel = 'Sms';
@@ -168,11 +168,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
168
168
  // this.props.actions.getEdmDefaultTemplates();
169
169
  // }
170
170
  }
171
-
171
+
172
172
  window.addEventListener("message", this.handleFrameTasks);
173
173
  }
174
174
  componentWillReceiveProps(nextProps) {
175
-
175
+
176
176
  const params = {
177
177
  name: this.state.searchText,
178
178
  sortBy: this.state.sortBy,
@@ -202,7 +202,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
202
202
  } else if (nextProps.route.name.toLowerCase() === 'line') {
203
203
  channel = 'Line';
204
204
  }
205
- //
205
+ //
206
206
  this.setState({ channel }, () => {
207
207
  if (this.state.channel.toLowerCase() === 'line' || this.state.channel.toLowerCase() === 'sms' || this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill' || (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount))) {
208
208
  if (this.state.channel.toLowerCase() === 'wechat' && !_.isEmpty(nextProps.Templates.selectedWeChatAccount)) {
@@ -314,14 +314,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
314
314
  }
315
315
  if (!nextProps.Templates.deleteTemplateInProgress && !_.isEqual(nextProps.Templates.deleteTemplateInProgress, this.props.Templates.deleteTemplateInProgress) &&
316
316
  nextProps.Templates.deleteResponse) {
317
-
317
+
318
318
  const message = getMessageObject('success', `${this.state.channel.toUpperCase()} ${this.props.intl.formatMessage(messages['Template deleted successfully'])}`, true);
319
319
  nextProps.globalActions.addMessageToQueue(message);
320
320
  this.getAllTemplates({params, resetPage: true});
321
321
  }
322
322
 
323
323
  if (!nextProps.Templates.sendingFile && !_.isEqual(this.props.Templates.sendingFile, nextProps.Templates.sendingFile) && !nextProps.Templates.errorSendingFile) {
324
-
324
+
325
325
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
326
326
  const isLanguageSupport = (this.props.location.query.isLanguageSupport) ? this.props.location.query.isLanguageSupport : true;
327
327
  const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
@@ -369,14 +369,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
369
369
  }
370
370
 
371
371
  componentWillUnmount() {
372
-
372
+
373
373
  window.removeEventListener("message", this.handleFrameTasks);
374
374
  this.props.actions.resetTemplateStoreData();
375
375
  // this.setState({defaultAccount: false});
376
376
  }
377
377
 
378
378
  onAccountSelect(value, option) {
379
-
379
+
380
380
  this.setState({selectedAccount: value}, () => {
381
381
  const params = {
382
382
  name: this.state.searchText,
@@ -391,7 +391,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
391
391
  this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
392
392
  params.accountId = this.props.Templates.weCrmAccounts[_.findIndex(this.props.Templates.weCrmAccounts, { name: value})].id;
393
393
  }
394
-
394
+
395
395
  this.getAllTemplates({params, resetPage: true});
396
396
  });
397
397
  }
@@ -404,7 +404,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
404
404
  }
405
405
  locale = this.getMappedLocale(locale);
406
406
  //locale = 'zh';
407
-
407
+
408
408
  moment.locale(locale);
409
409
  };
410
410
 
@@ -419,7 +419,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
419
419
  getAllTemplates = ({params, getNextPage, resetPage}, resetTemplates) => {
420
420
  let queryParams = params;
421
421
  let page = this.state.page;
422
-
422
+
423
423
  if (resetTemplates) {
424
424
  queryParams.name = this.state.searchText;
425
425
  queryParams.sortBy = this.state.sortBy;
@@ -463,7 +463,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
463
463
  };
464
464
 
465
465
  getCurrentWindow(e) {
466
-
466
+
467
467
  const response = {
468
468
  action: e.action,
469
469
  value: 'templates',
@@ -471,9 +471,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
471
471
  };
472
472
  parent.postMessage(JSON.stringify(response), '*');
473
473
  }
474
-
474
+
475
475
  skipTemplateSelection = (e) => {
476
-
476
+
477
477
  const type = this.props.location.query.type;
478
478
  const module = (type === 'embedded') ? this.props.location.query.module : 'default';
479
479
  if (this.state.channel.toLowerCase() === 'email') {
@@ -514,12 +514,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
514
514
  }
515
515
 
516
516
  handleMenuAction = (item = {}, key) => {
517
-
517
+
518
518
  if ((item.key || '').toLowerCase() === 'uploadfile') {
519
519
  document.getElementById('filename').click();
520
-
520
+
521
521
  } else if ((item.key || '').toLowerCase() === 'useeditor') {
522
-
522
+
523
523
  this.toggleEdmEmailTemplateSelection();
524
524
  }
525
525
  };
@@ -555,13 +555,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
555
555
  const module = this.props.location.query.module ? this.props.location.query.module : 'default';
556
556
  const isLanguageSupport = this.props.location.query.isLanguageSupport ? this.props.location.query.isLanguageSupport : true;
557
557
  const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
558
-
558
+
559
559
  if (supportedZipFormats.indexOf(fileExtension.toLowerCase()) !== -1) {
560
-
560
+
561
561
  this.props.actions.handleZipUpload(files[0]);
562
562
  document.getElementById("filename").value = "";
563
563
  } else if (fileExtension === 'html' || fileExtension === 'htm') {
564
-
564
+
565
565
  const reader = new FileReader();
566
566
  reader.onload = () => {
567
567
  const text = reader.result;
@@ -688,17 +688,17 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
688
688
  return result;
689
689
  }
690
690
  startLoading(ifEdit) {
691
-
691
+
692
692
  if (ifEdit) {
693
693
  this.setState({loading: true});
694
694
  }
695
695
  }
696
696
 
697
697
  startTemplateCreation(data) {
698
-
698
+
699
699
  if (data.edit) {
700
700
  const ifUnicode = checkUnicode(data.content);
701
-
701
+
702
702
  const content = data.content;
703
703
  const tempData = {
704
704
  'sms-editor': content,
@@ -713,10 +713,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
713
713
  }
714
714
 
715
715
  handleFrameTasks = (e) => {
716
-
716
+
717
717
  const type = e.data;
718
718
  if (typeof type === 'object') {
719
-
719
+
720
720
  const action = type.action;
721
721
  switch (action) {
722
722
  case "startTemplateCreation":
@@ -737,11 +737,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
737
737
  }
738
738
  switch (type) {
739
739
  case "startTemplateCreation":
740
-
740
+
741
741
  //this.getFormData(e);
742
742
  break;
743
743
  case "validateContent":
744
-
744
+
745
745
  this.validateContent(e);
746
746
  break;
747
747
  default:
@@ -801,7 +801,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
801
801
  }
802
802
 
803
803
  searchTemplate(data) {
804
-
804
+
805
805
  this.setState({searchText: data}, () => {
806
806
  const params = {
807
807
  name: this.state.searchText,
@@ -855,14 +855,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
855
855
  if (this.state.channel.toLowerCase() === 'ebill' || this.state.channel.toLowerCase() === 'email') {
856
856
  this.toggleEmailPreview();
857
857
  } else {
858
-
858
+
859
859
  this.setState( (prevState) => ({
860
860
  previewOpen: !prevState.previewOpen}));
861
861
  }
862
862
  }
863
863
 
864
864
  toggleEdmEmailTemplateSelection = () => {
865
-
865
+
866
866
  this.setState( (prevState) => ({
867
867
  showEdmEmailTemplates: !prevState.showEdmEmailTemplates}), () => {
868
868
  this.props.actions.getEdmDefaultTemplates();
@@ -870,13 +870,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
870
870
  };
871
871
 
872
872
  deleteTemplate(template) {
873
-
873
+
874
874
  this.props.actions.deleteTemplate(this.state.channel.toUpperCase(), template._id);
875
875
  this.setState({actionTemplate: {}});
876
876
  }
877
877
 
878
878
  duplicateTemplate(template) {
879
-
879
+
880
880
  const duplicateObj = _.cloneDeep(template);
881
881
  duplicateObj.name = `${this.props.intl.formatMessage(messages.copyOf)} ${template.name} ${moment().format('MM-DD-YYYY HH:mm:ss')}`;
882
882
  delete duplicateObj._id;
@@ -901,7 +901,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
901
901
  }
902
902
 
903
903
  handleOnHoverItem(isHovering, id) {
904
-
904
+
905
905
  if (isHovering) {
906
906
  this.setState({hoveredItem: id});
907
907
  } else {
@@ -910,7 +910,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
910
910
  }
911
911
 
912
912
  handleOnItemClick(isClicked, id) {
913
-
913
+
914
914
  this.setState({clickedItem: id});
915
915
  }
916
916
 
@@ -923,7 +923,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
923
923
  const isLanguageSupport = this.props?.location?.query?.isLanguageSupport === TRUE;
924
924
  const isEdmSupport = this.props?.location?.query?.isEdmSupport !== FALSE;
925
925
  let getQuery = '';
926
-
926
+
927
927
  if (template) {
928
928
  this.props.actions.setEdmTemplate({
929
929
  ...template,
@@ -934,7 +934,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
934
934
 
935
935
  if (this.state.channel && this.state.channel.toLowerCase() === EMAIL) {
936
936
  getQuery = (type === TYPE_EMBEDDED) ? {
937
- type: TYPE_EMBEDDED,
937
+ type: TYPE_EMBEDDED,
938
938
  module,
939
939
  isLanguageSupport: isLanguageSupport ? 1 : 0,
940
940
  isEdmSupport: isEdmSupport ? 1 : 0,
@@ -963,7 +963,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
963
963
  };
964
964
 
965
965
  handleEditClick(e, id, modeType, path) {
966
-
966
+
967
967
  if (modeType && modeType !== undefined) {
968
968
  this.setState({modeType});
969
969
  }
@@ -973,9 +973,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
973
973
  const isEdmSupport = (this.props.location.query.isEdmSupport !== "false") || false;
974
974
  let getQuery = "";
975
975
  let pathName = path;
976
-
976
+
977
977
  e.stopPropagation();
978
-
978
+
979
979
  this.props.actions.resetTemplateData();
980
980
  if (this.state.channel.toLowerCase() === 'sms') {
981
981
  pathName = `/sms/edit/${id}`;
@@ -1024,7 +1024,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1024
1024
  templateInfo.content = template.versions.base;
1025
1025
  templateInfo.appName = this.props.Templates.selectedWeChatAccount.name;
1026
1026
  } else if (this.state.channel.toLowerCase() === "email") {
1027
-
1027
+
1028
1028
  this.props.actions.getTemplateDetails(template._id, EMAIL);
1029
1029
  } else if (this.state.channel.toLowerCase() === 'ebill') {
1030
1030
  this.props.actions.getTemplateDetails(template._id);
@@ -1115,9 +1115,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1115
1115
  });
1116
1116
  }*/
1117
1117
  data.map( (template = {}) => {
1118
- //
1118
+ //
1119
1119
  const temp = {};
1120
- //
1120
+ //
1121
1121
  const updateDateTime = (moment().format('DD-MM-YYYY') === moment(template.updatedAt).format('DD-MM-YYYY')) ? moment(template.updatedAt).format('hh:mma') : moment(template.updatedAt).format('DD MMM YYYY');
1122
1122
  let content = '';
1123
1123
  temp.id = template._id;
@@ -1143,8 +1143,8 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1143
1143
  );
1144
1144
  }
1145
1145
  } else if (this.state.channel.toLowerCase() === 'email' || this.state.channel.toLowerCase() === 'ebill') {
1146
- //
1147
-
1146
+ //
1147
+
1148
1148
  const imgSrc = template && template.versions && template.versions.base ? template.versions.base.preview_http_url : '';
1149
1149
  const ifPreviewGenerated = template && template.versions && template.versions.base ? template.versions.base.isPreviewGenerated : 0;
1150
1150
  content = <img src={imgSrc || ''} alt={this.props.intl.formatMessage(messages.previewGenerateText)} width="100%" height="100%"/>;
@@ -1753,4 +1753,4 @@ export default compose(
1753
1753
  withMPushCreateReducer,
1754
1754
  withLineCreateReducer,
1755
1755
  withConnect,
1756
- )(injectIntl(Templates));
1756
+ )(injectIntl(Templates));
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "8.0.129",
4
+ "version": "8.0.131",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
package/services/api.js CHANGED
@@ -277,7 +277,12 @@ export const createWeChatTemplate = ({template}) => {
277
277
  return request(url, getAPICallObject('POST', template));
278
278
  };
279
279
 
280
- export const createMobilePushTemplate = (template) => {
280
+ export const createMobilePushTemplate = ({template}) => {
281
+ const url = `${API_ENDPOINT}/templates/MOBILEPUSH`;
282
+ return request(url, getAPICallObject('POST', template));
283
+ };
284
+ //this is for new mobile push templates
285
+ export const createMobilePushTemplateV2 = (template) => {
281
286
  const url = `${API_ENDPOINT}/templates/MOBILEPUSH`;
282
287
  return request(url, getAPICallObject('POST', template));
283
288
  };
@@ -381,10 +386,12 @@ export const uploadFile = ({
381
386
  data.append('appSecret', wechatParams.appSecret);
382
387
  }
383
388
  if (whatsappParams) {
384
- data.append('source', whatsappParams.source);
385
- data.append('wabaId', whatsappParams.wabaId);
386
- data.append('accessToken', whatsappParams.accessToken);
387
- data.append('hostName', whatsappParams.hostName);
389
+ const { source, wabaId, accessToken, access_token, phoneId, hostName } = whatsappParams;
390
+ data.append('source', source);
391
+ data.append('wabaId', wabaId);
392
+ data.append('accessToken', accessToken || access_token);
393
+ data.append('phoneId', phoneId);
394
+ data.append('hostName', hostName);
388
395
  }
389
396
  const url = `${API_ENDPOINT}/assets/${assetType}`;
390
397
  // return API.post(url, data, true);
@@ -400,7 +407,7 @@ export const fetchSchemaForEntity = async ({queryParams}) => {
400
407
  if (queryParams.version === "v2" && queryParams.type === "LAYOUT") {
401
408
  const schema = getSchema(queryParams.layout);
402
409
  // Added async/await to ensure the schema object is resolved before returning it
403
- return await schema.then((layout) => layout).catch((err) => {
410
+ return schema.then((layout) => layout).catch((err) => {
404
411
  console.error(err);
405
412
  });
406
413
  }
@@ -617,7 +624,7 @@ export const getSupportVideosConfig = () => {
617
624
 
618
625
  export const getNavigationConfigApi = async () => {
619
626
  const url = `${ARYA_ENDPOINT}/navigations`;
620
- return await request(url, getAPICallObject('GET'));
627
+ return request(url, getAPICallObject('GET'));
621
628
  };
622
629
 
623
630
  export const getLiquidTags = (content) => {