@capillarytech/creatives-library 7.17.93 → 7.17.95

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 (53) 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/v2Components/CapDeviceContent/index.js +311 -0
  7. package/v2Components/CapDeviceContent/index.scss +115 -0
  8. package/v2Components/CapDeviceContent/messages.js +94 -0
  9. package/v2Components/CapDeviceContent/tests/index.test.js +85 -0
  10. package/v2Components/CapImageUpload/index.js +11 -4
  11. package/v2Components/CapImageUpload/messages.js +6 -2
  12. package/v2Components/CapInAppCTA/constants.js +25 -0
  13. package/v2Components/CapInAppCTA/index.js +280 -0
  14. package/v2Components/CapInAppCTA/index.scss +93 -0
  15. package/v2Components/CapInAppCTA/messages.js +85 -0
  16. package/v2Components/FormBuilder/index.js +3 -4
  17. package/v2Components/MobilePushPreviewV2/index.js +78 -23
  18. package/v2Components/TemplatePreview/_templatePreview.scss +449 -0
  19. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_bottom.svg +11 -0
  20. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_full.svg +11 -0
  21. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_modal.svg +11 -0
  22. package/v2Components/TemplatePreview/assets/images/inapp_mobile_android_top.svg +11 -0
  23. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_bottom.svg +6 -0
  24. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_full.svg +18 -0
  25. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_modal.svg +7 -0
  26. package/v2Components/TemplatePreview/assets/images/inapp_mobile_ios_top.svg +13 -0
  27. package/v2Components/TemplatePreview/index.js +660 -375
  28. package/v2Components/TemplatePreview/messages.js +4 -0
  29. package/v2Containers/App/constants.js +1 -0
  30. package/v2Containers/CreativesContainer/SlideBoxContent.js +43 -0
  31. package/v2Containers/CreativesContainer/SlideBoxHeader.js +4 -1
  32. package/v2Containers/CreativesContainer/constants.js +1 -0
  33. package/v2Containers/CreativesContainer/index.js +42 -19
  34. package/v2Containers/CreativesContainer/messages.js +4 -0
  35. package/v2Containers/InApp/actions.js +64 -0
  36. package/v2Containers/InApp/constants.js +125 -0
  37. package/v2Containers/InApp/index.js +762 -0
  38. package/v2Containers/InApp/index.scss +48 -0
  39. package/v2Containers/InApp/messages.js +99 -0
  40. package/v2Containers/InApp/reducer.js +109 -0
  41. package/v2Containers/InApp/sagas.js +143 -0
  42. package/v2Containers/InApp/selectors.js +12 -0
  43. package/v2Containers/InApp/tests/action.test.js +53 -0
  44. package/v2Containers/InApp/tests/index.test.js +142 -0
  45. package/v2Containers/InApp/tests/mockData.js +898 -0
  46. package/v2Containers/InApp/tests/reducer.test.js +177 -0
  47. package/v2Containers/InApp/tests/sagas.test.js +391 -0
  48. package/v2Containers/MobilePush/Edit/index.js +3 -1
  49. package/v2Containers/Templates/_templates.scss +14 -0
  50. package/v2Containers/Templates/index.js +86 -32
  51. package/v2Containers/Templates/messages.js +20 -0
  52. package/v2Containers/TemplatesV2/index.js +2 -1
  53. 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
 
@@ -364,9 +374,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
364
374
  nextProps.actions.getWeCrmAccounts();
365
375
  } else if (nextProps.route.name.toLowerCase() === 'email') {
366
376
  channel = 'Email';
367
- } else if (nextProps.route.name.toLowerCase() === "mobilepush") {
377
+ } else if (nextProps.route.name.toLowerCase() === "mobilepush" || nextProps.route.name === INAPP) {
368
378
  this.setState({defaultAccount: true});
369
- channel = "mobilepush";
379
+ channel = nextProps.route.name.toLowerCase();
370
380
  nextProps.actions.getWeCrmAccounts(channel);
371
381
  } else if (nextProps.route.name.toLowerCase() === 'ebill') {
372
382
  channel = 'Ebill';
@@ -393,7 +403,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
393
403
  params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
394
404
  params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
395
405
  }
