@capillarytech/creatives-library 7.6.5 → 7.6.7

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "7.6.5",
4
+ "version": "7.6.7",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -212,6 +212,7 @@ export const CapFacebookPreview = (props) => {
212
212
  ...data.params.creative.object_story_spec,
213
213
  link_data: {
214
214
  description: linkDesc,
215
+ message: primaryText,
215
216
  link: webSiteLink,
216
217
  name: linkHeadLine,
217
218
  picture: imageData.imageSrc,
@@ -563,6 +563,7 @@ function SlideBoxContent(props) {
563
563
  getFormSubscriptionData={getFormData}
564
564
  messageStrategy={messageStrategy}
565
565
  fbAdManger={fbAdManger}
566
+ onSelectTemplate={onSelectTemplate}
566
567
  />
567
568
  )
568
569
  }
@@ -579,6 +580,7 @@ function SlideBoxContent(props) {
579
580
  id: templateData._id,
580
581
  }}
581
582
  getFormSubscriptionData={getFormData}
583
+ fbAdManger={fbAdManger}
582
584
  />
583
585
  )
584
586
  }
@@ -73,8 +73,12 @@ class Creatives extends React.Component {
73
73
  this.setState({templateNameExists: false});
74
74
  }
75
75
 
76
- onSelectTemplate = (template) => {
77
- this.setState({ slidBoxContent: 'editTemplate', templateData: template });
76
+ onSelectTemplate = (template, fbAdManger) => {
77
+ if (fbAdManger) {
78
+ this.setState({ slidBoxContent: 'editTemplate', templateData: template, fbAdManger});
79
+ } else {
80
+ this.setState({ slidBoxContent: 'editTemplate', templateData: template });
81
+ }
78
82
  };
79
83
  onPreviewTemplate = (template) => {
80
84
  const templateData = template;
@@ -223,11 +227,59 @@ class Creatives extends React.Component {
223
227
  break;
224
228
  }
225
229
  case constants.FACEBOOK: {
226
- creativesTemplateData = {
227
- selectedMarketingObjective: templateData.selectedMarketingObjective,
228
- edit: true,
229
- type: channel,
230
- };
230
+ if (templateData.fbContentType === "CREATIVE") {
231
+ const { accountId, creativeType } = templateData || {};
232
+ const fBContent = templateData.facebookCreativeList;
233
+ const facebookCreativeList = [];
234
+ fBContent.forEach((obj) => {
235
+ const data = cloneDeep(obj);
236
+ const {subType, linkDescription, imageLink, websiteLink, videoId} = obj;
237
+ delete data.linkDescription;
238
+ delete data.websiteLink;
239
+ data.linkDesc = linkDescription;
240
+ data.webSiteLink = websiteLink;
241
+ data.type = creativeType;
242
+ switch (subType) {
243
+ case "IMAGE":
244
+ data.imgSrc = imageLink;
245
+ delete data.imageLink;
246
+ break;
247
+ case "VIDEO":
248
+ data.video = {
249
+ previewImageUrl: imageLink,
250
+ videoId,
251
+ videoSrc: "",
252
+ videoName: "",
253
+ };
254
+ delete data.imageLink;
255
+ break;
256
+ default:
257
+ break;
258
+ }
259
+ facebookCreativeList.push(data);
260
+ });
261
+ creativesTemplateData = {
262
+ versions: {
263
+ base: {
264
+ content: {
265
+ FacebookAd: {...facebookCreativeList},
266
+ pageOrgUnitId: this.props.orgUnitId,
267
+ },
268
+ },
269
+ },
270
+ type: "FACEBOOK",
271
+ edit: true,
272
+ selectedFacebookAccount: {
273
+ accountId,
274
+ },
275
+ };
276
+ }else {
277
+ creativesTemplateData = {
278
+ selectedMarketingObjective: templateData.selectedMarketingObjective,
279
+ edit: true,
280
+ type: channel,
281
+ };
282
+ }
231
283
  break;
232
284
  }
233
285
  case constants.LINE: {
@@ -276,25 +328,6 @@ class Creatives extends React.Component {
276
328
  };
277
329
  break;
278
330
  }
279
- case constants.FACEBOOK: {
280
- return {
281
- fbContentType: "CREATIVE",
282
- creativeType: "IMAGE",
283
- facebookCreativeList: [{
284
- subType: "IMAGE",
285
- displayLink: "www.google.com",
286
- callToAction: "callToAction",
287
- primaryText: "primaryText",
288
- linkDescription: "linkDescription",
289
- linkHeadLine: "linkHeadLine",
290
- websiteLink: "websiteLink",
291
- imageLink: "www.kuch_bhi_link.com",
292
- pageId: "1234",
293
- }],
294
- channel: "FACEBOOK",
295
- accountId: "1310132286042455",
296
- };
297
- }
298
331
  default:
299
332
  break;
300
333
  }
@@ -398,7 +431,49 @@ class Creatives extends React.Component {
398
431
  };
399
432
  }
