@capillarytech/creatives-library 7.6.1 → 7.6.3

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 (37) hide show
  1. package/config/app.js +2 -0
  2. package/index.js +6 -0
  3. package/package.json +1 -1
  4. package/reducers.js +2 -1
  5. package/routes.js +5 -0
  6. package/services/api.js +30 -1
  7. package/utils/common.js +13 -1
  8. package/v2Components/CapVideoUpload/index.js +14 -6
  9. package/v2Components/TemplatePreview/index.js +23 -2
  10. package/v2Containers/App/constants.js +21 -0
  11. package/v2Containers/Cap/messages.js +30 -0
  12. package/v2Containers/CapFacebookPreview/actions.js +3 -15
  13. package/v2Containers/CapFacebookPreview/constants.js +3 -11
  14. package/v2Containers/CapFacebookPreview/index.js +6 -6
  15. package/v2Containers/CapFacebookPreview/reducer.js +3 -9
  16. package/v2Containers/CapFacebookPreview/sagas.js +6 -65
  17. package/v2Containers/CreativesContainer/SlideBoxContent.js +64 -1
  18. package/v2Containers/CreativesContainer/index.js +19 -8
  19. package/v2Containers/Facebook/Advertisement/index.js +38 -15
  20. package/v2Containers/Facebook/Advertisement/index.scss +9 -0
  21. package/v2Containers/Facebook/Advertisement/messages.js +2 -2
  22. package/v2Containers/Facebook/actions.js +63 -0
  23. package/v2Containers/Facebook/constants.js +25 -1
  24. package/v2Containers/Facebook/index.js +135 -107
  25. package/v2Containers/Facebook/reducer.js +98 -1
  26. package/v2Containers/Facebook/sagas.js +147 -0
  27. package/v2Containers/Facebook/selectors.js +10 -0
  28. package/v2Containers/Line/Container/Video/index.js +38 -41
  29. package/v2Containers/Templates/_templates.scss +26 -0
  30. package/v2Containers/Templates/actions.js +14 -1
  31. package/v2Containers/Templates/constants.js +8 -0
  32. package/v2Containers/Templates/index.js +138 -10
  33. package/v2Containers/Templates/messages.js +8 -4
  34. package/v2Containers/Templates/reducer.js +22 -0
  35. package/v2Containers/Templates/sagas.js +26 -1
  36. package/v2Containers/TemplatesV2/index.js +13 -13
  37. package/v2Containers/Viber/index.js +2 -1
@@ -136,6 +136,7 @@ function SlideBoxContent(props) {
136
136
  onShowTemplates,
137
137
  handleClose,
138
138
  onFTPSubmit,
139
+ campaignSettings,
139
140
  } = props;
140
141
  const type = (messageDetails.type || '').toLowerCase(); // type is context in get tags values : outbound | dvs | referral | loyalty | coupons
141
142
  const query = { type: !isFullMode && 'embedded', module: isFullMode ? 'default' : 'library', isEditFromCampaigns: (templateData || {}).isEditFromCampaigns};