396
- if (this.state.channel.toLowerCase() === "mobilepush" && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
406
+ if (['mobilepush', INAPP_LOWERCASE].includes((this.state.channel).toLowerCase()) && !isEmpty(nextProps.Templates.selectedWeChatAccount)) {
397
407
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
398
408
  }
399
409
  this.getAllTemplates({params}, true);
@@ -405,7 +415,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
405
415
  params.wecrmToken = (nextProps.Templates.selectedWeChatAccount.configs || {}).wecrm_token;
406
416
  params.originalId = nextProps.Templates.selectedWeChatAccount.sourceAccountIdentifier;
407
417
  }
408
- if ((this.state.channel || '').toLowerCase() === "mobilepush" && nextProps.Templates.selectedWeChatAccount) {
418
+ if ((['mobilepush', INAPP_LOWERCASE].includes((this.state.channel || '').toLowerCase())) && nextProps.Templates.selectedWeChatAccount) {
409
419
  params.accountId = nextProps.Templates.selectedWeChatAccount.id;
410
420
  }
411
421
  const selectedChannel = this.state.channel.toLowerCase();
@@ -451,7 +461,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
451
461
  }
452
462
  }
453
463
 
454
- if ((selectedChannel === 'wechat' || selectedChannel === 'mobilepush') && isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
464
+ if (['wechat' , 'mobilepush', INAPP_LOWERCASE].includes(selectedChannel) && isEmpty(nextProps.Templates.selectedWeChatAccount) && (this.props.location.query.type === 'embedded') && !this.isEnabledInLibraryModule("showAccountSelection")) {
455
465
  let selectedAccount = '';
456
466
  if (isEmpty(nextProps.Templates.weCrmAccounts)) {
457
467
  return;
@@ -471,20 +481,19 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
471
481
  nextProps.actions.setWeChatAccount(selectedAccount);
472
482
  this.getAllTemplates({params});
473
483
  });
474
- } else if (selectedChannel === 'mobilepush' && (nextProps.location.query.account_id || nextProps.location.query.source_account_id)) {
484
+ } else if ([INAPP_LOWERCASE, 'mobilepush'].includes(selectedChannel) && (nextProps.location.query.account_id || nextProps.location.query.source_account_id)) {
485
+ const { location: { query } } = nextProps || {};
475
486
  forEach(nextProps.Templates.weCrmAccounts, (account) => {
476
- 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)) {
487
+ if ((query.account_id && account.id === Number(query.account_id)) || (query.source_account_id && account.sourceAccountIdentifier && account.sourceAccountIdentifier === query.source_account_id)) {
477
488
  selectedAccount = account;
478
489
  }
479
490
  });
480
491
  this.props.actions.setWeChatAccount(selectedAccount);
481
- params.accountId = Number(nextProps.location.query.account_id);
492
+ params.accountId = Number(query.account_id);
482
493
  this.getAllTemplates({params});
483
494
  }
484
- }
485
- if (selectedChannel === "mobilepush" && nextProps.CreateMobilePush && nextProps.CreateMobilePush.response && nextProps.CreateMobilePush.response.templateId && nextProps.CreateMobilePush.response.templateId !== '') {
486
-
487
- }
495
+ }
496
+
488
497
 
