@capillarytech/creatives-library 7.17.93 → 7.17.94

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 +310 -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 +75 -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 +281 -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 +79 -7
  34. package/v2Containers/CreativesContainer/messages.js +4 -0
  35. package/v2Containers/InApp/actions.js +64 -0
  36. package/v2Containers/InApp/constants.js +126 -0
  37. package/v2Containers/InApp/index.js +769 -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
@@ -86,4 +86,8 @@ export default defineMessages({
86
86
  id: 'creatives.componentsV2.TemplatePreview.previewUrlMetaImage',
87
87
  defaultMessage: 'Preview url meta image',
88
88
  },
89
+ addToCart: {
90
+ id: `creatives.componentsV2.TemplatePreview.addToCart`,
91
+ defaultMessage: 'Add to cart',
92
+ },
89
93
  });
@@ -54,6 +54,7 @@ export const LINE = 'line';
54
54
  export const EMAIL = 'email';
55
55
  export const ASSETS = 'assets';
56
56
  export const ZALO = 'zalo';
57
+ export const INAPP = 'inapp';
57
58
 
58
59
  export const JP_LOCALE_HIDE_FEATURE = 'JP_LOCALE_HIDE_FEATURE';
59
60
 
@@ -22,6 +22,7 @@ import LineContainer from '../Line/Container';
22
22
  import FTP from '../FTP';
23
23
  import Viber from '../Viber';
24
24
  import Whatsapp from '../Whatsapp';
25
+ import InApp from '../InApp';
25
26
  import Rcs from '../Rcs';
26
27
  import { getWhatsappContent } from '../Whatsapp/utils';
27
28
  import * as commonUtil from '../../utils/common';
@@ -182,6 +183,7 @@ export function SlideBoxContent(props) {
182
183
  const isCreateSms = isCreate && channel === constants.SMS;
183
184
  const isCreateFacebook = isCreate && channel === constants.FACEBOOK;
184
185
  const isCreateWhatsapp = isCreate && channel === constants.WHATSAPP;
186
+ const isCreateInApp = isCreate && channel === constants.INAPP;
185
187
  const isCreateRcs = isCreate && channel === constants.RCS;
186
188
  const isCreateMPush = isCreate && channel === constants.MOBILE_PUSH;
187
189
  const isCreateCallTask = isCreate && channel === constants.CALL_TASK;
@@ -191,11 +193,13 @@ export function SlideBoxContent(props) {
191
193
  let isPreview = false;
192
194
  let isEmailPreview = false;
193
195
  let isMpushPreview = false;
196
+ let isInappPreview = false;
194
197
  let isEditCallTask = false;
195
198
  let isEditMPush = false;
196
199
  let isEditFacebook = false;
197
200
  let isEditFTP = false;
198
201
  let isEditWhatsapp = false;
202
+ let isEditInApp = false;
199
203
  let isEditRcs = false;
200
204
  let isEditZalo = false;
201
205
  const isEmailCreate = isCreate && channel === constants.EMAIL;
@@ -212,8 +216,10 @@ export function SlideBoxContent(props) {
212
216
  isPreview = slidBoxContent === 'preview' && [constants.SMS, constants.LINE, constants.WHATSAPP, constants.FACEBOOK, constants.VIBER, constants.RCS].includes(channel);
213
217
  isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
214
218
  isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
219
+ isInappPreview = slidBoxContent === 'preview' && channel === constants.INAPP;
215
220
  isEditFTP = isEdit && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
216
221
  isEditZalo = isEdit && channel?.toUpperCase() === constants.ZALO;
222
+ isEditInApp = isEdit && channel === constants.INAPP;
217
223
  }
218
224
  const isDltEnabled = commonUtil.isTraiDLTEnable(isFullMode, smsRegister);
219
225
  const hasJPLocaleHideFeatureEnabled = commonUtil?.hasJPLocaleHideFeatureEnabled();
@@ -438,6 +444,13 @@ export function SlideBoxContent(props) {
438
444
  />
439
445
  )
440
446
  }
447
+ {isInappPreview && (
448
+ <MobilePushPreview
449
+ templateData={templateData}
450
+ channel={channel}
451
+ forwardedTags={forwardedTags}
452
+ />
453
+ )}
441
454
  {isMpushPreview && (
442
455
  <MobilePushPreview
443
456
  templateData={templateData}
@@ -786,6 +799,36 @@ export function SlideBoxContent(props) {
786
799
  }}/>
787
800
  )}
