@capillarytech/creatives-library 7.6.6 → 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 +1 -1
- package/v2Containers/CapFacebookPreview/index.js +1 -0
- package/v2Containers/CreativesContainer/index.js +58 -9
- package/v2Containers/Facebook/Advertisement/index.js +38 -28
- package/v2Containers/Facebook/index.js +2 -1
- package/v2Containers/Templates/index.js +21 -15
- package/v2Containers/Templates/reducer.js +1 -1
package/package.json
CHANGED
|
@@ -227,11 +227,59 @@ class Creatives extends React.Component {
|
|
|
227
227
|
break;
|
|
228
228
|
}
|
|
229
229
|
case constants.FACEBOOK: {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
+
}
|
|
235
283
|
break;
|
|
236
284
|
}
|
|
237
285
|
case constants.LINE: {
|
|
@@ -387,12 +435,12 @@ class Creatives extends React.Component {
|
|
|
387
435
|
if (template.value) {
|
|
388
436
|
const FacebookAd = template.value.versions.base.content.FacebookAd;
|
|
389
437
|
const type = FacebookAd[0].type;
|
|
390
|
-
const {accountId
|
|
438
|
+
const {accountId} = this.props.Templates.selectedFacebookAccount || template.value || {};
|
|
391
439
|
const facebookCreativeList = [];
|
|
392
440
|
const fBContent = Object.values(FacebookAd);
|
|
393
441
|
fBContent.forEach((obj) => {
|
|
394
442
|
const data = cloneDeep(obj);
|
|
395
|
-
const {subType, linkDesc, imgSrc, webSiteLink} = obj;
|
|
443
|
+
const {subType, linkDesc, imgSrc, webSiteLink, video} = obj;
|
|
396
444
|
delete data.type;
|
|
397
445
|
delete data.linkDesc;
|
|
398
446
|
delete data.webSiteLink;
|
|
@@ -405,8 +453,9 @@ class Creatives extends React.Component {
|
|
|
405
453
|
delete data.imgSrc;
|
|
406
454
|
break;
|
|
407
455
|
case "VIDEO":
|
|
408
|
-
data.imageLink =
|
|
409
|
-
data.videoId =
|
|
456
|
+
data.imageLink = video.previewImageUrl;
|
|
457
|
+
data.videoId = video.videoId;
|
|
458
|
+
delete data.video;
|
|
410
459
|
break;
|
|
411
460
|
case "CAROUSEL":
|
|
412
461
|
break;
|
|
@@ -84,11 +84,12 @@ export const Advertisement = (props) => {
|
|
|
84
84
|
actions,
|
|
85
85
|
fbADData = {},
|
|
86
86
|
onCreateComplete,
|
|
87
|
-
templateData,
|
|
87
|
+
templateData = {},
|
|
88
88
|
params,
|
|
89
89
|
getFormSubscriptionData,
|
|
90
90
|
facebookTemplateData,
|
|
91
91
|
selectedMarketingObjective,
|
|
92
|
+
fbAdManger,
|
|
92
93
|
} = props;
|
|
93
94
|
const {
|
|
94
95
|
formatMessage,
|
|
@@ -131,7 +132,7 @@ export const Advertisement = (props) => {
|
|
|
131
132
|
orgUnitFacebookPageSettingsMap = {},
|
|
132
133
|
employeeAccessToken: accessToken = "",
|
|
133
134
|
accountId = "",
|
|
134
|
-
} = selectedFacebookAccount;
|
|
135
|
+
} = selectedFacebookAccount || {};
|
|
135
136
|
const { pageAccessToken, pageId: pId } = orgUnitFacebookPageSettingsMap[pageId] || {};
|
|
136
137
|
videoData = {
|
|
137
138
|
accessToken,
|
|
@@ -161,7 +162,7 @@ export const Advertisement = (props) => {
|
|
|
161
162
|
}, [paramObj.id]);
|
|
162
163
|
|
|
163
164
|
useEffect(() => {
|
|
164
|
-
if ((params && params.id) ||
|
|
165
|
+
if ((params && params.id) || templateData?.edit) {
|
|
165
166
|
const { FacebookAd = [], pageOrgUnitId: editPageId} = get(templateData, `versions.base.content`) || get(fbADData, `templateDetails.versions.base.content`) || {};
|
|
166
167
|
const editMessageTitle = (templateData || {}).name || get(fbADData, 'templateDetails.name');
|
|
167
168
|
const editFBContent = Object.values(FacebookAd);
|
|
@@ -365,7 +366,7 @@ export const Advertisement = (props) => {
|
|
|
365
366
|
name: messageTitle,
|
|
366
367
|
};
|
|
367
368
|
if (!isFullMode) {
|
|
368
|
-
finalResponse = {...finalResponse, selectedMarketingObjective};
|
|
369
|
+
finalResponse = {...finalResponse, selectedMarketingObjective, accountId};
|
|
369
370
|
}
|
|
370
371
|
return finalResponse;
|
|
371
372
|
}, [carouselData,
|
|
@@ -500,7 +501,7 @@ export const Advertisement = (props) => {
|
|
|
500
501
|
]
|
|
501
502
|
);
|
|
502
503
|
|
|
503
|
-
const isDisableContinue = () => messageTitle.trim() === "" || selectedAd === "";
|
|
504
|
+
const isDisableContinue = () => isFullMode ? (messageTitle.trim() === "" || selectedAd === "") : ( selectedAd === "");
|
|
504
505
|
|
|
505
506
|
const onClickContinue = useCallback(() => { updateStep('createFacebookAd'); }, [step]);
|
|
506
507
|
|
|
@@ -809,7 +810,7 @@ export const Advertisement = (props) => {
|
|
|
809
810
|
setPageId(value);
|
|
810
811
|
}, [pageId]);
|
|
811
812
|
|
|
812
|
-
const selectedFacebookAccount =
|
|
813
|
+
const selectedFacebookAccount = templateData?.edit ? templateData?.selectedFacebookAccount : facebookTemplateData?.selectedFacebookAccount;
|
|
813
814
|
const {orgUnitFacebookPageSettingsMap = {}, employeeAccessToken: accessToken = "", accountId = "" } = selectedFacebookAccount;
|
|
814
815
|
|
|
815
816
|
const getPageAccessOrgs = useCallback(() => {
|
|
@@ -836,7 +837,7 @@ export const Advertisement = (props) => {
|
|
|
836
837
|
const options = getPageAccessOrgs() || [];
|
|
837
838
|
const { data = {} } = fbADData.orgOuData || {};
|
|
838
839
|
const selectedPageName = Object.keys(data).find((key) => data[key] === pageId);
|
|
839
|
-
return ( (step === 'modeSelection' && isEmpty(templateData)) ?
|
|
840
|
+
return ( (step === 'modeSelection' && (isEmpty(templateData) || templateData?.mode === "create")) ?
|
|
840
841
|
( <CapSpin spinning={adSpinLoader} className="add-facebook-ad-section">
|
|
841
842
|
<div style={{ position: 'fixed', top: '25px', zIndex: 1}}>
|
|
842
843
|
<CapHeader
|
|
@@ -845,25 +846,27 @@ export const Advertisement = (props) => {
|
|
|
845
846
|
className={"cap-header-facebook-ad"}
|
|
846
847
|
/>
|
|
847
848
|
</div>
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
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
|
+
</>}
|
|
867
870
|
<CapHeading
|
|
868
871
|
type="h4"
|
|
869
872
|
style={{marginBottom: 11}}
|
|
@@ -887,8 +890,15 @@ export const Advertisement = (props) => {
|
|
|
887
890
|
</FbAdFooter>
|
|
888
891
|
</CapSpin> ) : (
|
|
889
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>}
|
|
890
900
|
<CapRow className="add-facebook-ad-section" >
|
|
891
|
-
<div className="cap-header-facebook-ad">
|
|
901
|
+
{isFullMode && <div className="cap-header-facebook-ad">
|
|
892
902
|
<CapHeading
|
|
893
903
|
type="h2"
|
|
894
904
|
className="truncate-text"
|
|
@@ -906,7 +916,7 @@ export const Advertisement = (props) => {
|
|
|
906
916
|
title={<FormattedMessage {...messages.creativesTemplatesEditName}/>}
|
|
907
917
|
onClick={onClickEditName}
|
|
908
918
|
/>}
|
|
909
|
-
</div>
|
|
919
|
+
</div>}
|
|
910
920
|
<CapColumn span={12}>
|
|
911
921
|
{isFullMode && <><CapHeading
|
|
912
922
|
type="h4"
|
|
@@ -280,7 +280,7 @@ const Facebook = (props) => {
|
|
|
280
280
|
fbAdManger={CREATIVE}
|
|
281
281
|
/>
|
|
282
282
|
) :
|
|
283
|
-
(!isFullMode &&
|
|
283
|
+
(!isFullMode && fbAdManger !== CREATIVE && messageStrategy === "DEFAULT" ) ?
|
|
284
284
|
(<div className={className}>
|
|
285
285
|
|
|
286
286
|
<div className="is-scrollable-section" >
|
|
@@ -418,6 +418,7 @@ const Facebook = (props) => {
|
|
|
418
418
|
messageStrategy={messageStrategy}
|
|
419
419
|
getFormSubscriptionData={getFormSubscriptionData}
|
|
420
420
|
selectedMarketingObjective={selectedMarketingObjective}
|
|
421
|
+
fbAdManger={fbAdManger}
|
|
421
422
|
/>
|
|
422
423
|
</div>
|
|
423
424
|
);
|
|
@@ -1808,9 +1808,10 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1808
1808
|
const isWechatChannel = channel === WECHAT;
|
|
1809
1809
|
const isMobilePushChannel = channel === MOBILE_PUSH;
|
|
1810
1810
|
const isLineChannel = channel === LINE;
|
|
1811
|
+
const isFacebookChannel = channel === FACEBOOK;
|
|
1811
1812
|
|
|
1812
1813
|
|
|
1813
|
-
if ((isWechatChannel || isMobilePushChannel || isLineChannel) && !isEmpty(weCrmAccounts)) {
|
|
1814
|
+
if ((isWechatChannel || isMobilePushChannel || isLineChannel) && !isEmpty(weCrmAccounts) && !isFacebookChannel ) {
|
|
1814
1815
|
forEach(weCrmAccounts, (account) => {
|
|
1815
1816
|
if ((isWechatChannel && account.configs && account.configs.is_wecrm_enabled) || isMobilePushChannel || isLineChannel) {
|
|
1816
1817
|
if (query.type === 'embedded' && (!query.module || (query.module && query.module !== 'library'))) {
|
|
@@ -1950,25 +1951,30 @@ export class Templates extends React.Component { // eslint-disable-line react/pr
|
|
|
1950
1951
|
render() {
|
|
1951
1952
|
const isFullMode = this.isFullMode();
|
|
1952
1953
|
const { activeMode, channel, wechatFilter, lineFilter } = this.state;
|
|
1953
|
-
let showForFacebook =
|
|
1954
|
+
let showForFacebook = false;
|
|
1954
1955
|
if (channel.toLowerCase() === FACEBOOK_CHANNEL) {
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
pageAccessToken
|
|
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;
|
|
1965
1971
|
}
|
|
1966
|
-
}
|
|
1967
|
-
|
|
1968
|
-
showForFacebook = false;
|
|
1972
|
+
} else {
|
|
1973
|
+
showForFacebook = true;
|
|
1969
1974
|
}
|
|
1970
1975
|
}
|
|
1971
1976
|
}
|
|
1977
|
+
|
|
1972
1978
|
const showForViber = (![VIBER_CHANNEL, FACEBOOK_CHANNEL].includes(channel.toLowerCase()) ||
|
|
1973
1979
|
(channel.toLowerCase() === VIBER_CHANNEL && !this.props.isFullMode && isEmpty(get(this.props, 'Templates.selectedViberAccount', {}))) ||
|
|
1974
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:
|
|
12
|
+
fetchingOrgLevelCampaignSettings: false,
|
|
13
13
|
templates: [],
|
|
14
14
|
deleteResponse: {},
|
|
15
15
|
deleteTemplateInProgress: false,
|