@capillarytech/creatives-library 7.17.92-alpha.0 → 7.17.92

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 (54) hide show
  1. package/containers/Ebill/index.js +1 -0
  2. package/containers/MobilePush/Edit/index.js +1 -0
  3. package/index.js +6 -0
  4. package/package.json +1 -1
  5. package/routes.js +5 -0
  6. package/services/api.js +5 -0
  7. package/v2Components/CapDeviceContent/index.js +338 -0
  8. package/v2Components/CapDeviceContent/index.scss +115 -0
  9. package/v2Components/CapDeviceContent/messages.js +107 -0
  10. package/v2Components/CapDeviceContent/tests/index.test.js +75 -0
  11. package/v2Components/CapImageUpload/index.js +10 -3
  12. package/v2Components/CapImageUpload/messages.js +4 -0
  13. package/v2Components/CapInAppCTA/constants.js +25 -0
  14. package/v2Components/CapInAppCTA/index.js +281 -0
  15. package/v2Components/CapInAppCTA/index.scss +93 -0
  16. package/v2Components/CapInAppCTA/messages.js +85 -0
  17. package/v2Components/FormBuilder/index.js +3 -4
  18. package/v2Components/MobilePushPreviewV2/index.js +81 -23
  19. package/v2Components/TemplatePreview/_templatePreview.scss +448 -0
  20. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_bottom.svg +11 -0
  21. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_full.svg +11 -0
  22. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_modal.svg +11 -0
  23. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_top.svg +11 -0
  24. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_bottom.svg +6 -0
  25. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_full.svg +18 -0
  26. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_modal.svg +7 -0
  27. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_top.svg +13 -0
  28. package/v2Components/TemplatePreview/index.js +660 -375
  29. package/v2Components/TemplatePreview/messages.js +4 -0
  30. package/v2Containers/App/constants.js +1 -0
  31. package/v2Containers/CreativesContainer/SlideBoxContent.js +43 -0
  32. package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -1
  33. package/v2Containers/CreativesContainer/constants.js +1 -0
  34. package/v2Containers/CreativesContainer/index.js +94 -27
  35. package/v2Containers/CreativesContainer/messages.js +4 -0
  36. package/v2Containers/InApp/actions.js +64 -0
  37. package/v2Containers/InApp/constants.js +95 -0
  38. package/v2Containers/InApp/index.js +745 -0
  39. package/v2Containers/InApp/index.scss +47 -0
  40. package/v2Containers/InApp/messages.js +86 -0
  41. package/v2Containers/InApp/reducer.js +109 -0
  42. package/v2Containers/InApp/sagas.js +143 -0
  43. package/v2Containers/InApp/selectors.js +12 -0
  44. package/v2Containers/InApp/tests/action.test.js +53 -0
  45. package/v2Containers/InApp/tests/index.test.js +152 -0
  46. package/v2Containers/InApp/tests/mockData.js +897 -0
  47. package/v2Containers/InApp/tests/reducer.test.js +177 -0
  48. package/v2Containers/InApp/tests/sagas.test.js +391 -0
  49. package/v2Containers/MobilePush/Edit/index.js +3 -1
  50. package/v2Containers/Templates/_templates.scss +10 -0
  51. package/v2Containers/Templates/index.js +103 -23
  52. package/v2Containers/Templates/messages.js +20 -0
  53. package/v2Containers/TemplatesV2/index.js +8 -2
  54. package/v2Containers/TemplatesV2/messages.js +4 -0