489
498
  if (selectedChannel === "ebill" && nextProps.CreateEbill && nextProps.CreateEbill.createResponse && nextProps.CreateEbill.createResponse.templateId && nextProps.CreateEbill.createResponse.templateId !== '') {
490
499
  const message = `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`;
@@ -513,7 +522,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
513
522
  if ((this.state.channel || '').toLowerCase() !== "sms") {
514
523
  CapNotification.error({key: 'somethingWrong', message});
515
524
  }
516
- const { smsActions, mobilepushActions, ebillActions, lineActions, viberActions, facebookActions, whatsappActions, rcsActions } = this.props;
525
+ const { smsActions, mobilepushActions, ebillActions, lineActions, viberActions, facebookActions, whatsappActions, inAppActions, rcsActions } = this.props;
517
526
  switch (selectedChannel) {
518
527
  case SMS_LOWERCASE:
519
528
  smsActions.clearCreateResponse();
@@ -539,6 +548,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
539
548
  case RCS_LOWERCASE:
540
549
  rcsActions.clearCreateResponse();
541
550
  break;
551
+ case inAppActions:
552
+ inAppActions.clearCreateResponse();
553
+ break;
542
554
  default:
543
555
  break;
544
556
  }
@@ -653,9 +665,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
653
665
  params.wecrmToken = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].configs.wecrm_token;
654
666
  this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
655
667
  params.originalId = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})].sourceAccountIdentifier;
656
- } else if (selectedChannel === 'mobilepush') {
657
- this.props.actions.setWeChatAccount(this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})]);
658
- const account = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})];
668
+ } else if (['mobilepush', INAPP_LOWERCASE].includes(selectedChannel)) {
669
+ const selectedAccount = this.props.Templates.weCrmAccounts[findIndex(this.props.Templates.weCrmAccounts, { name: value})];
670
+ this.props.actions.setWeChatAccount(selectedAccount);
671
+ const account = selectedAccount;
659
672
  params.accountId = account.id;
660
673
  const isAndroidSupported = get(account, "configs.android") === '1';
661
674
  const isIosSupported = get(account, "configs.ios") === '1';
@@ -810,7 +823,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
810
823
  queryParams.wecrmToken = this.props.Templates.selectedWeChatAccount.configs.wecrm_token;
811
824
  queryParams.originalId = this.props.Templates.selectedWeChatAccount.sourceAccountIdentifier;
812
825
  }