788
801
 
802
+ {isCreateInApp && (<InApp
803
+ isFullMode={isFullMode}
804
+ onCreateComplete={onCreateComplete}
805
+ handleClose={handleClose}
806
+ location={{
807
+ pathname: `/inapp/create`,
808
+ query,
809
+ search: '',
810
+ }}
811
+ />
812
+ )}
813
+
814
+ {isEditInApp && (<InApp
815
+ isFullMode={isFullMode}
816
+ templateData={templateData}
817
+ getFormData={getFormData}
818
+ getDefaultTags={type}
819
+ forwardedTags={forwardedTags}
820
+ onCreateComplete={onCreateComplete}
821
+ selectedOfferDetails={selectedOfferDetails}
822
+ params={{
823
+ id: templateData._id,
824
+ }}
825
+ location={{
826
+ pathname: `/inapp/edit`,
827
+ query,
828
+ search: '',
829
+ }} />
830
+ )}
831
+
789
832
  {isCreateRcs && (<Rcs
790
833
  {...rcsCommonProps}
791
834
  location={{
@@ -11,7 +11,7 @@ import whatsppMsg from '../Whatsapp/messages';
11
11
  import { LANGUAGE_OPTIONS } from '../Whatsapp/constants';
12
12
  import globalMessages from '../Cap/messages';
13
13
  import { MAP_TEMPLATE } from '../WeChat/Wrapper/constants';
14
- import { NO_COMMUNICATION, FTP, WHATSAPP, RCS, ZALO } from '../App/constants';
14
+ import { NO_COMMUNICATION, FTP, WHATSAPP, RCS, ZALO, INAPP } from '../App/constants';
15
15
  import { isTraiDLTEnable } from '../../utils/common';
16
16
  import { formatString } from '../../utils/Formatter';
17
17
  import {
@@ -39,7 +39,9 @@ export function SlideBoxHeader(props) {
39
39
  const isTraiDlt = isTraiDLTEnable(isFullMode, smsRegister);
40
40
  const showCreateTraiSMSHeader = isTraiDlt && channel.toLowerCase() === "sms";
41
41
  const isWhatsappEdit = channel.toLowerCase() === WHATSAPP && slidBoxContent === 'editTemplate';
42
+ const isInAppEdit = channel.toLowerCase() === INAPP && slidBoxContent === 'editTemplate';
42
43
  const isWhatsappCreate = channel.toLowerCase() === WHATSAPP && slidBoxContent === 'createTemplate';
44
+ const isInAppCreate = channel.toLowerCase() === INAPP && slidBoxContent === 'createTemplate';
43
45
  const isZaloEdit = channel.toLowerCase() === ZALO && slidBoxContent === 'editTemplate';
44
46
  const zaloOverview = isZaloEdit && isFullMode;
45
47
  const whatsappOverview = isWhatsappEdit && isFullMode;
@@ -60,6 +62,7 @@ export function SlideBoxHeader(props) {
60
62
  sms: <FormattedMessage {...messages.smsHeader} />,
61
63
  email: <FormattedMessage {...messages.emailHeader} />,
62
64
  mobilepush: <FormattedMessage {...messages.pushNotificationHeader} />,
65
+ inapp: <FormattedMessage {...messages.inAppHeader} />,
63
66
  wechat: <FormattedMessage {...messages.wechat} />,
64
67
  line: <FormattedMessage {...messages.lineHeader} />,
65
68
  no_communication: <FormattedMessage {...messages.noCommunication} />,
@@ -19,6 +19,7 @@ export const VIBER = "VIBER";
19
19
  export const WHATSAPP = "WHATSAPP";
20
20
  export const RCS = "RCS";
21
21
  export const ZALO = "ZALO";
22
+ export const INAPP = "INAPP";
22
23
  export const PREVIEW = "preview";
23
24
  export const EDIT_TEMPLATE = "editTemplate";
24
25
 
@@ -40,6 +40,7 @@ import { LOYALTY } from '../App/constants';
40
40
  import { WHATSAPP_STATUSES, WHATSAPP_MEDIA_TYPES } from '../Whatsapp/constants';
41
41
 
42
42
  import { updateImagesInHtml } from '../../utils/cdnTransformation';
43
+ import { IOS } from '../InApp/constants';
43
44
 
44
45
  const classPrefix = 'add-creatives-section';
45
46
  const CREATIVES_CONTAINER = 'creativesContainer';
@@ -155,7 +156,7 @@ export class Creatives extends React.Component {
155
156
  this.setState((prevState) => {
156
157
  let templateStep = prevState.templateStep + 1;
157
158
  const {emailCreateMode, currentChannel} = prevState;
158
- if ((currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") || currentChannel.toUpperCase() === constants.MOBILE_PUSH || currentChannel.toUpperCase() === constants.WECHAT) {
159
+ if ((currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") || [constants.MOBILE_PUSH, constants.WECHAT, constants.INAPP].includes(currentChannel.toUpperCase())) {
159
160
  templateStep = prevState.templateStep + 2;
160
161
  }
161
162
  return {
@@ -168,6 +169,9 @@ export class Creatives extends React.Component {
168
169
  this.setState({ emailCreateMode: mode});
169
170
  }
170
171
 
172
+ onInAppModeChange = (mode) => {
173
+ this.setState({ inAppCreateMode: mode});
174
+ }
171
175
 
172
176
  onMobilepushModeChange = (mode) => {
173
177
  this.setState({ mobilePushCreateMode: mode});
@@ -281,6 +285,21 @@ export class Creatives extends React.Component {
281
285
  };
282
286
  break;
283
287
  }
288
+ case constants.INAPP: {
289
+ const mode = get(templateData, 'androidContent.type') || get(templateData, 'iosContent.type') || '';
290
+ creativesTemplateData = {
291
+ type: channel,
292
+ name: templateData.messageSubject,
293
+ versions: {
294
+ content: {
295
+ ANDROID: templateData.androidContent,
296
+ IOS: templateData.iosContent,
297
+ },
298
+ },
299
+ definition: {accountId: templateData.accountId, mode: mode.toLowerCase()},
300
+ };
301
+ break;
302
+ }
284
303
  case constants.WECHAT: {
285
304
  const messageBody = JSON.parse(templateData.messageBody);
286
305
  creativesTemplateData = {
@@ -613,6 +632,50 @@ export class Creatives extends React.Component {
613
632
  templateData.messageSubject = mobilpushTemplate.name ? mobilpushTemplate.name : "messageSubject";
614
633
  }
615
634
  break;
635
+ case constants.INAPP:
636
+ if (get(template, "value.versions.base.content")) {
637
+ const inAppTemplate = template.value;
638
+ templateData.accountId = get(inAppTemplate, 'definition.accountId');
639
+ const type = (get(this.props, "messageDetails.type") || '').toLowerCase();
640
+ if (type === LOYALTY) {
641
+ templateData.licenseCode = get(inAppTemplate, 'definition.licenseCode');
642
+ templateData.templateId = get(inAppTemplate, '_id');
643
+ }
644
+ const androidContent = get(inAppTemplate, 'versions.base.content.ANDROID');
645
+ if (!isEmpty(androidContent)) {
646
+ if (type !== LOYALTY) {
647
+ delete androidContent.cuid;
648
+ delete androidContent.luid;
649
+ delete androidContent.communicationId;
650
+ }
651
+ const custom = {};
652
+ forEach(androidContent.custom, (customKeyValue) => {
653
+ custom[customKeyValue.key] = customKeyValue.value;
654
+ });
655
+ androidContent.custom = custom;
656
+ templateData.androidContent = androidContent;
657
+ templateData.androidContent.type = get(inAppTemplate, 'definition.mode', '').toUpperCase();
658
+ templateData.androidContent.deviceType = 'ANDROID';
659
+ }
660
+ const iosContent = get(inAppTemplate, 'versions.base.content.IOS');
661
+ if (!isEmpty(iosContent)) {
662
+ if (type !== LOYALTY) {
663
+ delete iosContent.cuid;
664
+ delete iosContent.luid;
665
+ delete iosContent.communicationId;
666
+ }
667
+ const custom = {};
668
+ forEach(iosContent.custom, (customKeyValue) => {
669
+ custom[customKeyValue.key] = customKeyValue.value;
670
+ });
671
+ iosContent.custom = custom;
672
+ templateData.iosContent = iosContent;
673
+ templateData.iosContent.type = get(inAppTemplate, 'definition.mode').toUpperCase();
674
+ templateData.iosContent.deviceType = IOS.toUpperCase();
675
+ }
676
+ templateData.messageSubject = inAppTemplate?.name ? inAppTemplate?.name : "messageSubject";
677
+ }
678
+ break;
616
679
  case constants.WECHAT:
617
680
  if (template.value) {
618
681
  const { accountId, previewContent, ...messageBody } = template.value;
@@ -904,6 +967,13 @@ export class Creatives extends React.Component {
904
967
  imageAdded: androidType === 'IMAGE' || iosType === 'IMAGE',
905
968
  };
906
969
  break;
970
+ case constants.INAPP:
971
+ gtmDetails = {
972
+ ...gtmDetails,
973
+ content: `${androidTitle} ${androidMessage} ${iosTitle} ${iosMessage}`,
974
+ imageAdded: androidType === IMAGE || iosType === IMAGE,
975
+ };
976
+ break;
907
977
  case constants.LINE:
908
978
  gtmDetails = Object.assign({
909
979
  ...gtmDetails,
@@ -981,12 +1051,13 @@ export class Creatives extends React.Component {
981
1051
  }
982
1052
  shouldShowFooter = () => {
983
1053
  const {isFullMode } = this.props;
984
- const {slidBoxContent, currentChannel, emailCreateMode, templateNameExists, templateStep, mobilePushCreateMode, weChatTemplateType, templateData} = this.state;
1054
+ const {slidBoxContent, currentChannel, emailCreateMode, templateNameExists, templateStep, mobilePushCreateMode, inAppCreateMode, weChatTemplateType, templateData} = this.state;
985
1055
  const channel = currentChannel.toUpperCase();
986
1056
  const currentStep = this.creativesTemplateSteps[templateStep];
987
1057
  let showFooter = false;
988
1058
  showFooter = isFullMode && slidBoxContent === "preview";
989
1059
  const isMobilepush = channel === constants.MOBILE_PUSH;
1060
+ const isInApp = channel === constants.INAPP;
990
1061
  if (!isFullMode ) {
991
1062
  const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
992
1063
  const isCreate = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
@@ -1036,7 +1107,6 @@ export class Creatives extends React.Component {
1036
1107
  if ([constants.LINE, constants.VIBER, constants.FACEBOOK].includes(channel) || isLineViberChannel) {
1037
1108
  showFooter = false;
1038
1109
  }
1039
-
1040
1110
  return showFooter;
1041
1111
  }
1042
1112
  shouldShowDoneFooter = () => {
@@ -1049,7 +1119,7 @@ export class Creatives extends React.Component {
1049
1119
  if (channel === constants.EMAIL || channel === constants.SMS) {
1050
1120
  const isEmailCreate = slidBoxContent === 'createTemplate' && channel === constants.EMAIL && currentStep !== 'createTemplateContent';
1051
1121
  showDone = (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate') && !isEmailCreate;
1052
- } else if (channel === constants.MOBILE_PUSH || channel === constants.WECHAT) {
1122
+ } else if ([constants.WECHAT, constants.MOBILE_PUSH].includes(channel)) {
1053
1123
  showDone = currentStep === "createTemplateContent" || slidBoxContent === "editTemplate";
1054
1124
  }
1055
1125
 
@@ -1080,7 +1150,7 @@ export class Creatives extends React.Component {
1080
1150
  showTemplateName = ({formData, onFormDataChange}) => { //gets called from email/index after template data is fetched
1081
1151
  const {slidBoxContent, currentChannel, isEditName} = this.state;
1082
1152
  const channel = currentChannel.toUpperCase();
1083
- if ((channel === constants.EMAIL || channel === constants.MOBILE_PUSH) && (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate')) {
1153
+ if ([constants.EMAIL, constants.MOBILE_PUSH, constants.INAPP].includes(channel) && (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate')) {
1084
1154
  const name = get(formData, 'template-name');
1085
1155
  if (channel === constants.EMAIL && !name && slidBoxContent === 'createTemplate') {
1086
1156
  this.setState({isTemplateNameEmpty:true});
@@ -1094,7 +1164,7 @@ export class Creatives extends React.Component {
1094
1164
  }
1095
1165
  }
1096
1166
  shouldShowContinueFooter = () => { // only for email for now, has to be modified according to channel
1097
- const {slidBoxContent, templateStep, currentChannel, emailCreateMode, mobilePushCreateMode, weChatTemplateType} = this.state;
1167
+ const {slidBoxContent, templateStep, currentChannel, emailCreateMode, mobilePushCreateMode, inAppCreateMode, weChatTemplateType} = this.state;
1098
1168
  let isShowContinueFooter = false;
1099
1169
  const currentStep = this.creativesTemplateSteps[templateStep];
1100
1170
  const channel = currentChannel.toUpperCase();
@@ -1108,6 +1178,8 @@ export class Creatives extends React.Component {
1108
1178
  isShowContinueFooter = !isEmpty(mobilePushCreateMode) && currentStep === "modeSelection";
1109
1179
  } else if (currentChannel.toUpperCase() === constants.WECHAT) {
1110
1180
  isShowContinueFooter = !isEmpty(weChatTemplateType) && currentStep === "modeSelection";
1181
+ } else if (currentChannel.toUpperCase() === constants.INAPP) {
1182
+ isShowContinueFooter = !isEmpty(inAppCreateMode) && currentChannel === "modeSelection";
1111
1183
  }
1112
1184
 
1113
1185
  return isShowContinueFooter;
@@ -1117,7 +1189,7 @@ export class Creatives extends React.Component {
1117
1189
  const {templateContainerDetails} = this;
1118
1190
  const {formData, onFormDataChange} = templateContainerDetails;
1119
1191
  const channel = currentChannel.toUpperCase();
1120
- if ((channel === constants.EMAIL || channel === constants.MOBILE_PUSH) && (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate')) {
1192
+ if ([constants.EMAIL, constants.MOBILE_PUSH, constants.INAPP].includes(channel) && (slidBoxContent === 'editTemplate' || slidBoxContent === 'createTemplate')) {
1121
1193
  const name = get(formData, 'template-name');
1122
1194
  return showTemplateNameComponentEdit ? this.templateNameComponentInput({formData, onFormDataChange, name}) : this.templateNameComponentHeader({formData, onFormDataChange, name});
1123
1195
  }
@@ -338,6 +338,10 @@ export default defineMessages({
338
338
  id: `${scope}.pushNotificationHeader`,
339
339
  defaultMessage: `Push notification`,
340
340
  },
341
+ "inAppHeader": {
342
+ id: `${scope}.inAppHeader`,
343
+ defaultMessage: `In App Message`,
344
+ },
341
345
  "wechat": {
342
346
  id: `${scope}.wechat`,
343
347
  defaultMessage: `Wechat`,
@@ -0,0 +1,64 @@
1
+ import { INAPP } from "../CreativesContainer/constants";
2
+ import {
3
+ INAPP_TEMPLATE_CREATE_REQUEST,
4
+ CLEAR_CREATE_RESPONSE_REQUEST,
5
+ GET_INAPP_TEMPLATE_DETAILS_REQUEST,
6
+ RESET_EDIT_TEMPLATE,
7
+ UPLOAD_INAPP_ASSET_REQUEST,
8
+ CLEAR_INAPP_ASSET,
9
+ INAPP_EDIT_TEMPLATE_REQUEST,
10
+ } from "./constants";
11
+
12
+ export function createInAppTemplate(payload, callback) {
13
+ return {
14
+ type: INAPP_TEMPLATE_CREATE_REQUEST,
15
+ payload,
16
+ callback,
17
+ };
18
+ }
19
+ export function clearCreateResponse() {
20
+ return {
21
+ type: CLEAR_CREATE_RESPONSE_REQUEST,
22
+ };
23
+ }
24
+ // FOR EDIT
25
+ export function getTemplateDetails(id, callback) {
26
+ return {
27
+ type: GET_INAPP_TEMPLATE_DETAILS_REQUEST,
28
+ id,
29
+ channel: INAPP,
30
+ callback,
31
+ };
32
+ }
33
+
34
+ export function editTemplate(template, callback) {
35
+ return {
36
+ type: INAPP_EDIT_TEMPLATE_REQUEST,
37
+ payload: template,
38
+ callback,
39
+ };
40
+ }
41
+
42
+ export function resetEditTemplate() {
43
+ return {
44
+ type: RESET_EDIT_TEMPLATE,
45
+ };
46
+ }
47
+
48
+ export const uploadInAppAsset = (
49
+ file,
50
+ assetType,
51
+ fileParams,
52
+ templateType,
53
+ ) => ({
54
+ type: UPLOAD_INAPP_ASSET_REQUEST,
55
+ file,
56
+ assetType,
57
+ fileParams,
58
+ templateType,
59
+ });
60
+
61
+ export const clearInAppAsset = (templateType) => ({
62
+ type: CLEAR_INAPP_ASSET,
63
+ templateType,
64
+ });
@@ -0,0 +1,126 @@
1
+ import React from "react";
2
+ import { FormattedMessage } from "react-intl";
3
+ import CapHeading from "@capillarytech/cap-ui-library/CapHeading";
4
+ import CapLabel from "@capillarytech/cap-ui-library/CapLabel";
5
+ import { WEBSITE } from "../../v2Components/CapInAppCTA/constants";
6
+ import messages from "./messages";
7
+
8
+ const prefix = "app/v2Containers/InApp";
9
+ export const INAPP_TEMPLATE_CREATE_REQUEST = `${prefix}/INAPP_TEMPLATE_CREATE_REQUEST`;
10
+ export const INAPP_TEMPLATE_CREATE_SUCCESS = `${prefix}/INAPP_TEMPLATE_CREATE_SUCCESS`;
11
+ export const INAPP_TEMPLATE_CREATE_FAILURE = `${prefix}/INAPP_TEMPLATE_CREATE_FAILURE`;
12
+ export const INAPP_EDIT_TEMPLATE_REQUEST = `${prefix}/INAPP_EDIT_TEMPLATE_REQUEST`;
13
+ export const INAPP_EDIT_TEMPLATE_SUCCESS = `${prefix}/INAPP_EDIT_TEMPLATE_SUCCESS`;
14
+ export const INAPP_EDIT_TEMPLATE_FAILURE = `${prefix}/INAPP_EDIT_TEMPLATE_FAILURE`;
15
+ export const CLEAR_CREATE_RESPONSE_REQUEST = `${prefix}/CLEAR_CREATE_RESPONSE_REQUEST`;
16
+ // FOR EDIT
17
+ export const GET_INAPP_TEMPLATE_DETAILS_REQUEST = `${prefix}/Edit/GET_INAPP_TEMPLATE_DETAILS_REQUEST`;
18
+ export const GET_INAPP_TEMPLATE_DETAILS_SUCCESS = `${prefix}/Edit/GET_INAPP_TEMPLATE_DETAILS_SUCCESS`;
19
+ export const GET_INAPP_TEMPLATE_DETAILS_FAILURE = `${prefix}/Edit/GET_INAPP_TEMPLATE_DETAILS_FAILURE`;
20
+ export const RESET_EDIT_TEMPLATE = `${prefix}/Edit/RESET_EDIT_TEMPLATE`;
21
+
22
+ export const UPLOAD_INAPP_ASSET_REQUEST = `${prefix}/UPLOAD_INAPP_ASSET_REQUEST`;
23
+ export const UPLOAD_INAPP_ASSET_SUCCESS = `${prefix}/UPLOAD_INAPP_ASSET_SUCCESS`;
24
+ export const UPLOAD_INAPP_ASSET_FAILURE = `${prefix}/UPLOAD_INAPP_ASSET_FAILURE`;
25
+ export const CLEAR_INAPP_ASSET = `${prefix}/CLEAR_INAPP_ASSET`;
26
+
27
+ export const INAPP_MEDIA_TYPES = {
28
+ TEXT: "TEXT",
29
+ IMAGE: "IMAGE",
30
+ };
31
+ export const BIG_TEXT = 'BIG_TEXT';
32
+ export const BIG_PICTURE = 'BIG_PICTURE';
33
+ export const NONE = "NONE";
34
+ export const CTA = "CTA";
35
+ export const MAPP_SDK = "MAPP_SDK";
36
+ export const INAPP_BUTTON_TYPES = {
37
+ NONE,
38
+ CTA,
39
+ };
40
+
41
+ export const DEEP_LINK = 'DEEP_LINK';
42
+
43
+ export const INITIAL_CTA_DATA = [
44
+ {
45
+ index: 0,
46
+ ctaType: WEBSITE,
47
+ text: "",
48
+ urlType: DEEP_LINK,
49
+ url: "",
50
+ isSaved: false,
51
+ label: "",
52
+ },
53
+ ];
54
+
55
+ export const URL_MAX_LENGTH = 2000;
56
+
57
+ export const ALLOWED_IMAGE_EXTENSIONS_REGEX = /\.(jpe?g|png)$/i;
58
+ export const INAPP_IMG_SIZE = 5000000; // 5MB
59
+
60
+ export const TEMPLATE_MESSAGE_MAX_LENGTH = 1024;
61
+
62
+ export const INAPP_MESSAGE_LAYOUT_TYPES = {
63
+ MODAL: "POPUP",
64
+ TOPBANNER: "HEADER",
65
+ BOTTOMBANNER: "FOOTER",
66
+ FULLSCREEN: "FULLSCREEN",
67
+ };
68
+
69
+ export const ANDROID = "ANDROID";
70
+ export const IOS = "iOS";
71
+ export const LAYOUT_RADIO_OPTIONS = [
72
+ {
73
+ value: INAPP_MESSAGE_LAYOUT_TYPES.MODAL,
74
+ label: <FormattedMessage {...messages.layoutModal} />,
75
+ },
76
+ {
77
+ value: INAPP_MESSAGE_LAYOUT_TYPES.TOPBANNER,
78
+ label: <FormattedMessage {...messages.layoutTopBanner} />,
79
+ },
80
+ {
81
+ value: INAPP_MESSAGE_LAYOUT_TYPES.BOTTOMBANNER,
82
+ label: <FormattedMessage {...messages.layoutBottomBanner} />,
83
+ },
84
+ {
85
+ value: INAPP_MESSAGE_LAYOUT_TYPES.FULLSCREEN,
86
+ label: <FormattedMessage {...messages.layoutFullScreen} />,
87
+ },
88
+ ];
89
+ export const MEDIA_RADIO_OPTIONS = [
90
+ {
91
+ value: INAPP_MEDIA_TYPES.TEXT,
92
+ label: <FormattedMessage {...messages.mediaText} />,
93
+ },
94
+ {
95
+ value: INAPP_MEDIA_TYPES.IMAGE,
96
+ label: <FormattedMessage {...messages.mediaImage} />,
97
+ },
98
+ ];
99
+ export const BUTTON_RADIO_OPTIONS = [
100
+ {
101
+ value: INAPP_BUTTON_TYPES.NONE,
102
+ label: (
103
+ <CapHeading
104
+ type="h4"
105
+ className="inapp-button-none"
106
+ >
107
+ <FormattedMessage {...messages.btnTypeNone} />
108
+ </CapHeading>
109
+ ),
110
+ },
111
+ {
112
+ value: INAPP_BUTTON_TYPES.CTA,
113
+ label: (
114
+ <>
115
+ <div
116
+ className="inapp-button-cta"
117
+ >
118
+ <CapHeading type="h4">
119
+ <FormattedMessage {...messages.btnTypeCTA} />
120
+ </CapHeading>
121
+ <CapLabel><FormattedMessage {...messages.ctaDesc} /></CapLabel>
122
+ </div>
123
+ </>
124
+ ),
125
+ },
126
+ ];