@@ -164,6 +165,8 @@ function SlideBoxContent(props) {
164
165
 
165
166
 
166
167
  const isCreateSms = slidBoxContent === 'createTemplate' && channel === constants.SMS;
168
+ const isCreateFacebook = slidBoxContent === 'createTemplate' && channel === constants.FACEBOOK;
169
+
167
170
  const isCreateMPush = slidBoxContent === 'createTemplate' && channel === constants.MOBILE_PUSH;
168
171
  const isCreateCallTask = slidBoxContent === 'createTemplate' && channel === constants.CALL_TASK;
169
172
  let isEditSms = false;
@@ -185,7 +188,7 @@ function SlideBoxContent(props) {
185
188
  isEditEmailWithId = slidBoxContent === 'editTemplate' && channel === constants.EMAIL && templateData._id;
186
189
  isEmailEditWithContent = slidBoxContent === 'editTemplate' && channel === constants.EMAIL && !templateData._id;
187
190
  isEditFacebook = slidBoxContent === 'editTemplate' && channel === constants.FACEBOOK;
188
- isPreview = slidBoxContent === 'preview' && (channel === constants.SMS || channel === constants.LINE || channel === constants.VIBER);
191
+ isPreview = slidBoxContent === 'preview' && (channel === constants.SMS || channel === constants.LINE || channel === constants.VIBER || channel === constants.FACEBOOK);
189
192
  isEmailPreview = slidBoxContent === 'preview' && channel === constants.EMAIL;
190
193
  isMpushPreview = slidBoxContent === 'preview' && channel === constants.MOBILE_PUSH;
191
194
  isEditFTP = slidBoxContent === 'editTemplate' && [constants.NO_COMMUNICATION, constants.FTP].includes(channel);
@@ -263,6 +266,44 @@ function SlideBoxContent(props) {
263
266
  };
264
267
  return template.content;
265
268
  }
269
+ case constants.FACEBOOK: {
270
+ const template = cloneDeep(templateDataObject.versions.base) || {};
271
+ const {FacebookAd = [], pageOrgUnitId} = template.content || {};
272
+ const {
273
+ type: fbType = "",
274
+ primaryText = "",
275
+ callToAction = "",
276
+ displayLink = "",
277
+ } = FacebookAd[0] || {};
278
+ const previewData = Object.values(template.content.FacebookAd).map((obj) => ({
279
+ imageData: obj.imgSrc ? {imageSrc: obj.imgSrc} : {},
280
+ linkDesc: obj.linkDesc,
281
+ linkHeadLine: obj.linkHeadLine,
282
+ subType: obj.subType,
283
+ videoData: obj.video ? { videoSrc: obj.video.originalContentUrl,
284
+ videoName: obj.video.videoName,
285
+ previewUrl: obj.video.previewImageUrl,
286
+ videoId: obj.video.videoId,
287
+
288
+ } : {},
289
+ webSiteLink: obj.webSiteLink,
290
+ }));
291
+ const facebookAccountSettings = get(campaignSettings, 'accountSettings.socialAccountSettings.facebookAccountSettings', []);
292
+ const {accountId, employeeAccessToken: accessToken, orgUnitFacebookPageSettingsMap = {}} = facebookAccountSettings[0] || {};
293
+ const {pageAccessToken, pageId} = orgUnitFacebookPageSettingsMap[pageOrgUnitId];
294
+ const fbContent = {
295
+ selectedAd: fbType,
296
+ previewData,
297
+ primaryText,
298
+ callToAction,
299
+ displayLink,
300
+ pageAccessToken,
301
+ pageId,
302
+ accountId,
303
+ accessToken,
304
+ };
305
+ return fbContent;
306
+ }
266
307
  default:
267
308
  return get(templateDataObject, `versions.base.content`);
268
309
  }
@@ -505,6 +546,22 @@ function SlideBoxContent(props) {
505
546
  onPreviewContentClicked={onPreviewContentClicked}
506
547
  onTestContentClicked={onTestContentClicked}/>
507
548
  }