813
- if (this.state.channel.toLowerCase() === MOBILE_PUSH_LOWERCASE && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
826
+ if (([MOBILE_PUSH_LOWERCASE, INAPP_LOWERCASE.includes](this.state.channel.toLowerCase())) && !isEmpty(this.props.Templates.selectedWeChatAccount)) {
814
827
  queryParams.accountId = this.props.Templates.selectedWeChatAccount.id;
815
828
  if (this.state.mode) {
816
829
  queryParams.mode = this.state.mode.toLowerCase();
@@ -1064,6 +1077,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1064
1077
  break;
1065
1078
  }
1066
1079
  case MOBILE_PUSH:
1080
+ case INAPP:
1067
1081
  templateData.content = template;
1068
1082
  break;
1069
1083
  case WECHAT:
@@ -1271,9 +1285,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1271
1285
  const showWhatsappIllustration = !isEmpty(this.props.Templates.selectedWhatsappAccount) && [WHATSAPP_LOWERCASE].includes(channelLowerCase);
1272
1286
  const showZaloIllustration = !isEmpty(this.props.Templates.selectedZaloAccount) && [ZALO_LOWERCASE].includes(channelLowerCase);
1273
1287
  const showRcsIllustration = channelLowerCase === RCS_LOWERCASE && isEmpty(templates);
1288
+ const showInAppIllustration = channelLowerCase === INAPP_LOWERCASE && isEmpty(templates);
1274
1289
  const noLoaderAndSearchText = isEmpty(this.state.searchText) && !isLoading;
1275
1290
  return (<div>
1276
- {[WECHAT, MOBILE_PUSH].includes(currentChannel) && this.showAccountName()}
1291
+ {[WECHAT, MOBILE_PUSH, INAPP].includes(currentChannel) && this.showAccountName()}
1277
1292
  {filterContent}
1278
1293
  {[WHATSAPP, ZALO].includes(currentChannel) && this.selectedFilters()}
1279
1294
  <CapSpin spinning={isLoading} tip={loadingTip} style={{width: '100%'}}>
@@ -1291,13 +1306,13 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1291
1306
  : ['sms', "email"].includes(this.state.channel.toLowerCase()) && !isLoading && this.getSmsEmailIllustration()
1292
1307
  }
1293
1308
 
1294
- {(this.state.selectedAccount === '' && isEmpty(this.props.Templates.selectedWeChatAccount)) && (this.state.channel.toLowerCase() === 'wechat' || this.state.channel.toLowerCase() === "mobilepush") &&
1309
+ {(this.state.selectedAccount === '' && isEmpty(this.props.Templates.selectedWeChatAccount)) && (['wechat', 'mobilepush', INAPP_LOWERCASE].includes(this.state.channel.toLowerCase())) &&
1295
1310
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh' }}>
1296
1311
  <CapHeading type="h6">{accounts ? this.props.intl.formatMessage(messages.noAccountMessage) : this.props.intl.formatMessage(messages.noAccountsPresent)}</CapHeading>
1297
1312
  </div>
1298
1313
  }
1299
1314
 
1300
- { !isEmpty(this.props.Templates.selectedWeChatAccount) && ["mobilepush"].includes(this.state.channel.toLowerCase()) && this.state.selectedAccountError ?
1315
+ { !isEmpty(this.props.Templates.selectedWeChatAccount) && ["mobilepush", INAPP_LOWERCASE].includes(this.state.channel.toLowerCase()) && this.state.selectedAccountError ?
1301
1316
  <div style={{ height: '65vh', textAlign: 'center', lineHeight: '65vh'}}>
1302
1317
  <CapHeading type="h6" >
1303
1318
  {this.props.intl.formatMessage(messages.accountConfigError)}
@@ -1331,6 +1346,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1331
1346
  </div>
1332
1347
  )
1333
1348
  }
1349
+ {showInAppIllustration &&
1350
+ (
1351
+ noLoaderAndSearchText &&
1352
+ <div className={`${this.isFullMode() ? 'inapp-illustration-parent' : ''}`}>
1353
+ <CapIllustration buttonClassName={`create-new-${channelLowerCase}`} {...this.getChannelTypeIllustrationInfo(currentChannel)} />
1354
+ </div>
1355
+ )
1356
+ }
1334
1357
  </div>
1335
1358
  }
1336
1359
  </CapSpin>
@@ -1358,9 +1381,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1358
1381
  pathname: `/sms/view`,
1359
1382
  query: type === 'embedded' ? {type: 'embedded', module} : {},
1360
1383
  };
1361
- } else if (this.state.channel.toLowerCase() === 'mobilepush') {
1384
+ } else if (['mobilepush', INAPP_LOWERCASE].includes(this.state.channel.toLowerCase())) {
1362
1385
  routeParams = {
1363
- pathname: `/mobilepush/edit/${e.template_id}`,
1386
+ pathname: `/${this.state.channel.toLowerCase()}/edit/${e.template_id}`,
1364
1387
  query: type === 'embedded' ? {type: 'embedded', module, account_id: e.account_id } : {},
1365
1388
  };
1366
1389
  } else if (this.state.channel.toLowerCase() === 'wechat') {
@@ -1796,6 +1819,14 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1796
1819
  this.getAllTemplates({params: {}}, true);
1797
1820
  this.props.mobilepushActions.clearCreateResponse();
1798
1821
  });
1822
+ } else if (this.state.channel.toLowerCase() === "inapp") {
1823
+ duplicateObj.definition.accountId = this.props.Templates.selectedWeChatAccount.id;
1824
+ this.props.inAppActions.createInAppTemplate(duplicateObj, () => {
1825
+ const message = `${this.state.channel} ${this.props.intl.formatMessage(messages.templateDuplicateSuccess)}`;
1826
+ CapNotification.success({key: 'duplicateSuccess', message});
1827
+ this.getAllTemplates({params: {}}, true);
1828
+ this.props.inAppActions.clearCreateResponse();
1829
+ });
1799
1830
  } else if (this.state.channel.toLowerCase() === "ebill") {
1800
1831
  this.props.ebillActions.createTemplate(duplicateObj);
1801
1832
  } else if (this.state.channel.toLowerCase() === "email") {
@@ -1918,6 +1949,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1918
1949
  pathName = `/zalo/edit/${id}/`;
1919
1950
  break;
1920
1951
  }