400
433
  break;
401
- case constants.FACEBOOK:
434
+ case constants.FACEBOOK: {
435
+ if (template.value) {
436
+ const FacebookAd = template.value.versions.base.content.FacebookAd;
437
+ const type = FacebookAd[0].type;
438
+ const {accountId} = this.props.Templates.selectedFacebookAccount || template.value || {};
439
+ const facebookCreativeList = [];
440
+ const fBContent = Object.values(FacebookAd);
441
+ fBContent.forEach((obj) => {
442
+ const data = cloneDeep(obj);
443
+ const {subType, linkDesc, imgSrc, webSiteLink, video} = obj;
444
+ delete data.type;
445
+ delete data.linkDesc;
446
+ delete data.webSiteLink;
447
+ data.linkDescription = linkDesc;
448
+ data.websiteLink = webSiteLink;
449
+
450
+ switch (subType) {
451
+ case "IMAGE":
452
+ data.imageLink = imgSrc;
453
+ delete data.imgSrc;
454
+ break;
455
+ case "VIDEO":
456
+ data.imageLink = video.previewImageUrl;
457
+ data.videoId = video.videoId;
458
+ delete data.video;
459
+ break;
460
+ case "CAROUSEL":
461
+ break;
462
+ default:
463
+ break;
464
+ }
465
+ facebookCreativeList.push(data);
466
+ });
467
+ templateData = {
468
+ fbContentType: "CREATIVE",
469
+ creativeType: type,
470
+ facebookCreativeList,
471
+ channel: "FACEBOOK",
472
+ accountId,
473
+ selectedMarketingObjective: template.value.selectedMarketingObjective,
474
+ };
475
+ }
476
+ }
402
477
  break;
403
478
  default:
404
479
  break;
@@ -3,6 +3,8 @@ import React, { useState, useEffect, useCallback} from "react";
3
3
  import { injectIntl, FormattedMessage, intlShape } from 'react-intl';
4
4
  import { isUrl } from '../../Line/Container/Wrapper/utils';
5
5
  import get from 'lodash/get';
