@capillarytech/creatives-library 7.5.5 → 7.5.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 +44 -8
- package/v2Containers/CapFacebookPreview/messages.js +8 -0
- package/v2Containers/CapFacebookPreview/reducer.js +12 -4
- package/v2Containers/CapFacebookPreview/sagas.js +9 -9
- package/v2Containers/Facebook/Advertisement/index.js +0 -2
- package/v2Containers/Facebook/index.js +3 -1
- package/v2Containers/TemplatesV2/index.js +1 -1
package/package.json
CHANGED
|
@@ -20,6 +20,8 @@ import {
|
|
|
20
20
|
CapImage,
|
|
21
21
|
CapSpin,
|
|
22
22
|
CapIcon,
|
|
23
|
+
CapNotification,
|
|
24
|
+
CapTooltip,
|
|
23
25
|
} from "@capillarytech/cap-ui-library";
|
|
24
26
|
import facebookEmptyPlaceholder from '../../assets/facebookEmptyPlaceholder.png';
|
|
25
27
|
import {
|
|
@@ -48,9 +50,10 @@ export const CapFacebookPreview = (props) => {
|
|
|
48
50
|
formatMessage,
|
|
49
51
|
} = intl || {};
|
|
50
52
|
const [adPreviewFormat, setAdPreviewFormat] = useState("DESKTOP_FEED_STANDARD");
|
|
53
|
+
const [disableAfterPreviewGenerate, setDisableAfterPreviewGenerate] = useState(false);
|
|
51
54
|
const [random, setRandom] = useState(0);
|
|
52
55
|
const {pageAccessToken, pageId} = orgUnitFacebookPageSettingsMap;
|
|
53
|
-
const {previewIframe = "", isFetchingPreview = false} = facebookPreviewData;
|
|
56
|
+
const {previewIframe = "", isFetchingPreview = false, previewIframeError = ""} = facebookPreviewData;
|
|
54
57
|
const facebookAdOptions = [
|
|
55
58
|
{
|
|
56
59
|
value: "DESKTOP_FEED_STANDARD",
|
|
@@ -271,11 +274,14 @@ export const CapFacebookPreview = (props) => {
|
|
|
271
274
|
};
|
|
272
275
|
facebookPreviewActions.getCarouselPreview(data);
|
|
273
276
|
}
|
|
277
|
+
setDisableAfterPreviewGenerate(true);
|
|
274
278
|
};
|
|
279
|
+
|
|
275
280
|
const resetIframe = () => {
|
|
276
281
|
const r = random + 1;
|
|
277
282
|
setRandom(r);
|
|
278
283
|
};
|
|
284
|
+
|
|
279
285
|
const getIframe = (iframe) => {
|
|
280
286
|
const divTag = document.createElement('div');
|
|
281
287
|
divTag.innerHTML = iframe;
|
|
@@ -294,6 +300,7 @@ export const CapFacebookPreview = (props) => {
|
|
|
294
300
|
/>
|
|
295
301
|
</>);
|
|
296
302
|
};
|
|
303
|
+
|
|
297
304
|
const showRefreshButton = () => {
|
|
298
305
|
let isRefresh = false;
|
|
299
306
|
props.previewData.forEach((obj) => {
|
|
@@ -305,9 +312,28 @@ export const CapFacebookPreview = (props) => {
|
|
|
305
312
|
return isRefresh && previewIframe !== "";
|
|
306
313
|
};
|
|
307
314
|
const isRefreshButton = showRefreshButton();
|
|
315
|
+
|
|
308
316
|
useEffect(() => {
|
|
309
317
|
facebookPreviewActions.clearPreview();
|
|
310
318
|
}, []);
|
|
319
|
+
|
|
320
|
+
useEffect(() => {
|
|
321
|
+
if (disableAfterPreviewGenerate) {
|
|
322
|
+
setDisableAfterPreviewGenerate(false);
|
|
323
|
+
}
|
|
324
|
+
}, [previewData,
|
|
325
|
+
primaryText,
|
|
326
|
+
callToAction]);
|
|
327
|
+
|
|
328
|
+
useEffect(() => {
|
|
329
|
+
if (previewIframeError) {
|
|
330
|
+
CapNotification.error({
|
|
331
|
+
message: formatMessage(messages.generatePreviewError),
|
|
332
|
+
});
|
|
333
|
+
setDisableAfterPreviewGenerate(false);
|
|
334
|
+
}
|
|
335
|
+
}, [previewIframeError]);
|
|
336
|
+
|
|
311
337
|
return (
|
|
312
338
|
<CapSpin spinning={isFetchingPreview}>
|
|
313
339
|
<div style={{display: 'inline-block'}}>
|
|
@@ -328,13 +354,23 @@ export const CapFacebookPreview = (props) => {
|
|
|
328
354
|
{formatMessage(messages.previewAdDesc)}
|
|
329
355
|
</CapLabel>
|
|
330
356
|
<div style={{marginBottom: 16}}>
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
357
|
+
{(disablePreviewButton || disableAfterPreviewGenerate) ?
|
|
358
|
+
<CapTooltip title={formatMessage(messages.generatePreviewDisableToolTip)}>
|
|
359
|
+
<div className="button-disabled-tooltip-wrapper">
|
|
360
|
+
<CapButton
|
|
361
|
+
type="secondary"
|
|
362
|
+
disabled
|
|
363
|
+
>
|
|
364
|
+
<FormattedMessage {...messages.generatePreview} />
|
|
365
|
+
</CapButton>
|
|
366
|
+
</div>
|
|
367
|
+
</CapTooltip> :
|
|
368
|
+
<CapButton
|
|
369
|
+
type="secondary"
|
|
370
|
+
onClick={generatePreview}
|
|
371
|
+
>
|
|
372
|
+
<FormattedMessage {...messages.generatePreview} />
|
|
373
|
+
</CapButton>}
|
|
338
374
|
{isRefreshButton && (<CapButton
|
|
339
375
|
onClick={resetIframe}
|
|
340
376
|
type="secondary"
|
|
@@ -135,4 +135,12 @@ export default defineMessages({
|
|
|
135
135
|
id: `${messagePrefix}.videoNotePreview`,
|
|
136
136
|
defaultMessage: 'Facebook may take time to upload the video. Please try Refreshing.',
|
|
137
137
|
},
|
|
138
|
+
generatePreviewError: {
|
|
139
|
+
id: `${messagePrefix}.generatePreviewError`,
|
|
140
|
+
defaultMessage: 'Error in generating preview',
|
|
141
|
+
},
|
|
142
|
+
generatePreviewDisableToolTip: {
|
|
143
|
+
id: `${messagePrefix}.generatePreviewDisableToolTip`,
|
|
144
|
+
defaultMessage: 'Looks like either all the mandatory fields are not filled or there is no new change',
|
|
145
|
+
},
|
|
138
146
|
});
|
|
@@ -11,6 +11,7 @@ import * as types from './constants';
|
|
|
11
11
|
const initialState = fromJS({
|
|
12
12
|
isFetchingPreview: false,
|
|
13
13
|
previewIframe: "",
|
|
14
|
+
previewIframeError: "",
|
|
14
15
|
});
|
|
15
16
|
|
|
16
17
|
function capFacebookPreviewReducer(state = initialState, action) {
|
|
@@ -18,17 +19,24 @@ function capFacebookPreviewReducer(state = initialState, action) {
|
|
|
18
19
|
case types.GENERATE_IMAGE_PREVIEW_REQUEST:
|
|
19
20
|
case types.GENERATE_VIDEO_PREVIEW_REQUEST:
|
|
20
21
|
case types.GENERATE_CAROUSEL_PREVIEW_REQUEST:
|
|
21
|
-
return state.set('isFetchingPreview', true)
|
|
22
|
+
return state.set('isFetchingPreview', true)
|
|
23
|
+
.set('previewIframe', "")
|
|
24
|
+
.set("previewIframeError", "");
|
|
22
25
|
case types.GENERATE_IMAGE_PREVIEW_SUCCESS:
|
|
23
26
|
case types.GENERATE_VIDEO_PREVIEW_SUCCESS:
|
|
24
27
|
case types.GENERATE_CAROUSEL_PREVIEW_SUCCESS:
|
|
25
|
-
return state.set('isFetchingPreview', false)
|
|
28
|
+
return state.set('isFetchingPreview', false)
|
|
29
|
+
.set('previewIframe', get(action, 'payload.fbPreview[0].body', ""));
|
|
26
30
|
case types.GENERATE_IMAGE_PREVIEW_FAILURE:
|
|
27
31
|
case types.GENERATE_VIDEO_PREVIEW_FAILURE:
|
|
28
32
|
case types.GENERATE_CAROUSEL_PREVIEW_FAILURE:
|
|
29
|
-
return state.set('isFetchingPreview', false)
|
|
33
|
+
return state.set('isFetchingPreview', false)
|
|
34
|
+
.set('previewIframe', "")
|
|
35
|
+
.set("previewIframeError", get(action, 'payload.message', ""));
|
|
30
36
|
case types.CLEAR_PREVIEW:
|
|
31
|
-
return state.set('isFetchingPreview', false)
|
|
37
|
+
return state.set('isFetchingPreview', false)
|
|
38
|
+
.set('previewIframe', "")
|
|
39
|
+
.set("previewIframeError", "");
|
|
32
40
|
default:
|
|
33
41
|
return state;
|
|
34
42
|
}
|
|
@@ -6,11 +6,11 @@ import * as type from './constants';
|
|
|
6
6
|
export function* getImageFacebookPreview(previewData) {
|
|
7
7
|
try {
|
|
8
8
|
const response = yield call(Api.getImageFacebookPreview, previewData );
|
|
9
|
-
const {
|
|
10
|
-
if (
|
|
9
|
+
const { status, response: responsePreview } = response;
|
|
10
|
+
if (status && status.isError) {
|
|
11
11
|
yield put({
|
|
12
12
|
type: type.GENERATE_IMAGE_PREVIEW_FAILURE,
|
|
13
|
-
payload:
|
|
13
|
+
payload: status,
|
|
14
14
|
});
|
|
15
15
|
} else {
|
|
16
16
|
yield put({
|
|
@@ -29,11 +29,11 @@ export function* getImageFacebookPreview(previewData) {
|
|
|
29
29
|
export function* getVideoFacebookPreview(previewData) {
|
|
30
30
|
try {
|
|
31
31
|
const response = yield call(Api.getVideoFacebookPreview, previewData);
|
|
32
|
-
const {
|
|
33
|
-
if (
|
|
32
|
+
const { status, response: responsePreview } = response;
|
|
33
|
+
if (status && status.isError) {
|
|
34
34
|
yield put({
|
|
35
35
|
type: type.GENERATE_VIDEO_PREVIEW_FAILURE,
|
|
36
|
-
payload:
|
|
36
|
+
payload: status,
|
|
37
37
|
});
|
|
38
38
|
} else {
|
|
39
39
|
yield put({
|
|
@@ -52,11 +52,11 @@ export function* getVideoFacebookPreview(previewData) {
|
|
|
52
52
|
export function* getCarouselFacebookPreview(previewData) {
|
|
53
53
|
try {
|
|
54
54
|
const response = yield call(Api.getCarouselFacebookPreview, previewData);
|
|
55
|
-
const {
|
|
56
|
-
if (
|
|
55
|
+
const { status, response: responsePreview } = response;
|
|
56
|
+
if (status && status.isError) {
|
|
57
57
|
yield put({
|
|
58
58
|
type: type.GENERATE_CAROUSEL_PREVIEW_FAILURE,
|
|
59
|
-
payload:
|
|
59
|
+
payload: status,
|
|
60
60
|
});
|
|
61
61
|
} else {
|
|
62
62
|
yield put({
|
|
@@ -107,7 +107,6 @@ export const Advertisement = (props) => {
|
|
|
107
107
|
const [displayLink, setDisplayLink] = useState('');
|
|
108
108
|
const [callToAction, setCallToAction] = useState("NO_CALL_TO_ACTION");
|
|
109
109
|
const [callToActionError, setCallToActionError] = useState(false);
|
|
110
|
-
|
|
111
110
|
const [messageTitle, updateMessageTitle] = useState('');
|
|
112
111
|
const [step, updateStep] = useState('modeSelection');
|
|
113
112
|
const [activeIndex, updateActiveIndex] = useState(`${defaultActiveIndex}`);
|
|
@@ -116,7 +115,6 @@ export const Advertisement = (props) => {
|
|
|
116
115
|
const [editNameState, setEditNameState] = useState(false);
|
|
117
116
|
const isCarouselSelectedAd = selectedAd === CAROUSEL;
|
|
118
117
|
const isImgVideoSelectedAd = selectedAd === IMAGE_VIDEO;
|
|
119
|
-
|
|
120
118
|
const activeCarouselData = carouselData[activeIndex];
|
|
121
119
|
|
|
122
120
|
const uploadFbAdAsset = useCallback(( file,
|
|
@@ -186,7 +186,7 @@ const Facebook = (props) => {
|
|
|
186
186
|
} = props;
|
|
187
187
|
const {
|
|
188
188
|
selectedMarketingObjective: fbMarketingObjectiveValue = VALUE_REACH,
|
|
189
|
-
} = templateData;
|
|
189
|
+
} = templateData || {};
|
|
190
190
|
const [isDrawerVisible, setDrawerVisibility] = useState(false);
|
|
191
191
|
const [selectedMarketingObjective, setMarketingObjective] = useState(socialObjective || fbMarketingObjectiveValue);
|
|
192
192
|
|
|
@@ -358,6 +358,7 @@ Facebook.propTypes = {
|
|
|
358
358
|
templateData: PropTypes.object,
|
|
359
359
|
cap: PropTypes.object,
|
|
360
360
|
messageDetails: PropTypes.object,
|
|
361
|
+
params: PropTypes.object,
|
|
361
362
|
onFacebookSubmit: PropTypes.func,
|
|
362
363
|
marketingObjectiveList: PropTypes.arrayOf(PropTypes.string),
|
|
363
364
|
facebookActions: PropTypes.func,
|
|
@@ -365,6 +366,7 @@ Facebook.propTypes = {
|
|
|
365
366
|
isFullMode: PropTypes.boolean,
|
|
366
367
|
fbADData: PropTypes.object,
|
|
367
368
|
onCreateComplete: PropTypes.func,
|
|
369
|
+
facebookTemplateData: PropTypes.object,
|
|
368
370
|
};
|
|
369
371
|
|
|
370
372
|
Facebook.defaultProps = {
|
|
@@ -188,7 +188,7 @@ export class TemplatesV2 extends React.Component { // eslint-disable-line react/
|
|
|
188
188
|
case 'facebook':
|
|
189
189
|
return this.getFacebookComponent();
|
|
190
190
|
default:
|
|
191
|
-
|
|
191
|
+
break;
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
const location = {pathname: `/${channel}`, search: '', query};
|