@capillarytech/creatives-library 7.5.6 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@capillarytech/creatives-library",
3
3
  "author": "meharaj",
4
- "version": "7.5.6",
4
+ "version": "7.5.7",
5
5
  "description": "Capillary creatives ui",
6
6
  "main": "./index.js",
7
7
  "module": "./index.es.js",
@@ -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
- <CapButton
332
- type="secondary"
333
- disabled={disablePreviewButton}
334
- onClick={generatePreview}
335
- >
336
- <FormattedMessage {...messages.generatePreview} />
337
- </CapButton>
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).set('previewIframe', "");
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).set('previewIframe', get(action, 'payload.fbPreview[0].body', ""));
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).set('previewIframe', "");
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).set('previewIframe', "");
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 { errors, response: responsePreview } = response;
10
- if (errors && errors.length) {
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: errors,
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 { errors, response: responsePreview } = response;
33
- if (errors && errors.length) {
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: errors,
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 { errors, response: responsePreview } = response;
56
- if (errors && errors.length) {
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: errors,
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,
@@ -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 = {