@capillarytech/creatives-library 7.6.6 → 7.6.8
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/index.js +3 -3
- package/package.json +1 -1
- package/v2Containers/CapFacebookPreview/index.js +1 -0
- package/v2Containers/CreativesContainer/index.js +56 -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/index.js
CHANGED
|
@@ -76,8 +76,8 @@ import viberSaga from './v2Containers/Viber/sagas';
|
|
|
76
76
|
import TemplatesV2 from './v2Containers/TemplatesV2/index';
|
|
77
77
|
|
|
78
78
|
import FacebookPreview from './v2Containers/CapFacebookPreview';
|
|
79
|
-
import
|
|
80
|
-
import
|
|
79
|
+
import facebookPreviewReducer from './v2Containers/CapFacebookPreview/reducer';
|
|
80
|
+
import facebookPreviewSaga from './v2Containers/CapFacebookPreview/sagas';
|
|
81
81
|
|
|
82
82
|
import CreativesContainer from './v2Containers/CreativesContainer';
|
|
83
83
|
import CreativesContainerReducer from './v2Containers/CreativesContainer/reducer';
|
|
@@ -105,7 +105,7 @@ const LineCreateContainer = {LineCreate, lineCreateReducer, lineCreateSaga};
|
|
|
105
105
|
const TemplatesV2Container = {TemplatesV2, templateReducer, templateSaga};
|
|
106
106
|
const FacebookContainer = {Facebook, facebookReducer, facebookSaga};
|
|
107
107
|
const ViberContainer = {Viber, viberReducer, viberSaga};
|
|
108
|
-
const FacebookPreviewContainer = { FacebookPreview,
|
|
108
|
+
const FacebookPreviewContainer = { FacebookPreview, facebookPreviewReducer, facebookPreviewSaga };
|
|
109
109
|
|
|
110
110
|
const GalleryContainer = {Gallery, galleryReducer, gallerySagas};
|
|
111
111
|
const FTPContainer = {FTP, FTPReducer, FTPSagas};
|
package/package.json
CHANGED
|
@@ -227,11 +227,57 @@ 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 { creativeType, selectedFacebookAccount } = 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
|
+
};
|
|
274
|
+
} else {
|
|
275
|
+
creativesTemplateData = {
|
|
276
|
+
selectedMarketingObjective: templateData.selectedMarketingObjective,
|
|
277
|
+
edit: true,
|
|
278
|
+
type: channel,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
235
281
|
break;
|
|
236
282
|
}
|
|
237
283
|
case constants.LINE: {
|
|
@@ -387,12 +433,12 @@ class Creatives extends React.Component {
|
|
|
387
433
|
if (template.value) {
|
|
388
434
|
const FacebookAd = template.value.versions.base.content.FacebookAd;
|
|
389
435
|
const type = FacebookAd[0].type;
|
|
390
|
-
const {accountId
|
|
436
|
+
const {accountId} = this.props.Templates.selectedFacebookAccount || template.value || {};
|
|
391
437
|
const facebookCreativeList = [];
|
|
392
438
|
const fBContent = Object.values(FacebookAd);
|
|
393
439
|
fBContent.forEach((obj) => {
|
|
394
440
|
const data = cloneDeep(obj);
|
|
395
|
-
const {subType, linkDesc, imgSrc, webSiteLink} = obj;
|
|
441
|
+
const {subType, linkDesc, imgSrc, webSiteLink, video} = obj;
|
|
396
442
|
delete data.type;
|
|
397
443
|
delete data.linkDesc;
|
|
398
444
|
delete data.webSiteLink;
|
|
@@ -405,8 +451,9 @@ class Creatives extends React.Component {
|
|
|
405
451
|
delete data.imgSrc;
|
|
406
452
|
break;
|
|
407
453
|
case "VIDEO":
|
|
408
|
-
data.imageLink =
|
|
409
|
-
data.videoId =
|
|
454
|
+
data.imageLink = video.previewImageUrl;
|
|
455
|
+
data.videoId = video.videoId;
|
|
456
|
+
delete data.video;
|
|
410
457
|
break;
|
|
411
458
|
case "CAROUSEL":
|
|
412
459
|
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,
|