549
+ {
550
+ isCreateFacebook && (
551
+ <Facebook
552
+ templateData={templateData}
553
+ messageDetails={messageDetails}
554
+ cap={cap}
555
+ onFacebookSubmit={onFacebookSubmit}
556
+ onCreateComplete={onCreateComplete}
557
+ setIsLoadingContent={setIsLoadingContent}
558
+ isFullMode={isFullMode}
559
+ createNew
560
+ getFormSubscriptionData={getFormData}
561
+
562
+ />
563
+ )
564
+ }
508
565
  {
509
566
  isEditFacebook && (
510
567
  <Facebook
@@ -512,7 +569,12 @@ function SlideBoxContent(props) {
512
569
  messageDetails={messageDetails}
513
570
  cap={cap}
514
571
  onFacebookSubmit={onFacebookSubmit}
572
+ onCreateComplete={onCreateComplete}
515
573
  isFullMode={isFullMode}
574
+ params={{
575
+ id: templateData._id,
576
+ }}
577
+ getFormSubscriptionData={getFormData}
516
578
  />
517
579
  )
518
580
  }
@@ -596,6 +658,7 @@ SlideBoxContent.propTypes = {
596
658
  onChannelChange: PropTypes.func,
597
659
  currentChannel: PropTypes.string,
598
660
  onEmailModeChange: PropTypes.func,
661
+ onFacebookAdModeChange: PropTypes.func,
599
662
  emailCreateMode: PropTypes.string,
600
663
  templateStep: PropTypes.string,
601
664
  onCreateNextStep: PropTypes.func,
@@ -51,6 +51,7 @@ class Creatives extends React.Component {
51
51
  currentChannel: this.props.channel || 'sms',
52
52
  weChatTemplateType: '',
53
53
  weChatMaptemplateStep: 0,
54
+
54
55
  };
55
56
  this.creativesTemplateSteps = {
56
57
  1: 'modeSelection',
@@ -104,7 +105,6 @@ class Creatives extends React.Component {
104
105
  if ((currentChannel.toUpperCase() === constants.EMAIL && emailCreateMode === "upload") || currentChannel.toUpperCase() === constants.MOBILE_PUSH || currentChannel.toUpperCase() === constants.WECHAT) {
105
106
  templateStep = prevState.templateStep + 2;
106
107
  }
107
-
108
108
  return {
109
109
  templateStep,
110
110
  };
@@ -114,6 +114,8 @@ class Creatives extends React.Component {
114
114
  onEmailModeChange = (mode) => {
115
115
  this.setState({ emailCreateMode: mode});
116
116
  }
117
+
118
+
117
119
  onMobilepushModeChange = (mode) => {
118
120
  this.setState({ mobilePushCreateMode: mode});
119
121
  }
@@ -479,17 +481,19 @@ class Creatives extends React.Component {
479
481
  showFooter = true;
480
482
  }
481
483
 
482
-
483
484
  if (showFooter) {
484
- if (slidBoxContent === "createTemplate" && ((channel === constants.EMAIL && currentStep === 'createTemplateContent') || (channel === constants.SMS && currentStep === 'modeSelection') || (channel === constants.WECHAT && currentStep === 'modeSelection'))) {
485
+ if (slidBoxContent === "createTemplate" && ((channel === constants.EMAIL && currentStep === 'createTemplateContent') ||
486
+ ([constants.SMS, constants.WECHAT].includes(channel) && currentStep === 'modeSelection'))) {
485
487
  showFooter = showFooter && !this.state.isLoadingContent;
486
- } else if (slidBoxContent === "editTemplate" && ((channel === constants.EMAIL && currentStep === 'modeSelection') || (channel === constants.SMS && currentStep === 'modeSelection') || (channel === constants.WECHAT && currentStep === 'modeSelection'))) {
488
+ } else if (slidBoxContent === "editTemplate" &&
489
+ ([constants.SMS, constants.WECHAT, constants.EMAIL].includes(channel) &&
490
+ currentStep === 'modeSelection')) {
487
491
  showFooter = showFooter && !this.state.isLoadingContent;
488
492
  }
489
493
  }
490
494
 
491
495
  const isLineViberChannel = templateData && [constants.LINE, constants.VIBER].includes(templateData);
492
- if ([constants.LINE, constants.VIBER].includes(channel) || isLineViberChannel) {
496
+ if ([constants.LINE, constants.VIBER, constants.FACEBOOK].includes(channel) || isLineViberChannel) {
493
497
  showFooter = false;
494
498
  }
495
499
 
@@ -573,6 +577,13 @@ class Creatives extends React.Component {
573
577
  }
574
578
  return false;
575
579
  }
580
+ shouldShowHeader = () => {
581
+ const {currentChannel} = this.state;
582
+ if (currentChannel === constants.FACEBOOK) {
583
+ return false;
584
+ }
585
+ return true;
586
+ }
576
587
  render() {
577
588
  const {slidBoxContent, isGetFormData, showSlideBox, templateData, currentChannel, emailCreateMode, templateStep, isLoadingContent, mobilePushCreateMode, isDiscardMessage, weChatTemplateType, weChatMaptemplateStep} = this.state;
578
589
  const {isFullMode, creativesMode, cap, isUploading, channelsToHide, selectedWeChatAccount, forwardedTags, channelsToDisable, selectedOfferDetails, onTestContentClicked, onPreviewContentClicked, getCreativesData, fetchingCmsData, editor} = this.props;
@@ -582,7 +593,7 @@ class Creatives extends React.Component {
582
593
  <SlideBoxWrapper className={classnames(`${classPrefix} ${isFullMode ? 'creatives-full-mode' : 'creatives-library-mode'} ${mapTemplateCreate ? 'map-template-create' : ''}`)}>
583
594
  <CapSlideBox
584
595
  header={
585
- <SlideBoxHeader
596
+ this.shouldShowHeader() && <SlideBoxHeader
586
597
  key="creatives-container-slidebox-header"
587
598
  channel={currentChannel}
588
599
  messages={this.props.messages}
@@ -599,8 +610,7 @@ class Creatives extends React.Component {
599
610
  weChatTemplateType={weChatTemplateType}
600
611
  showPrefix={!isUploading} // not show back button when email template is being uploaded
601
612
  templateStep={this.creativesTemplateSteps[templateStep]}
602
- />
603
- }
613
+ />}
604
614
  content={
605
615
  <SlideBoxContent
606
616
  key="creatives-container-slidebox-content"
@@ -609,6 +619,7 @@ class Creatives extends React.Component {
609
619
  onPreviewTemplate={this.onPreviewTemplate}
610
620
  slidBoxContent={slidBoxContent}
611
621
  templateData={templateData}
622
+ campaignSettings={this.props.Templates.campaignSettings}
612
623
  location={this.props.location}
613
624
  messageDetails={this.props.messageDetails}
614
625
  getFormData={this.getFormData}
@@ -54,7 +54,7 @@ import {
54
54
  IMAGE_VIDEO,
55
55
  NO_CALL_TO_ACTION,
56
56
  } from './constant';
57
-
57
+ import cloneDeep from 'lodash/cloneDeep';
58
58
  export const Advertisement = (props) => {
59
59
  const CarouselContainer = styled.div`
60
60
  width: ${(styledProps) => styledProps.width || '22px'};
@@ -122,11 +122,28 @@ export const Advertisement = (props) => {
122
122
  type,
123
123
  fileParams,
124
124
  indexFile) => {
125
+ let videoData = {};
126
+ if (type === 'video') {
127
+ const {
128
+ orgUnitFacebookPageSettingsMap = {},
129
+ employeeAccessToken: accessToken = "",
130
+ accountId = "",
131
+ } = selectedFacebookAccount;
132
+ const { pageAccessToken, pageId: pId } = orgUnitFacebookPageSettingsMap[pageId] || {};
133
+ videoData = {
134
+ accessToken,
135
+ actId: accountId,
136
+ pageAccessToken,
137
+ pageId: pId,
138
+ };
139
+ }
125
140
  actions.uploadFbAdAsset(file,
126
141
  type,
127
142
  fileParams,
128
- indexFile);
129
- }, []);
143
+ indexFile,
144
+ videoData,
145
+ );
146
+ }, [pageId]);
130
147
 
131
148
  const paramObj = params || {};
132
149
 
@@ -142,7 +159,7 @@ export const Advertisement = (props) => {
142
159
 
143
160
  useEffect(() => {
144
161
  if ((params && params.id) || (templateData || {}).edit) {
145
- const { FacebookAd = [], pageId: editPageId} = get(templateData, `versions.base.content`) || get(fbADData, `templateDetails.versions.base.content`) || {};
162
+ const { FacebookAd = [], pageOrgUnitId: editPageId} = get(templateData, `versions.base.content`) || get(fbADData, `templateDetails.versions.base.content`) || {};
146
163
  const editMessageTitle = (templateData || {}).name || get(fbADData, 'templateDetails.name');
147
164
  const editFBContent = Object.values(FacebookAd);
148
165
  if (editPageId) {
@@ -182,6 +199,7 @@ export const Advertisement = (props) => {
182
199
  videoName,
183
200
  videoHeight,
184
201
  videoWidth,
202
+ videoId,
185
203
  } = obj.video;
186
204
  data.videoData = {
187
205
  videoSrc,
@@ -189,6 +207,7 @@ export const Advertisement = (props) => {
189
207
  videoHeight,
190
208
  videoWidth,
191
209
  previewUrl,
210
+ videoId,
192
211
  };
193
212
  }
194
213
  newCarouselData[index] = {...defaultCarouselContent, ...data};
@@ -248,14 +267,16 @@ export const Advertisement = (props) => {
248
267
  }, [selectedAd]);
249
268
 
250
269
  const updateOnImageReUpload = useCallback(() => {
251
- const newCarouselData = [...carouselData];
270
+ const newCarouselData = cloneDeep(carouselData);
252
271
  newCarouselData[activeIndex].imageData.imageSrc = '';
253
272
  updateCarouselData(newCarouselData);
254
273
  }, [carouselData, activeIndex]);
255
274
 
256
275
  const setUpdateImageSrc = useCallback((val) => {
257
- const newCarouselData = [...carouselData];
258
- newCarouselData[activeIndex].imageData.imageSrc = val;
276
+ const newCarouselData = cloneDeep(carouselData);
277
+ newCarouselData[activeIndex].imageData = {
278
+ imageSrc: val,
279
+ };
259
280
  updateCarouselData(newCarouselData);
260
281
  actions.clearFbAdAsset(activeIndex);
261
282
  }, [carouselData, activeIndex]);
@@ -314,6 +335,7 @@ export const Advertisement = (props) => {
314
335
  videoHeight,
315
336
  videoWidth,
316
337
  previewUrl,
338
+ videoId,
317
339
  } = obj.videoData;
318
340
  data.video = {
319
341
  previewImageUrl: previewUrl,
@@ -322,6 +344,7 @@ export const Advertisement = (props) => {
322
344
  baseUrl: previewUrl.replace('/1040', ''),
323
345
  videoHeight,
324
346
  videoWidth,
347
+ videoId,
325
348
  };
326
349
  }
327
350
  messageData.push(data);
@@ -332,7 +355,7 @@ export const Advertisement = (props) => {
332
355
  base: {
333
356
  content: {
334
357
  FacebookAd: {...messageData},
335
- pageId,
358
+ pageOrgUnitId: pageId,
336
359
  },
337
360
  },
338
361
  },
@@ -780,7 +803,7 @@ export const Advertisement = (props) => {
780
803
  }, [pageId]);
781
804
 
782
805
  const selectedFacebookAccount = get(facebookTemplateData, 'selectedFacebookAccount', {});
783
- const {orgUnitFacebookPageSettingsMap = {}, accessToken = "", accountId = "" } = selectedFacebookAccount;
806
+ const {orgUnitFacebookPageSettingsMap = {}, employeeAccessToken: accessToken = "", accountId = "" } = selectedFacebookAccount;
784
807
 
785
808
  const getPageAccessOrgs = useCallback(() => {
786
809
  const {status, data } = fbADData.orgOuData || {};
@@ -865,17 +888,17 @@ export const Advertisement = (props) => {
865
888
  >
866
889
  {editNameState ? <CapInput
867
890
  type="input"
868
- style={{display: 'inline-block'}}
891
+ className="cap-input-edit-name"
869
892
  onBlur={onEditFocusOut}
870
893
  defaultValue={messageTitle || ''}
871
894
  /> : messageTitle
872
895
  }
873
- {!editNameState && <CapLink
874
- style={{display: "inline-flex"}}
875
- title={<FormattedMessage {...messages.creativesTemplatesEditName}/>}
876
- onClick={onClickEditName}
877
- />}
878
896
  </CapHeading>
897
+ {!editNameState && <CapLink
898
+ className="cap-link-edit-name"
899
+ title={<FormattedMessage {...messages.creativesTemplatesEditName}/>}
900
+ onClick={onClickEditName}
901
+ />}
879
902
  </div>
880
903
  <CapColumn span={12}>
881
904
  {isFullMode && <><CapHeading
@@ -18,7 +18,16 @@ $classPrefix: add-facebook-ad-section;
18
18
  white-space: nowrap;
19
19
  min-width: 112px;
20
20
  max-width: 920px;
21
+ display: inline-block;
21
22
  }
23
+ .cap-input-edit-name{
24
+ width: 500px;
25
+ }
26
+ .cap-link-edit-name{
27
+ display: inline-block;
28
+ margin-bottom: 4px;
29
+ }
30
+
22
31
  .cap-header-facebook-ad{
23
32
  position: fixed;
24
33
  top: 27px;
@@ -17,7 +17,7 @@ export default defineMessages({
17
17
  },
18
18
  imageVideoDesc: {
19
19
  id: `${messagePrefix}.imageVideoDesc`,
20
- defaultMessage: 'Create an Ad with one image or video, or a slideshow with multiple images',
20
+ defaultMessage: 'Create an Ad with one image or video',
21
21
  },
22
22
  carouselTitle: {
23
23
  id: `${messagePrefix}.carouselTitle`,
@@ -93,7 +93,7 @@ export default defineMessages({
93
93
  },
94
94
  video_slideshow: {
95
95
  id: `${messagePrefix}.video_slideshow`,
96
- defaultMessage: 'Video/Slideshow',
96
+ defaultMessage: 'Video',
97
97
  },
98
98
  doneButtonLabel: {
99
99
  id: `${messagePrefix}.doneButtonLabel`,
@@ -6,8 +6,71 @@
6
6
 
7
7
  import {
8
8
  GET_MARKETING_OBJECTIVES,
9
+ UPLOAD_FB_AD_ASSET_REQUEST,
10
+ CREATE_FACEBOOK_AD_TEMPLATE_REQUEST,
11
+ EDIT_FACEBOOK_AD_TEMPLATE_REQUEST,
12
+ GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST,
13
+ CLEAR_FACEBOOK_AD_ASSET,
14
+ CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST,
15
+ CLEAR_FACEBOOK_AD_DATA,
16
+ CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST,
17
+ GET_ORG_OU_LIST_REQUEST,
9
18
  } from './constants';
10
19
 
11
20
  export const getMarketingObjectives = () => ({
12
21
  type: GET_MARKETING_OBJECTIVES,
13
22
  });
23
+
24
+ export const uploadFbAdAsset = (file, assetType, fileParams, templateType, videoData) => ({
25
+ type: UPLOAD_FB_AD_ASSET_REQUEST,
26
+ file,
27
+ assetType,
28
+ fileParams,
29
+ templateType,
30
+ videoData,
31
+ });
32
+
33
+ export const createTemplate = (template, callback) => ({
34
+ type: CREATE_FACEBOOK_AD_TEMPLATE_REQUEST,
35
+ template,
36
+ callback,
37
+ });
38
+
39
+ export const getOrgOUs = (orgID) => ({
40
+ type: GET_ORG_OU_LIST_REQUEST,
41
+ orgID,
42
+ });
43
+
44
+ // FOR EDIT
45
+
46
+ export const editTemplate = (template, callback) => ({
47
+ type: EDIT_FACEBOOK_AD_TEMPLATE_REQUEST,
48
+ template,
49
+ callback,
50
+ });
51
+
52
+ export const getTemplateDetails = (id, callback) => ({
53
+ type: GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST,
54
+ id,
55
+ channel: 'FACEBOOK',
56
+ callback,
57
+ });
58
+
59
+ export const clearData = () => ({
60
+ type: CLEAR_FACEBOOK_AD_DATA,
61
+ });
62
+
63
+ export const clearEditResponse = () => ({
64
+ type: CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST,
65
+ });
66
+
67
+
68
+ export const clearCreateResponse = () => ({
69
+ type: CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST,
70
+ });
71
+
72
+ export const clearFbAdAsset = (templateType) => ({
73
+ type: CLEAR_FACEBOOK_AD_ASSET,
74
+ templateType,
75
+ });
76
+
@@ -4,12 +4,36 @@
4
4
  *
5
5
  */
6
6
 
7
- const prefix = 'app/Facebook';
7
+ const prefix = 'app/v2Containers/Facebook';
8
8
 
9
9
  export const GET_MARKETING_OBJECTIVES = `${prefix}/GET_MARKETING_OBJECTIVES`;
10
10
  export const SET_MARKETING_OBJECTIVES_SUCCESS = `${prefix}/SET_MARKETING_OBJECTIVES_SUCCESS`;
11
11
  export const SET_MARKETING_OBJECTIVES_FAILURE = `${prefix}/SET_MARKETING_OBJECTIVES_FAILURE`;
12
+ export const UPLOAD_FB_AD_ASSET_REQUEST = `${prefix}/UPLOAD_ASSET_REQUEST`;
13
+ export const UPLOAD_FB_AD_ASSET_SUCCESS = `${prefix}/UPLOAD_ASSET_SUCCESS`;
14
+ export const UPLOAD_FB_AD_ASSET_FAILURE = `${prefix}/UPLOAD_ASSET_FAILURE`;
15
+ export const CREATE_FACEBOOK_AD_TEMPLATE_REQUEST = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_REQUEST`;
16
+ export const CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_SUCCESS`;
17
+ export const CREATE_FACEBOOK_AD_TEMPLATE_FAILURE = `${prefix}/CREATE_FACEBOOK_AD_TEMPLATE_FAILURE`;
12
18
 
19
+
20
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_REQUEST`;
21
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_SUCCESS`;
22
+ export const GET_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE = `${prefix}/EDIT/CREATE_FACEBOOK_AD_TEMPLATE_DETAILS_FAILURE`;
23
+
24
+ export const EDIT_FACEBOOK_AD_TEMPLATE_REQUEST = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_REQUEST`;
25
+ export const EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_SUCCESS`;
26
+ export const EDIT_FACEBOOK_AD_TEMPLATE_FAILURE = `${prefix}/Edit/EDIT_FACEBOOK_AD_TEMPLATE_FAILURE`;
27
+
28
+ export const CLEAR_FACEBOOK_AD_EDIT_RESPONSE_REQUEST = `${prefix}/Edit/CLEAR_EDIT_RESPONSE_REQUEST`;
29
+ export const CLEAR_FACEBOOK_AD_DATA = `${prefix}/Edit/CLEAR_DATA`;
30
+ export const CLEAR_FACEBOOK_AD_CREATE_RESPONSE_REQUEST = `${prefix}/Create/CLEAR_EDIT_RESPONSE_REQUEST`;
31
+ export const CLEAR_FACEBOOK_AD_ASSET = `${prefix}/CLEAR_ASSET`;
32
+
33
+
34
+ export const GET_ORG_OU_LIST_REQUEST = `${prefix}/GET_ORG_OU_LIST_REQUEST`;
35
+ export const GET_ORG_OU_LIST_SUCCESS = `${prefix}/GET_ORG_OU_LIST_SUCCESS`;
36
+ export const GET_ORG_OU_LIST_FAILURE = `${prefix}/GET_ORG_OU_LIST_FAILURE`;
13
37
  // marketing objectives constants
14
38
 
15
39
  export const VALUE_APP_INSTALLS = 'VALUE_APP_INSTALLS';