1952
+ case INAPP: {
1953
+ pathName = `/inapp/edit/${id}/`;
1954
+ break;
1955
+ }
1921
1956
  default:
1922
1957
  break;
1923
1958
  }
@@ -2206,7 +2241,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2206
2241
  if (this.props.location.query.type === "embedded" && this.props.location.query.module === "library") {
2207
2242
  switch (property) {
2208
2243
  case "showAccountSelection":
2209
- return (this.props.route && (['wechat', 'mobilepush', WHATSAPP_LOWERCASE].includes(this.props.route.name.toLowerCase())));
2244
+ return (this.props.route && (['wechat', 'mobilepush', WHATSAPP_LOWERCASE, INAPP_LOWERCASE].includes(this.props.route.name.toLowerCase())));
2210
2245
  case "setLocale":
2211
2246
  return true;
2212
2247
  case "callCreateFromProps":
@@ -2346,6 +2381,15 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2346
2381
  descriptionClassName: 'illustration-desc zalo-illustration',
2347
2382
  buttonClassName: "zalo-illustration-button",
2348
2383
  };
2384
+ case INAPP:
2385
+ return {
2386
+ illustrationImage: inAppIllustration,
2387
+ title: <FormattedMessage {...messages.inAppTitleIllustration} />,
2388
+ description: <FormattedMessage {...messages.inAppDescIllustration} />,
2389
+ descriptionPosition: 'bottom',
2390
+ descriptionClassName: 'illustration-desc inapp-illustration',
2391
+ buttonClassName: "inapp-illustration-button",
2392
+ }
2349
2393
  default:
2350
2394
  return {};
2351
2395
  }
@@ -2401,24 +2445,25 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2401
2445
  const { weCrmAccounts = [], fetchingWeCrmAccounts = false, campaignSettings = {} } = templates;
2402
2446
  const isWechatChannel = channel === WECHAT;
2403
2447
  const isMobilePushChannel = channel === MOBILE_PUSH;
2448
+ const isInAppChannel = channel === INAPP;
2404
2449
  const isFacebookChannel = channel === FACEBOOK;
2405
2450
 