@@ -53,6 +53,7 @@ import {
53
53
  import { makeSelectTemplates, makeSelectTemplatesResponse } from './selectors';
54
54
  import { makeSelectCreate as makeSelectCreateSms} from '../Sms/Create/selectors';
55
55
  import { makeSelectCreate as makeSelectCreateMobilePush } from '../MobilePush/Create/selectors';
56
+ import { makeSelectInApp } from '../InApp/selectors';
56
57
  import { makeSelectEbill as makeSelectCreateEbill } from '../Ebill/selectors';
57
58
  import { makeSelectEmail as makeSelectCreateEmail } from '../Email/selectors';
58
59
  import { makeSelectEdit } from '../Sms/Edit/selectors';
@@ -66,6 +67,7 @@ import {checkUnicode} from '../../utils/smsCharCountV2';
66
67
  import * as actions from './actions';
67
68
  import * as smsActions from '../Sms/Create/actions';
68
69
  import * as mobilepushActions from '../MobilePush/Create/actions';
70
+ import * as inAppActions from '../InApp/actions';
69
71
  import * as smsEditActions from '../Sms/Edit/actions';
70
72
  import * as ebillActions from '../Ebill/actions';
71
73
  import * as emailActions from '../Email/actions';
@@ -113,7 +115,7 @@ import zaloMessages from '../Zalo/messages';
113
115
  import globalMessages from '../../v2Containers/Cap/messages';
114
116
  import { handlePreviewInNewTab } from '../../utils/common';
115
117
 
116
- import { MOBILE_PUSH, WECHAT, SMS, EMAIL, EBILL, LINE, VIBER, FACEBOOK, WHATSAPP, RCS, ZALO } from '../CreativesContainer/constants';
118
+ import { MOBILE_PUSH, WECHAT, SMS, EMAIL, EBILL, LINE, VIBER, FACEBOOK, WHATSAPP, RCS, ZALO, INAPP } from '../CreativesContainer/constants';
117
119
 
118
120
  import {CREATIVE} from '../Facebook/constants';
119
121
  import videoPlay from '../../assets/videoPlay.svg';
@@ -123,9 +125,11 @@ import pushIllustration from '../Assets/images/pushIllustration.svg';
123
125
  import whatsappIllustration from '../Assets/images/whatsappIllustration.png';
124
126
  import rcsIllustration from '../Assets/images/rcsIllustration.png';
125
127
  import zaloillustration from '@capillarytech/cap-ui-library/assets/images/featureUiNotEnabledIllustration.svg';
128
+ import inAppIllustration from '@capillarytech/cap-ui-library/assets/images/featureUiNotEnabledIllustration.svg';
126
129
 
127
130
  import { CAP_SPACE_16 } from '@capillarytech/cap-ui-library/styled/variables';
128
131
  import { GA } from '@capillarytech/cap-ui-utils';
132
+ import { MAPP_SDK } from '../InApp/constants';
129
133
  const { timeTracker } = GA;
130
134
  const {CapCustomCardList} = CapCustomCard;
131
135
  const InlineDiv = styled.div`
@@ -166,6 +170,7 @@ const WHATSAPP_LOWERCASE = WHATSAPP.toLowerCase();
166
170
  const RCS_LOWERCASE = RCS.toLowerCase();
167
171
  const SMS_LOWERCASE = SMS.toLowerCase();
168
172
  const MOBILE_PUSH_LOWERCASE = MOBILE_PUSH.toLowerCase();
173
+ const INAPP_LOWERCASE = INAPP.toLowerCase();
169
174
  const EBILL_LOWERCASE = EBILL.toLowerCase();
170
175
  const LINE_LOWERCASE = LINE.toLowerCase();
171
176
  const ZALO_LOWERCASE = ZALO.toLowerCase();
@@ -248,6 +253,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
248
253
  activeMode = ACCOUNT_SELECTION_MODE;
249
254
  this.props.actions.getWeCrmAccounts(channel);
250
255
  break;
256
+ case INAPP:
257
+ channel = INAPP
258
+ activeMode = ACCOUNT_SELECTION_MODE;
259
+ this.props.actions.getWeCrmAccounts(MAPP_SDK);
260
+ break;
251
261
  case WECHAT:
252
262
  channel = 'wechat';
253
263
  activeMode = ACCOUNT_SELECTION_MODE;
@@ -317,7 +327,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
317
327
 
318
328
  // opening the create slidebox based on query params
319
329
  const queryItems = getObjFromQueryParams(location.search);
320
- if (queryItems.channel === WHATSAPP_LOWERCASE && queryItems.mode === CREATE) {
330
+ if ([INAPP_LOWERCASE, WHATSAPP_LOWERCASE].includes(queryItems.channel) && queryItems.mode === CREATE) {
321
331
  this.createTemplate();
322
332
  }
323
333
 
@@ -368,6 +378,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
368
378
  this.setState({defaultAccount: true});
369
379
  channel = "mobilepush";
370
380
  nextProps.actions.getWeCrmAccounts(channel);
381
+ } else if (nextProps.route.name === INAPP ) {
382
+ this.setState({defaultAccount: true});
383
+ channel = INAPP_LOWERCASE;
384
+ nextProps.actions.getWeCrmAccounts(channel);
371
385
  } else if (nextProps.route.name.toLowerCase() === 'ebill') {
372
386
  channel = 'Ebill';
373
387
  } else if (nextProps.route.name.toLowerCase() === 'line') {
@@ -393,7 +407,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
393
407
  params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
394
408
  params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
395
409
  }
396
- if (this.state.channel.toLowerCase() === "mobilepush" && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
410
+ if (this.state.channel.toLowerCase() === "mobilepush" || this.state.channel.toLowerCase() === INAPP_LOWERCASE && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
397
411
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
398
412
  }
399
413
  this.getAllTemplates({params}, true);
@@ -405,7 +419,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
405
419
  params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
406
420
  params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
407
421
  }
408
- if ((this.state.channel || '').toLowerCase() === "mobilepush" && nextProps.Templates.selectedWeChatAccount) {
422
+ if ((this.state.channel || '').toLowerCase() === "mobilepush" || (this.state.channel || '').toLowerCase() === INAPP_LOWERCASE && nextProps.Templates.selectedWeChatAccount) {
409
423
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
410
424
  }
411
425
  const selectedChannel = this.state.channel.toLowerCase();
@@ -451,7 +465,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
451
465
  }
452
466
  }
453
467
 
454
- if ((selectedChannel === 'wechat' || selectedChannel === 'mobilepush') && isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
468
+ if (['wechat' , 'mobilepush', INAPP_LOWERCASE].includes(selectedChannel) && isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
455
469
  let selectedAccount = '';
456
470
  if (isEmpty(nextProps.Templates.weCrmAccounts)) {
457
471
  return;
@@ -481,10 +495,18 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
481
495
  params.accountId = Number(nextProps.location.query.account_id);
482
496
  this.getAllTemplates({params});
483
497
  }
484
- }
485
- if (selectedChannel === "mobilepush" && nextProps.CreateMobilePush && nextProps.CreateMobilePush.response && nextProps.CreateMobilePush.response.templateId && nextProps.CreateMobilePush.response.templateId !== '') {
486
-
487
- }
498
+ else if (selectedChannel === INAPP_LOWERCASE && (nextProps.location.query.account_id || nextProps.location.query.source_account_id)) {
499
+ forEach(nextProps.Templates.weCrmAccounts, (account) => {
500
+ if ((nextProps.location.query.account_id && account.id === Number(nextProps.location.query.account_id)) || (nextProps.location.query.source_account_id && account.sourceAccountIdentifier && account.sourceAccountIdentifier === nextProps.location.query.source_account_id)) {
501
+ selectedAccount = account;
502
+ }
503
+ });
504
+ this.props.actions.setWeChatAccount(selectedAccount);
505
+ params.accountId = Number(nextProps.location.query.account_id);
506
+ this.getAllTemplates({params});
507
+ }
508
+ }
509
+
488
510
 
489
511
  if (selectedChannel === "ebill" && nextProps.CreateEbill && nextProps.CreateEbill.createResponse && nextProps.CreateEbill.createResponse.templateId && nextProps.CreateEbill.createResponse.templateId !== '') {
490
512
  const message = `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`;
@@ -513,7 +535,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
513
535
  if ((this.state.channel || '').toLowerCase() !== "sms") {
514
536
  CapNotification.error({key: 'somethingWrong', message});
515
537
  }
516
- const { smsActions, mobilepushActions, ebillActions, lineActions, viberActions, facebookActions, whatsappActions, rcsActions } = this.props;
538
+ const { smsActions, mobilepushActions, ebillActions, lineActions, viberActions, facebookActions, whatsappActions, inAppActions, rcsActions } = this.props;
517
539
  switch (selectedChannel) {
518
540
  case SMS_LOWERCASE:
519
541
  smsActions.clearCreateResponse();
@@ -539,6 +561,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
539
561
  case RCS_LOWERCASE:
540
562
  rcsActions.clearCreateResponse();
541
563
  break;
564
+ case inAppActions:
565
+ inAppActions.clearCreateResponse();
566
+ break;
542
567
  default:
543
568
  break;
544
569
  }
@@ -653,7 +678,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
653
678
  params.wecrmToken = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_token;
654
679
  this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
655
680
  params.originalId = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].sourceAccountIdentifier;
656
- } else if (selectedChannel === 'mobilepush') {
681
+ } else if (selectedChannel === 'mobilepush' || selectedChannel === INAPP_LOWERCASE) {
657
682
  this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
658
683
  const account = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})];
659
684
  params.accountId = account.id;
@@ -816,6 +841,12 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
816
841
  queryParams.mode = this.state.mode.toLowerCase();
817
842
  }
818
843
  }
844
+ if (this.state.channel.toLowerCase() === INAPP_LOWERCASE && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
845
+ queryParams.accountId = this.props.Templates.selectedWeChatAccount.id;
846
+ if (this.state.mode) {
847
+ queryParams.mode = this.state.mode.toLowerCase();
848
+ }
849
+ }
819
850
  }
820
851
  if ((this.state.channel || '').toLowerCase() === SMS_LOWERCASE && isTraiDltFeature) {
821
852
  queryParams.traiEnable = true;
@@ -1066,6 +1097,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1066
1097
  case MOBILE_PUSH:
1067
1098
  templateData.content = template;
1068
1099
  break;
1100
+ case INAPP:
1101
+ templateData.content = template;
1102
+ break;
1069
1103
  case WECHAT:
1070
1104
  templateData.content = this.prepareWeChatPreviewData(template);
1071
1105
  break;
@@ -1271,9 +1305,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1271
1305
  const showWhatsappIllustration = !isEmpty(this.props.Templates.selectedWhatsappAccount) && [WHATSAPP_LOWERCASE].includes(channelLowerCase);
1272
1306
  const showZaloIllustration = !isEmpty(this.props.Templates.selectedZaloAccount) && [ZALO_LOWERCASE].includes(channelLowerCase);
1273
1307
  const showRcsIllustration = channelLowerCase === RCS_LOWERCASE && isEmpty(templates);
1308
+ const showInAppIllustration = channelLowerCase === INAPP_LOWERCASE && isEmpty(templates);
1274
1309
  const noLoaderAndSearchText = isEmpty(this.state.searchText) && !isLoading;
1275
1310
  return (<div>
1276
- {[WECHAT, MOBILE_PUSH].includes(currentChannel) && this.showAccountName()}
1311
+ {[WECHAT, MOBILE_PUSH, INAPP].includes(currentChannel) && this.showAccountName()}
1277
1312
  {filterContent}
1278
1313
  {[WHATSAPP, ZALO].includes(currentChannel) && this.selectedFilters()}
1279
1314
  <CapSpin spinning={isLoading} tip={loadingTip} style={{width: '100%'}}>
@@ -1291,13 +1326,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1291
1326
  : ['sms', "email"].includes(this.state.channel.toLowerCase()) && !isLoading && this.getSmsEmailIllustration()
1292
1327
  }
1293
1328
 
1294
- {(this.state.selectedAccount === '' && isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") &&
1329
+ {(this.state.selectedAccount === '' && isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush" || this.state.channel.toLowerCase() === INAPP_LOWERCASE) &&
1295
1330
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh' }}>
1296
1331
  <CapHeading type="h6">{accounts ? this.props.intl.formatMessage(messages.noAccountMessage) : this.props.intl.formatMessage(messages.noAccountsPresent)}</CapHeading>
1297
1332
  </div>
1298
1333
  }
1299
1334
 
1300
- { !isEmpty(this.props.Templates.selectedWeChatAccount) && ["mobilepush"].includes(this.state.channel.toLowerCase()) && this.state.selectedAccountError ?
1335
+ { !isEmpty(this.props.Templates.selectedWeChatAccount) && ["mobilepush", INAPP_LOWERCASE].includes(this.state.channel.toLowerCase()) && this.state.selectedAccountError ?
1301
1336
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1302
1337
  <CapHeading type="h6" >
1303
1338
  {this.props.intl.formatMessage(messages.accountConfigError)}
@@ -1331,6 +1366,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1331
1366
  </div>
1332
1367
  )
1333
1368
  }
1369
+ {showInAppIllustration &&
1370
+ (
1371
+ noLoaderAndSearchText &&
1372
+ <div style={this.isFullMode() ? { height: "calc(100vh - 325px)", overflow: 'auto' } : {}}>
1373
+ <CapIllustration buttonClassName={`create-new-${channelLowerCase}`} {...this.getChannelTypeIllustrationInfo(currentChannel)} />
1374
+ </div>
1375
+ )
1376
+ }
1334
1377
  </div>
1335
1378
  }
1336
1379
  </CapSpin>
@@ -1363,7 +1406,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1363
1406
  pathname: `/mobilepush/edit/${e.template_id}`,
1364
1407
  query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {},
1365
1408
  };
1366
- } else if (this.state.channel.toLowerCase() === 'wechat') {
1409
+ } else if (this.state.channel.toLowerCase() === INAPP_LOWERCASE) {
1410
+ routeParams = {
1411
+ pathname: `/inapp/edit/${e.template_id}`,
1412
+ query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {},
1413
+ };
1414
+ }
1415
+ else if (this.state.channel.toLowerCase() === 'wechat') {
1367
1416
  if (e.template_type && e.template_type === 'RICHMEDIA_WECHAT_TEMPLATE') {
1368
1417
  this.props.router.push({
1369
1418
  pathname: `/wechat/richmedia/edit/${e.template_id}`,
@@ -1796,6 +1845,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1796
1845
  this.getAllTemplates({params: {}}, true);
1797
1846
  this.props.mobilepushActions.clearCreateResponse();
1798
1847
  });
1848
+ } else if (this.state.channel.toLowerCase() === "inapp") {
1849
+ duplicateObj.definition.accountId = this.props.Templates.selectedWeChatAccount.id;
1850
+ this.props.inAppActions.createInAppTemplate(duplicateObj, () => {
1851
+ const message = `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`;
1852
+ CapNotification.success({key: 'duplicateSuccess', message});
1853
+ this.getAllTemplates({params: {}}, true);
1854
+ this.props.inAppActions.clearCreateResponse();
1855
+ });
1799
1856
  } else if (this.state.channel.toLowerCase() === "ebill") {
1800
1857
  this.props.ebillActions.createTemplate(duplicateObj);
1801
1858
  } else if (this.state.channel.toLowerCase() === "email") {
@@ -1918,6 +1975,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1918
1975
  pathName = `/zalo/edit/${id}/`;
1919
1976
  break;
1920
1977
  }
1978
+ case INAPP: {
1979
+ pathName = `/inapp/edit/${id}/`;
1980
+ break;
1981
+ }
1921
1982
  default:
1922
1983
  break;
1923
1984
  }
@@ -2206,7 +2267,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2206
2267
  if (this.props.location.query.type === "embedded" && this.props.location.query.module === "library") {
2207
2268
  switch (property) {
2208
2269
  case "showAccountSelection":
2209
- return (this.props.route && (['wechat', 'mobilepush', WHATSAPP_LOWERCASE].includes(this.props.route.name.toLowerCase())));
2270
+ return (this.props.route && (['wechat', 'mobilepush', WHATSAPP_LOWERCASE, INAPP_LOWERCASE].includes(this.props.route.name.toLowerCase())));
2210
2271
  case "setLocale":
2211
2272
  return true;
2212
2273
  case "callCreateFromProps":
@@ -2346,6 +2407,15 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2346
2407
  descriptionClassName: 'illustration-desc zalo-illustration',
2347
2408
  buttonClassName: "zalo-illustration-button",
2348
2409
  };
2410
+ case INAPP:
2411
+ return {
2412
+ illustrationImage: inAppIllustration,
2413
+ title: <FormattedMessage {...messages.inAppTitleIllustration} />,
2414
+ description: <FormattedMessage {...messages.inAppDescIllustration} />,
2415
+ descriptionPosition: 'bottom',
2416
+ descriptionClassName: 'illustration-desc inapp-illustration',
2417
+ buttonClassName: "inapp-illustration-button",
2418
+ }
2349
2419
  default:
2350
2420
  return {};
2351
2421
  }
@@ -2401,24 +2471,25 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2401
2471
  const { weCrmAccounts = [], fetchingWeCrmAccounts = false, campaignSettings = {} } = templates;
2402
2472
  const isWechatChannel = channel === WECHAT;
2403
2473
  const isMobilePushChannel = channel === MOBILE_PUSH;
2474
+ const isInAppChannel = channel === INAPP;
2404
2475
  const isFacebookChannel = channel === FACEBOOK;
2405
2476
 
2406
- if ([WECHAT, MOBILE_PUSH, LINE, ZALO].includes(channel) && !isEmpty(weCrmAccounts) && !isFacebookChannel) {
2477
+ if ([WECHAT, MOBILE_PUSH, INAPP, LINE, ZALO].includes(channel) && !isEmpty(weCrmAccounts) && !isFacebookChannel) {
2407
2478
  forEach(weCrmAccounts, (account) => {
2408
- if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || [MOBILE_PUSH, LINE, ZALO].includes(channel)) {
2479
+ if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || [MOBILE_PUSH, INAPP, LINE, ZALO].includes(channel)) {
2409
2480
  if (query.type === 'embedded' && (!query.module || (query.module && query.module !== 'library'))) {
2410
2481
  if (query.source_account_id && account.sourceAccountIdentifier === query.source_account_id) {
2411
2482
  accountOptions.push(
2412
- { key: isMobilePushChannel ? account.id : account.uuid,
2483
+ { key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2413
2484
  title: account.name,
2414
2485
  value: account.name,
2415
2486
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
2416
2487
  }
2417
2488
  );
2418
- } else if (query.module && (isWechatChannel || isMobilePushChannel)) {
2489
+ } else if (query.module && (isWechatChannel || isMobilePushChannel || isInAppChannel)) {
2419
2490
  accountOptions.push(
2420
2491
  {
2421
- key: isMobilePushChannel ? account.id : account.uuid,
2492
+ key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2422
2493
  value: account.name,
2423
2494
  title: account.name,
2424
2495
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
@@ -2428,7 +2499,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2428
2499
  } else {
2429
2500
  accountOptions.push(
2430
2501
  {
2431
- key: isMobilePushChannel ? account.id : account.uuid,
2502
+ key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2432
2503
  value: account.name,
2433
2504
  title: account.name,
2434
2505
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
@@ -2451,6 +2522,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2451
2522
  noAccountHeader = messages.noAccountsPresent;
2452
2523
  break;
2453
2524
  }
2525
+ case INAPP: {
2526
+ accountHeader = formatMessage(messages.inappAccount);
2527
+ noAccountHeader = messages.noAccountsPresentInApp;
2528
+ break;
2529
+ }
2454
2530
  case WECHAT: {
2455
2531
  accountHeader = formatMessage(messages.wechatAccount);
2456
2532
  noAccountHeader = messages.noAccountsPresentWeChat;
@@ -2548,6 +2624,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2548
2624
  [MOBILE_PUSH]: 'mobilepushAccount',
2549
2625
  [WECHAT]: 'wechatAccount',
2550
2626
  [WHATSAPP]: 'whatsappAccount',
2627
+ [INAPP]: 'inappAccount',
2551
2628
  [ZALO]: 'zaloAccount',
2552
2629
  };
2553
2630
  return formatMessage(messages[channelObj[channel?.toUpperCase()]]);
@@ -2733,7 +2810,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2733
2810
  const showWhatsappCountWarning = templatesCount >= WARNING_WHATSAPP_TEMPLATES;
2734
2811
  const whatsappCountExceedText = <FormattedMessage {...messages.whatsappMaxTemplates} values={{ maxCount: MAX_WHATSAPP_TEMPLATES }}/>;
2735
2812
 
2736
- const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH].includes(this.state.channel.toUpperCase())) && <div className="action-container">
2813
+ const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH, INAPP].includes(this.state.channel.toUpperCase())) && <div className="action-container">
2737
2814
  {isfilterContentVisisble && <CapInput.Search
2738
2815
  className="search-text"
2739
2816
  style={{width: '210px'}}
@@ -3025,6 +3102,7 @@ Templates.propTypes = {
3025
3102
  whatsappActions: PropTypes.object,
3026
3103
  rcsActions: PropTypes.object,
3027
3104
  zaloActions: PropTypes.object,
3105
+ inAppActions: PropTypes.object,
3028
3106
  smsRegister: PropTypes.any,
3029
3107
  isDltFromRcs: PropTypes.bool,
3030
3108
  };
@@ -3041,6 +3119,7 @@ const mapStateToProps = createStructuredSelector({
3041
3119
  Line: makeSelectLine(),
3042
3120
  Viber: makeSelectViber(),
3043
3121
  Zalo: makeSelectZalo(),
3122
+ InApp: makeSelectInApp(),
3044
3123
  });
3045
3124
 
3046
3125
  function mapDispatchToProps(dispatch) {
@@ -3048,6 +3127,7 @@ function mapDispatchToProps(dispatch) {
3048
3127
  actions: bindActionCreators(actions, dispatch),
3049
3128
  smsActions: bindActionCreators(smsActions, dispatch),
3050
3129
  mobilepushActions: bindActionCreators(mobilepushActions, dispatch),
3130
+ inAppActions: bindActionCreators(inAppActions, dispatch),
3051
3131
  smsEditActions: bindActionCreators(smsEditActions, dispatch),
3052
3132
  ebillActions: bindActionCreators(ebillActions, dispatch),
3053
3133
  emailActions: bindActionCreators(emailActions, dispatch),
@@ -126,6 +126,10 @@ export default defineMessages({
126
126
  id: `${scope}.noAccountsPresent`,
127
127
  defaultMessage: "Push notifications are not setup for your brand",
128
128
  },
129
+ "noAccountsPresentInApp": {
130
+ id: `${scope}.noAccountsPresentInApp`,
131
+ defaultMessage: "In app message are not setup for your brand",
132
+ },
129
133
  "noAccountsPresentWeChat": {
130
134
  id: `${scope}.noAccountsPresentWeChat`,
131
135
  defaultMessage: "Wechat accounts are not setup for your brand",
@@ -326,6 +330,10 @@ export default defineMessages({
326
330
  id: `${scope}.newWhatsappTemplate`,
327
331
  defaultMessage: 'Add new Whatsapp {template}',
328
332
  },
333
+ "newInAppMessageTemplate": {
334
+ id: `${scope}.newInAppMessageTemplate`,
335
+ defaultMessage: 'Add new In app message {template}',
336
+ },
329
337
  "newNotificationTemplate": {
330
338
  id: `${scope}.newNotificationTemplate`,
331
339
  defaultMessage: 'New notification {template}',
@@ -370,6 +378,14 @@ export default defineMessages({
370
378
  id: `${scope}.noApprovedWhatsappTemplatesDesc`,
371
379
  defaultMessage: 'Please try creating a new template, once it is approved by Whatsapp it will be available here',
372
380
  },
381
+ "inAppTitleIllustration": {
382
+ id: `${scope}.inAppTitleIllustration`,
383
+ defaultMessage: 'There are no templates available',
384
+ },
385
+ "inAppDescIllustration": {
386
+ id: `${scope}.inAppDescIllustration`,
387
+ defaultMessage: 'You can create new templates on the In app message platform and once they’re created successfully, you can view them here',
388
+ },
373
389
  "smsTitleIllustartion": {
374
390
  id: `${scope}.smsTitleIllustartion`,
375
391
  defaultMessage: 'Create an SMS {template}',
@@ -394,6 +410,10 @@ export default defineMessages({
394
410
  id: `${scope}.mobilepushAccount`,
395
411
  defaultMessage: 'Mobilepush account',
396
412
  },
413
+ "inappAccount": {
414
+ id: `${scope}.inappAccount`,
415
+ defaultMessage: 'In app message account',
416
+ },
397
417
  "lineAccount": {
398
418
  id: `${scope}.lineAccount`,
399
419
  defaultMessage: 'Line account',
@@ -29,7 +29,7 @@ import FTP from '../FTP';
29
29
  import Gallery from '../Assets/Gallery';
30
30
  import withStyles from '../../hoc/withStyles';
31
31
  import styles, { CapTabStyle } from './TemplatesV2.style';
32
- import { CREATIVES_UI_VIEW, LOYALTY, WHATSAPP, RCS, LINE, EMAIL, ASSETS, JP_LOCALE_HIDE_FEATURE, ZALO } from '../App/constants';
32
+ import { CREATIVES_UI_VIEW, LOYALTY, WHATSAPP, RCS, LINE, EMAIL, ASSETS, JP_LOCALE_HIDE_FEATURE, ZALO, INAPP } from '../App/constants';
33
33
  import AccessForbidden from '../../v2Components/AccessForbidden';
34
34
  import { getObjFromQueryParams } from '../../utils/v2common';
35
35
  import { selectCurrentOrgDetails } from "../../v2Containers/Cap/selectors";
@@ -63,6 +63,7 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
63
63
  weChat: {content: <></>, tab: intl.formatMessage(messages.wechat), key: 'wechat'},
64
64
  //'wechat': {content: this.getTemplatesComponent('wechat'), tab: 'Wechat', key: 'wechat'},
65
65
  mPush: {content: <></>, tab: intl.formatMessage(messages.pushNotification), key: 'mobilepush'},
66
+ inApp: { content: <div></div>, tab: intl.formatMessage(messages.inapp), key: INAPP },
66
67
  line: {content: <></>, tab: intl.formatMessage(messages.line), key: 'line'},
67
68
  viber: {content: <></>, tab: intl.formatMessage(messages.viber), key: 'viber'},
68
69
  facebook: {content: <div></div>, tab: intl.formatMessage(messages.facebook), key: 'facebook'},
@@ -281,7 +282,12 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
281
282
  argsPanes.map((pane) => {
282
283
  let content = null;
283
284
  if (pane.key === selectedChannel) {
284
- const channel = selectedChannel === "mpush" ? "mobilepush" : selectedChannel;
285
+ let channel;
286
+ if ( selectedChannel === "mpush") {
287
+ channel = "mobilepush";
288
+ } else {
289
+ channel = selectedChannel;
290
+ }
285
291
  content = this.getTemplatesComponent(channel);
286
292
  }
287
293
  return {
@@ -82,4 +82,8 @@ export default defineMessages({
82
82
  id: `creatives.containersV2.TemplatesV2.zalo`,
83
83
  defaultMessage: 'Zalo',
84
84
  },
85
+ inapp: {
86
+ id: `creatives.containersV2.TemplatesV2.inapp`,
87
+ defaultMessage: 'In app message',
88
+ },
85
89
  });