6
+ import isEmpty from 'lodash/isEmpty';
7
+
6
8
  import {
7
9
  CapInput,
8
10
  CapRadioCard,
@@ -82,10 +84,12 @@ export const Advertisement = (props) => {
82
84
  actions,
83
85
  fbADData = {},
84
86
  onCreateComplete,
85
- templateData,
87
+ templateData = {},
86
88
  params,
87
89
  getFormSubscriptionData,
88
90
  facebookTemplateData,
91
+ selectedMarketingObjective,
92
+ fbAdManger,
89
93
  } = props;
90
94
  const {
91
95
  formatMessage,
@@ -128,7 +132,7 @@ export const Advertisement = (props) => {
128
132
  orgUnitFacebookPageSettingsMap = {},
129
133
  employeeAccessToken: accessToken = "",
130
134
  accountId = "",
131
- } = selectedFacebookAccount;
135
+ } = selectedFacebookAccount || {};
132
136
  const { pageAccessToken, pageId: pId } = orgUnitFacebookPageSettingsMap[pageId] || {};
133
137
  videoData = {
134
138
  accessToken,
@@ -158,7 +162,7 @@ export const Advertisement = (props) => {
158
162
  }, [paramObj.id]);
159
163
 
160
164
  useEffect(() => {
161
- if ((params && params.id) || (templateData || {}).edit) {
165
+ if ((params && params.id) || templateData?.edit) {
162
166
  const { FacebookAd = [], pageOrgUnitId: editPageId} = get(templateData, `versions.base.content`) || get(fbADData, `templateDetails.versions.base.content`) || {};
163
167
  const editMessageTitle = (templateData || {}).name || get(fbADData, 'templateDetails.name');
164
168
  const editFBContent = Object.values(FacebookAd);
@@ -349,8 +353,7 @@ export const Advertisement = (props) => {
349
353
  }
350
354
  messageData.push(data);
351
355
  });
352
-
353
- return {
356
+ let finalResponse = {
354
357
  versions: {
355
358
  base: {
356
359
  content: {
@@ -362,12 +365,17 @@ export const Advertisement = (props) => {
362
365
  type: "FACEBOOK",
363
366
  name: messageTitle,
364
367
  };
368
+ if (!isFullMode) {
369
+ finalResponse = {...finalResponse, selectedMarketingObjective, accountId};
370
+ }
371
+ return finalResponse;
365
372
  }, [carouselData,
366
373
  pageId,
367
374
  messageTitle,
368
375
  primaryText,
369
376
  callToAction,
370
- displayLink]);
377
+ displayLink,
378
+ selectedMarketingObjective]);
371
379
 
372
380
  const onCreateFacebookAd = useCallback( () => {
373
381
  actions.createTemplate(
@@ -493,7 +501,7 @@ export const Advertisement = (props) => {
493
501
  ]
494
502
  );
495
503
 
496
- const isDisableContinue = () => messageTitle.trim() === "" || selectedAd === "";
504
+ const isDisableContinue = () => isFullMode ? (messageTitle.trim() === "" || selectedAd === "") : ( selectedAd === "");
497
505
 
498
506
  const onClickContinue = useCallback(() => { updateStep('createFacebookAd'); }, [step]);
499
507
 
@@ -802,7 +810,7 @@ export const Advertisement = (props) => {
802
810
  setPageId(value);
803
811
  }, [pageId]);
804
812
 
805
- const selectedFacebookAccount = get(facebookTemplateData, 'selectedFacebookAccount', {});
813
+ const selectedFacebookAccount = templateData?.edit ? templateData?.selectedFacebookAccount : facebookTemplateData?.selectedFacebookAccount;
806
814
  const {orgUnitFacebookPageSettingsMap = {}, employeeAccessToken: accessToken = "", accountId = "" } = selectedFacebookAccount;
807
815
 
808
816
  const getPageAccessOrgs = useCallback(() => {
@@ -829,7 +837,7 @@ export const Advertisement = (props) => {
829
837
  const options = getPageAccessOrgs() || [];
830
838
  const { data = {} } = fbADData.orgOuData || {};
831
839
  const selectedPageName = Object.keys(data).find((key) => data[key] === pageId);
832
- return ( (step === 'modeSelection') ?
840
+ return ( (step === 'modeSelection' && (isEmpty(templateData) || templateData?.mode === "create")) ?
833
841
  ( <CapSpin spinning={adSpinLoader} className="add-facebook-ad-section">
834
842
  <div style={{ position: 'fixed', top: '25px', zIndex: 1}}>
835
843
  <CapHeader
@@ -838,25 +846,27 @@ export const Advertisement = (props) => {
838
846
  className={"cap-header-facebook-ad"}
839
847
  />
840
848
  </div>
841
- <CapInput
842
- id={`fbAd_input`}
843
- onChange={onTextTitleChange}
844
- className="text-template-title"
845
- defaultValue={messageTitle || ''}
846
- value={messageTitle || ''}
847
- style={{marginBottom: 27, width: '762px'}}
848
- size="default"
849
- label={formatMessage(messages.creativeName)}
850
- />
851
- {isFullMode && <CapSelect
852
- label={formatMessage(messages.facebookPage)}
853
- key={"select-facebook-page"}
854
- onChange={onChangeFacebookPage}
855
- options={options}
856
- defaultValue={(options[0] || {} ).value}
857
- value={pageId || (options[0] || {} ).value}
858
- style={{marginBottom: 27, width: '372px'}}
859
- ></CapSelect>}
849
+ {isFullMode && <>
850
+ <CapInput
851
+ id={`fbAd_input`}
852
+ onChange={onTextTitleChange}
853
+ className="text-template-title"
854
+ defaultValue={messageTitle || ''}
855
+ value={messageTitle || ''}
856
+ style={{marginBottom: 27, width: '762px'}}
857
+ size="default"
858
+ label={formatMessage(messages.creativeName)}
859
+ />
860
+ <CapSelect
861
+ label={formatMessage(messages.facebookPage)}
862
+ key={"select-facebook-page"}
863
+ onChange={onChangeFacebookPage}
864
+ options={options}
865
+ defaultValue={(options[0] || {} ).value}
866
+ value={pageId || (options[0] || {} ).value}
867
+ style={{marginBottom: 27, width: '372px'}}
868
+ ></CapSelect>
869
+ </>}
860
870
  <CapHeading
861
871
  type="h4"
862
872
  style={{marginBottom: 11}}
@@ -880,8 +890,15 @@ export const Advertisement = (props) => {
880
890
  </FbAdFooter>
881
891
  </CapSpin> ) : (
882
892
  <CapSpin spinning={spinLoader}>
893
+ {!isFullMode && isEmpty(templateData) && <div style={{ position: 'fixed', top: '25px', zIndex: 1}}>
894
+ <CapHeader
895
+ inline
896
+ title={formatMessage(messages.newFacebookCreatives)}
897
+ className={"cap-header-facebook-ad"}
898
+ />
899
+ </div>}
883
900
  <CapRow className="add-facebook-ad-section" >
884
- <div className="cap-header-facebook-ad">
901
+ {isFullMode && <div className="cap-header-facebook-ad">
885
902
  <CapHeading
886
903
  type="h2"
887
904
  className="truncate-text"
@@ -899,7 +916,7 @@ export const Advertisement = (props) => {
899
916
  title={<FormattedMessage {...messages.creativesTemplatesEditName}/>}
900
917
  onClick={onClickEditName}
901
918
  />}
902
- </div>
919
+ </div>}
903
920
  <CapColumn span={12}>
904
921
  {isFullMode && <><CapHeading
905
922
  type="h4"
@@ -974,6 +991,7 @@ Advertisement.propTypes = {
974
991
  facebookTemplateData: PropTypes.object,
975
992
  templateData: PropTypes.object,
976
993
  params: PropTypes.object,
994
+ selectedMarketingObjective: PropTypes.any,
977
995
 
978
996
  };
979
997
 
@@ -280,7 +280,7 @@ const Facebook = (props) => {
280
280
  fbAdManger={CREATIVE}
281
281
  />
282
282
  ) :
283
- (!isFullMode && messageStrategy !== "X_ENGAGE" && fbAdManger !== CREATIVE) ?
283
+ (!isFullMode && fbAdManger !== CREATIVE && messageStrategy === "DEFAULT" ) ?
284
284
  (<div className={className}>
285
285
 
286
286
  <div className="is-scrollable-section" >
@@ -371,7 +371,7 @@ const Facebook = (props) => {
371
371
  <CapCustomCard
372
372
  type="Facebook"
373
373
  FBDynamicComponent={() => (
374
- <CapIcon
374
+ <CapIcon
375
375
  size="l"
376
376
  type="scenery"
377
377
  className="facebook-dynamic-content"
@@ -382,7 +382,7 @@ const Facebook = (props) => {
382
382
  <CapColumn span={16}>
383
383
  <ul className="parameter-list">
384
384
  {adSetParameters.map((parameter, index) => (
385
- <li key={parameter} className="parameter-list-item">
385
+ <li key={parameter} className="parameter-list-item">
386
386
  <CapLabel type="label2" className="parameter-index">
387
387
  {index + 1}
388
388
  </CapLabel>
@@ -417,6 +417,8 @@ const Facebook = (props) => {
417
417
  facebookTemplateData={facebookTemplateData}
418
418
  messageStrategy={messageStrategy}
419
419
  getFormSubscriptionData={getFormSubscriptionData}
420
+ selectedMarketingObjective={selectedMarketingObjective}
421
+ fbAdManger={fbAdManger}
420
422
  />
421
423
  </div>
422
424
  );
@@ -442,7 +444,6 @@ Facebook.propTypes = {
442
444
 
443
445
  Facebook.defaultProps = {
444
446
  marketingObjectiveList: [""],
445
-
446
447
  };
447
448
 
448
449
  const mapStateToProps = createStructuredSelector({
@@ -1143,7 +1143,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1143
1143
  if (this.isEnabledInLibraryModule("callCreateFromProps")) {
1144
1144
  if (this.props.fbAdManger === "CREATIVE") {
1145
1145
  this.props.createNew(this.props.fbAdManger);
1146
- } else{
1146
+ } else {
1147
1147
  this.props.createNew();
1148
1148
  }
1149
1149
  } else if (ev.key && (ev.key.toLowerCase() === "text" || ev.key.toLowerCase() === "image")) {
@@ -1416,7 +1416,7 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1416
1416
  }
1417
1417
  }
1418
1418
  if (this.isEnabledInLibraryModule("callSelectFromProps")) {
1419
- this.props.onSelectTemplate(id);
1419
+ this.props.onSelectTemplate(this.selectTemplate(id), this.props.fbAdManger);
1420
1420
  } else {
1421
1421
  if (this.state.channel.toLowerCase() === 'ebill') {
1422
1422
  pathName = `/ebill/edit/${id}`;
@@ -1428,6 +1428,9 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1428
1428
  }
1429
1429
  }
1430
1430
 
1431
+ selectTemplate = (id) => find(this.props.TemplatesList, {_id: id})
1432
+
1433
+
1431
1434
  handlePreviewClick(template, modeType) {
1432
1435
  this.togglePreview();
1433
1436
  const templateInfo = cloneDeep(template);
@@ -1805,9 +1808,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1805
1808
  const isWechatChannel = channel === WECHAT;
1806
1809
  const isMobilePushChannel = channel === MOBILE_PUSH;
1807
1810
  const isLineChannel = channel === LINE;
1811
+ const isFacebookChannel = channel === FACEBOOK;
1808
1812
 
1809
1813
 
1810
- if ((isWechatChannel || isMobilePushChannel || isLineChannel) && !isEmpty(weCrmAccounts)) {
1814
+ if ((isWechatChannel || isMobilePushChannel || isLineChannel) && !isEmpty(weCrmAccounts) && !isFacebookChannel ) {
1811
1815
  forEach(weCrmAccounts, (account) => {
1812
1816
  if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || isMobilePushChannel || isLineChannel) {
1813
1817
  if (query.type === 'embedded' && (!query.module || (query.module && query.module !== 'library'))) {
@@ -1947,25 +1951,30 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
1947
1951
  render() {
1948
1952
  const isFullMode = this.isFullMode();
1949
1953
  const { activeMode, channel, wechatFilter, lineFilter } = this.state;
1950
- let showForFacebook = true;
1954
+ let showForFacebook = false;
1951
1955
  if (channel.toLowerCase() === FACEBOOK_CHANNEL) {
1952
- if (isEmpty(this.props.Templates.campaignSettings)) {
1953
- showForFacebook = false;
1954
- }
1955
- const fbSetting = get(this.props.Templates, 'campaignSettings.accountSettings.socialAccountSettings.facebookAccountSettings', []);
1956
- const { orgUnitFacebookPageSettingsMap = {} } = fbSetting[0] || {};
1957
- let pageAccessToken = false;
1958
- if (!isEmpty(orgUnitFacebookPageSettingsMap)) {
1959
- Object.values(orgUnitFacebookPageSettingsMap).forEach((obj) => {
1960
- if (obj.pageAccessToken) {
1961
- pageAccessToken = true;
1956
+ const campaignSettings = this.props.Templates.campaignSettings
1957
+ if (campaignSettings && isEmpty(campaignSettings?.accountSettings)) {
1958
+ showForFacebook = true;
1959
+ } else if(!isEmpty(campaignSettings?.accountSettings)) {
1960
+ const fbSetting = get(this.props.Templates, 'campaignSettings.accountSettings.socialAccountSettings.facebookAccountSettings', []);
1961
+ const { orgUnitFacebookPageSettingsMap = {} } = fbSetting[0] || {};
1962
+ let pageAccessToken = false;
1963
+ if (!isEmpty(orgUnitFacebookPageSettingsMap)) {
1964
+ Object.values(orgUnitFacebookPageSettingsMap).forEach((obj) => {
1965
+ if (obj.pageAccessToken) {
1966
+ pageAccessToken = true;
1967
+ }
1968
+ });
1969
+ if (!pageAccessToken) {
1970
+ showForFacebook = true;
1962
1971
  }
1963
- });
1964
- if (!pageAccessToken) {
1965
- showForFacebook = false;
1972
+ } else {
1973
+ showForFacebook = true;
1966
1974
  }
1967
1975
  }
1968
1976
  }
1977
+
1969
1978
  const showForViber = (![VIBER_CHANNEL, FACEBOOK_CHANNEL].includes(channel.toLowerCase()) ||
1970
1979
  (channel.toLowerCase() === VIBER_CHANNEL && !this.props.isFullMode && isEmpty(get(this.props, 'Templates.selectedViberAccount', {}))) ||
1971
1980
  (channel.toLowerCase() === FACEBOOK_CHANNEL && showForFacebook)
@@ -9,7 +9,7 @@ import * as types from './constants';
9
9
 
10
10
  const initialState = fromJS({
11
11
  getAllTemplatesInProgress: false,
12
- fetchingOrgLevelCampaignSettings: true,
12
+ fetchingOrgLevelCampaignSettings: false,
13
13
  templates: [],
14
14
  deleteResponse: {},
15
15
  deleteTemplateInProgress: false,
@@ -208,7 +208,7 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
208
208
  router={this.props.router}
209
209
  isFullMode={this.props.isFullMode}
210
210
  createNew={this.props.createNew}
211
- onSelectTemplate={(id) => this.props.onSelectTemplate(this.selectTemplate(id))}
211
+ onSelectTemplate={this.props.onSelectTemplate}
212
212
  renderNewCardGrid={this.getTemplateDataForGrid}
213
213
  handlePeviewTemplate={this.props.handlePeviewTemplate}
214
214
  messageStrategy={this.props.messageStrategy}