2406
- if ([WECHAT, MOBILE_PUSH, LINE, ZALO].includes(channel) && !isEmpty(weCrmAccounts) && !isFacebookChannel) {
2451
+ if ([WECHAT, MOBILE_PUSH, INAPP, LINE, ZALO].includes(channel) && !isEmpty(weCrmAccounts) && !isFacebookChannel) {
2407
2452
  forEach(weCrmAccounts, (account) => {
2408
- if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || [MOBILE_PUSH, LINE, ZALO].includes(channel)) {
2453
+ if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || [MOBILE_PUSH, INAPP, LINE, ZALO].includes(channel)) {
2409
2454
  if (query.type === 'embedded' && (!query.module || (query.module && query.module !== 'library'))) {
2410
2455
  if (query.source_account_id && account.sourceAccountIdentifier === query.source_account_id) {
2411
2456
  accountOptions.push(
2412
- { key: isMobilePushChannel ? account.id : account.uuid,
2457
+ { key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2413
2458
  title: account.name,
2414
2459
  value: account.name,
2415
2460
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
2416
2461
  }
2417
2462
  );
2418
- } else if (query.module && (isWechatChannel || isMobilePushChannel)) {
2463
+ } else if (query.module && (isWechatChannel || isMobilePushChannel || isInAppChannel)) {
2419
2464
  accountOptions.push(
2420
2465
  {
2421
- key: isMobilePushChannel ? account.id : account.uuid,
2466
+ key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2422
2467
  value: account.name,
2423
2468
  title: account.name,
2424
2469
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
@@ -2428,7 +2473,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2428
2473
  } else {
2429
2474
  accountOptions.push(
2430
2475
  {
2431
- key: isMobilePushChannel ? account.id : account.uuid,
2476
+ key: isMobilePushChannel || isInAppChannel ? account.id : account.uuid,
2432
2477
  value: account.name,
2433
2478
  title: account.name,
2434
2479
  icon: <CapIcon.CapIconAvatar text={account.name[0]} width="auto" height="2rem"/>,
@@ -2451,6 +2496,11 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2451
2496
  noAccountHeader = messages.noAccountsPresent;
2452
2497
  break;
2453
2498
  }
2499
+ case INAPP: {
2500
+ accountHeader = formatMessage(messages.inappAccount);
2501
+ noAccountHeader = messages.noAccountsPresentInApp;
2502
+ break;
2503
+ }
2454
2504
  case WECHAT: {
2455
2505
  accountHeader = formatMessage(messages.wechatAccount);
2456
2506
  noAccountHeader = messages.noAccountsPresentWeChat;
@@ -2548,6 +2598,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2548
2598
  [MOBILE_PUSH]: 'mobilepushAccount',
2549
2599
  [WECHAT]: 'wechatAccount',
2550
2600
  [WHATSAPP]: 'whatsappAccount',
2601
+ [INAPP]: 'inappAccount',
2551
2602
  [ZALO]: 'zaloAccount',
2552
2603
  };
2553
2604
  return formatMessage(messages[channelObj[channel?.toUpperCase()]]);
@@ -2733,7 +2784,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
2733
2784
  const showWhatsappCountWarning = templatesCount >= WARNING_WHATSAPP_TEMPLATES;
2734
2785
  const whatsappCountExceedText = <FormattedMessage {...messages.whatsappMaxTemplates} values={{ maxCount: MAX_WHATSAPP_TEMPLATES }}/>;
2735
2786
 
2736
- const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH].includes(this.state.channel.toUpperCase())) && <div className="action-container">
2787
+ const filterContent = (( isfilterContentVisisble || [WECHAT, MOBILE_PUSH, INAPP].includes(this.state.channel.toUpperCase())) && <div className="action-container">
2737
2788
  {isfilterContentVisisble && <CapInput.Search
2738
2789
  className="search-text"
2739
2790
  style={{width: '210px'}}
@@ -3025,6 +3076,7 @@ Templates.propTypes = {
3025
3076
  whatsappActions: PropTypes.object,
3026
3077
  rcsActions: PropTypes.object,
3027
3078
  zaloActions: PropTypes.object,
3079
+ inAppActions: PropTypes.object,
3028
3080
  smsRegister: PropTypes.any,
3029
3081
  isDltFromRcs: PropTypes.bool,
3030
3082
  };
@@ -3041,6 +3093,7 @@ const mapStateToProps = createStructuredSelector({
3041
3093
  Line: makeSelectLine(),
3042
3094
  Viber: makeSelectViber(),
3043
3095
  Zalo: makeSelectZalo(),
3096
+ InApp: makeSelectInApp(),
3044
3097
  });
3045
3098
 
3046
3099
  function mapDispatchToProps(dispatch) {
@@ -3048,6 +3101,7 @@ function mapDispatchToProps(dispatch) {
3048
3101
  actions: bindActionCreators(actions, dispatch),
3049
3102
  smsActions: bindActionCreators(smsActions, dispatch),
3050
3103
  mobilepushActions: bindActionCreators(mobilepushActions, dispatch),
3104
+ inAppActions: bindActionCreators(inAppActions, dispatch),
3051
3105
  smsEditActions: bindActionCreators(smsEditActions, dispatch),
3052
3106
  ebillActions: bindActionCreators(ebillActions, dispatch),
3053
3107
  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'},
@@ -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
  });