@atlaskit/media-card 77.6.1 → 77.6.3

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/card/card.js +1 -1
  3. package/dist/cjs/card/media-card-analytics-error-boundary.js +1 -1
  4. package/dist/cjs/card/v2/cardV2.js +1 -1
  5. package/dist/cjs/card/v2/fileCard.js +8 -8
  6. package/dist/cjs/card/v2/useFilePreview/getPreview/getPreview.js +2 -2
  7. package/dist/cjs/card/v2/useFilePreview/getPreview/index.js +2 -2
  8. package/dist/cjs/card/v2/useFilePreview/useFilePreview.js +234 -235
  9. package/dist/cjs/inline/loader.js +1 -1
  10. package/dist/cjs/inline/mediaInlineCard.js +5 -7
  11. package/dist/cjs/utils/ufoExperiences.js +1 -1
  12. package/dist/es2019/card/card.js +1 -1
  13. package/dist/es2019/card/media-card-analytics-error-boundary.js +1 -1
  14. package/dist/es2019/card/v2/cardV2.js +1 -1
  15. package/dist/es2019/card/v2/fileCard.js +8 -8
  16. package/dist/es2019/card/v2/useFilePreview/getPreview/getPreview.js +1 -1
  17. package/dist/es2019/card/v2/useFilePreview/getPreview/index.js +1 -1
  18. package/dist/es2019/card/v2/useFilePreview/useFilePreview.js +194 -197
  19. package/dist/es2019/inline/loader.js +1 -1
  20. package/dist/es2019/inline/mediaInlineCard.js +5 -7
  21. package/dist/es2019/utils/ufoExperiences.js +1 -1
  22. package/dist/esm/card/card.js +1 -1
  23. package/dist/esm/card/media-card-analytics-error-boundary.js +1 -1
  24. package/dist/esm/card/v2/cardV2.js +1 -1
  25. package/dist/esm/card/v2/fileCard.js +8 -8
  26. package/dist/esm/card/v2/useFilePreview/getPreview/getPreview.js +1 -1
  27. package/dist/esm/card/v2/useFilePreview/getPreview/index.js +1 -1
  28. package/dist/esm/card/v2/useFilePreview/useFilePreview.js +236 -237
  29. package/dist/esm/inline/loader.js +1 -1
  30. package/dist/esm/inline/mediaInlineCard.js +5 -7
  31. package/dist/esm/utils/ufoExperiences.js +1 -1
  32. package/dist/types/card/v2/useFilePreview/getPreview/getPreview.d.ts +1 -1
  33. package/dist/types/card/v2/useFilePreview/getPreview/index.d.ts +1 -1
  34. package/dist/types/card/v2/useFilePreview/useFilePreview.d.ts +6 -6
  35. package/dist/types-ts4.5/card/v2/useFilePreview/getPreview/getPreview.d.ts +1 -1
  36. package/dist/types-ts4.5/card/v2/useFilePreview/getPreview/index.d.ts +1 -1
  37. package/dist/types-ts4.5/card/v2/useFilePreview/useFilePreview.d.ts +6 -6
  38. package/package.json +1 -1
@@ -7,12 +7,12 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
7
7
  import { imageResizeModeToFileImageMode, isImageRepresentationReady } from '@atlaskit/media-client';
8
8
  import { MediaFileStateError, useFileState, useMediaClient } from '@atlaskit/media-client-react';
9
9
  import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
10
- import { useEffect, useMemo, useRef, useState } from 'react';
10
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
11
11
  import { ensureMediaFilePreviewError, ImageLoadError, isLocalPreviewError, isUnsupportedLocalPreviewError, MediaFilePreviewError } from './errors';
12
12
  import { extractErrorInfo } from './analytics';
13
13
  import { isBigger, createRequestDimensions, useCurrentValueRef, usePrevious } from './helpers';
14
14
  import { generateScriptProps, getSSRData } from './globalScope';
15
- import { getAndCacheRemotePreview, getSSRCardPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isPreviewableStatus, extractFilePreviewStatus, mediaFilePreviewCache, getAndCacheLocalPreview } from './getPreview';
15
+ import { getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isPreviewableStatus, extractFilePreviewStatus, mediaFilePreviewCache, getAndCacheLocalPreview } from './getPreview';
16
16
  export var useFilePreview = function useFilePreview(_ref) {
17
17
  var _ref$resizeMode = _ref.resizeMode,
18
18
  resizeMode = _ref$resizeMode === void 0 ? 'crop' : _ref$resizeMode,
@@ -45,6 +45,8 @@ export var useFilePreview = function useFilePreview(_ref) {
45
45
  var requestDimensions = useMemo(function () {
46
46
  return dimensions ? createRequestDimensions(dimensions) : undefined;
47
47
  }, [dimensions]);
48
+ var requestDimensionsRef = useCurrentValueRef(requestDimensions);
49
+ var prevRequestDimensions = usePrevious(requestDimensions);
48
50
  var imageURLParams = useMemo(function () {
49
51
  return _objectSpread(_objectSpread({
50
52
  collection: identifier.collectionName,
@@ -53,97 +55,235 @@ export var useFilePreview = function useFilePreview(_ref) {
53
55
  allowAnimated: true
54
56
  });
55
57
  }, [requestDimensions, identifier.collectionName, resizeMode]);
56
- var getSSRPreview = function getSSRPreview(ssr, identifier, mediaClient) {
57
- var ssrData = getSSRData(identifier);
58
- if (ssrData !== null && ssrData !== void 0 && ssrData.error) {
59
- ssrReliabilityRef.current.server = _objectSpread({
60
- status: 'fail'
61
- }, ssrData.error);
58
+ var previewInitializer = function previewInitializer() {
59
+ var fileImageMode = imageResizeModeToFileImageMode(resizeMode);
60
+ var preview = mediaFilePreviewCache.get(identifier.id, fileImageMode);
61
+ if (preview) {
62
+ return preview;
62
63
  }
63
- if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
64
- try {
65
- return getSSRCardPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
66
- } catch (e) {
67
- ssrReliabilityRef.current[ssr] = _objectSpread({
64
+ if (ssr) {
65
+ var ssrData = getSSRData(identifier);
66
+ if (ssrData !== null && ssrData !== void 0 && ssrData.error) {
67
+ ssrReliabilityRef.current.server = _objectSpread({
68
68
  status: 'fail'
69
- }, extractErrorInfo(e));
69
+ }, ssrData.error);
70
+ }
71
+ if (!(ssrData !== null && ssrData !== void 0 && ssrData.dataURI)) {
72
+ try {
73
+ return getSSRPreview(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
74
+ } catch (e) {
75
+ ssrReliabilityRef.current[ssr] = _objectSpread({
76
+ status: 'fail'
77
+ }, extractErrorInfo(e));
78
+ }
79
+ } else {
80
+ var _dimensions = ssrData.dimensions,
81
+ dataURI = ssrData.dataURI;
82
+ return {
83
+ dataURI: dataURI,
84
+ dimensions: _dimensions,
85
+ source: 'ssr-data'
86
+ };
70
87
  }
71
- } else {
72
- var _dimensions = ssrData.dimensions,
73
- dataURI = ssrData.dataURI;
74
- return {
75
- dataURI: dataURI,
76
- dimensions: _dimensions,
77
- source: 'ssr-data'
78
- };
79
- }
80
- };
81
- var cardPreviewInitializer = function cardPreviewInitializer() {
82
- var cardPreview;
83
- var id = identifier.id;
84
- var fileImageMode = imageResizeModeToFileImageMode(resizeMode);
85
- cardPreview = mediaFilePreviewCache.get(id, fileImageMode);
86
- if (!cardPreview && ssr) {
87
- cardPreview = getSSRPreview(ssr, identifier, mediaClient);
88
88
  }
89
- return cardPreview;
90
89
  };
91
- var _useState9 = useState(cardPreviewInitializer),
90
+ var _useState9 = useState(previewInitializer),
92
91
  _useState10 = _slicedToArray(_useState9, 2),
93
- cardPreview = _useState10[0],
94
- setCardPreview = _useState10[1];
92
+ preview = _useState10[0],
93
+ setPreview = _useState10[1];
94
+ var prevPreview = usePrevious(preview);
95
95
  var _useFileState = useFileState(identifier.id, {
96
96
  skipRemote: skipRemote,
97
97
  collectionName: identifier.collectionName,
98
98
  occurrenceKey: identifier.occurrenceKey
99
99
  }),
100
100
  fileState = _useFileState.fileState;
101
+
102
+ //----------------------------------------------------------------
103
+ // Update status
104
+ //----------------------------------------------------------------
105
+
106
+ // TOOD: make a full hook reset (remount) on New identifier or client
101
107
  useEffect(function () {
102
108
  setStatus('loading');
103
109
  }, [identifier]);
110
+ var updateFileStateRef = useCurrentValueRef(function () {
111
+ if (fileState) {
112
+ // do not update the status if the status is final
113
+ if (['complete', 'error', 'failed-processing'].includes(status)) {
114
+ return;
115
+ }
116
+ if (fileState.status !== 'error') {
117
+ var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
118
+ var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
119
+ var isPreviewableFileState = !!fileState.preview;
120
+ var isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
121
+ var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && isMimeTypeSupportedByBrowser(fileState.mimeType);
122
+ var hasRemotePreview = isImageRepresentationReady(fileState);
123
+ var hasPreview = hasLocalPreview || hasRemotePreview;
124
+ var newStatus;
125
+ switch (fileState.status) {
126
+ case 'uploading':
127
+ case 'failed-processing':
128
+ case 'processing':
129
+ newStatus = fileState.status;
130
+ break;
131
+ case 'processed':
132
+ if (!isPreviewable || !hasPreview) {
133
+ newStatus = 'complete';
134
+ break;
135
+ }
136
+ newStatus = 'loading-preview';
137
+ break;
138
+ default:
139
+ newStatus = 'loading';
140
+ }
141
+ setStatus(newStatus);
142
+ } else {
143
+ var e = new MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
144
+ var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
145
+ setError(new MediaFilePreviewError(errorReason, e));
146
+ setStatus('error');
147
+ }
148
+ }
149
+ });
150
+ useEffect(function () {
151
+ updateFileStateRef.current();
152
+ }, [fileState, updateFileStateRef]);
153
+ useEffect(function () {
154
+ if (previewDidRender &&
155
+ // We should't complete if status is uploading
156
+ ['loading-preview', 'processing'].includes(status)) {
157
+ setStatus('complete');
158
+ // TODO MEX-788: add test for "do not remove the preview when unsubscribing".
159
+ setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
160
+ }
161
+ }, [previewDidRender, status]);
104
162
 
105
- //----------------------------------------------------------------//
106
- //---------------------- Helper Functions -----------------------//
107
- //----------------------------------------------------------------//
163
+ // CXP-2723 TODO: Create test cases for banning local preview after status is complete
108
164
 
109
- var fetchRemotePreviewRef = useCurrentValueRef(function (identifier) {
165
+ //----------------------------------------------------------------
166
+ // Preview Fetch Helper
167
+ //----------------------------------------------------------------
168
+ var getAndCacheRemotePreviewRef = useCurrentValueRef(function () {
110
169
  return getAndCacheRemotePreview(mediaClient, identifier.id, requestDimensions || {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
111
170
  });
171
+
172
+ //----------------------------------------------------------------
173
+ // Cache SSR Preview
174
+ //----------------------------------------------------------------
175
+ useEffect(function () {
176
+ if (!skipRemote && ssr && !!preview && isSSRClientPreview(preview)) {
177
+ // Since the SSR preview brings the token in the query params,
178
+ // We need to fetch the remote preview to be able to cache it,
179
+ getAndCacheRemotePreviewRef.current().catch(function () {
180
+ // No need to log this error.
181
+ // If preview fails, it will be refetched later
182
+ //TODO: test this catch
183
+ // https://product-fabric.atlassian.net/browse/MEX-1071
184
+ });
185
+ }
186
+ }, [preview, identifier, skipRemote, ssr, getAndCacheRemotePreviewRef]);
187
+
188
+ //----------------------------------------------------------------
189
+ // Refetch SRR Preview if dimensions from Server have changed and are bigger,
190
+ //----------------------------------------------------------------
191
+ useEffect(function () {
192
+ // CXP-2813 TODO: This is called too many times if the refetch failed. Should be called only once
193
+ if (preview && !skipRemote && isSSRDataPreview(preview) && isBigger(preview.dimensions, requestDimensions)) {
194
+ getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
195
+ var wrappedError = ensureMediaFilePreviewError('remote-preview-fetch-ssr', e, true);
196
+ setNonCriticalError(wrappedError);
197
+ });
198
+ }
199
+ }, [getAndCacheRemotePreviewRef, identifier, preview, requestDimensions, skipRemote]);
200
+
201
+ //----------------------------------------------------------------
202
+ // Upfront Preview
203
+ //----------------------------------------------------------------
204
+ useEffect(function () {
205
+ var resolveUpfrontPreview = /*#__PURE__*/function () {
206
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
207
+ var fetchedDimensions, newPreview, areValidFetchedDimensions;
208
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
209
+ while (1) switch (_context.prev = _context.next) {
210
+ case 0:
211
+ // We block any possible future call to this method regardless of the outcome (success or fail)
212
+ // If it fails, the normal preview fetch should occur after the file state is fetched anyways
213
+ wasResolvedUpfrontPreviewRef.current = true;
214
+ _context.prev = 1;
215
+ fetchedDimensions = _objectSpread({}, requestDimensions);
216
+ _context.next = 5;
217
+ return getAndCacheRemotePreviewRef.current();
218
+ case 5:
219
+ newPreview = _context.sent;
220
+ areValidFetchedDimensions = !isBigger(fetchedDimensions, requestDimensionsRef.current); // If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
221
+ // the fetched preview is no longer valid, and thus, we dismiss it
222
+ if (areValidFetchedDimensions) {
223
+ setPreview(newPreview);
224
+ }
225
+ _context.next = 12;
226
+ break;
227
+ case 10:
228
+ _context.prev = 10;
229
+ _context.t0 = _context["catch"](1);
230
+ case 12:
231
+ case "end":
232
+ return _context.stop();
233
+ }
234
+ }, _callee, null, [[1, 10]]);
235
+ }));
236
+ return function resolveUpfrontPreview() {
237
+ return _ref2.apply(this, arguments);
238
+ };
239
+ }();
240
+
241
+ // CXP-2723 TODO: `hadSSRPreview` is most likely redundant
242
+ var hadSSRPreview = ssr === 'client' && !!prevPreview && isSSRClientPreview(prevPreview);
243
+ if (!preview && !wasResolvedUpfrontPreviewRef.current && (!skipRemote || hadSSRPreview)) {
244
+ resolveUpfrontPreview();
245
+ }
246
+ }, [preview, requestDimensions, requestDimensionsRef, getAndCacheRemotePreviewRef, identifier, skipRemote, prevPreview, ssr]);
247
+
248
+ //----------------------------------------------------------------
249
+ // Fetch Preview
250
+ //----------------------------------------------------------------
251
+
112
252
  var resolvePreviewRef = useCurrentValueRef( /*#__PURE__*/function () {
113
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(identifier, fileState) {
253
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(identifier, fileState) {
114
254
  var filePreview, isRemotePreviewReady, mode, cachedPreview, dimensionsAreBigger, localPreview, remotePreview, wrappedError;
115
- return _regeneratorRuntime.wrap(function _callee$(_context) {
116
- while (1) switch (_context.prev = _context.next) {
255
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
256
+ while (1) switch (_context2.prev = _context2.next) {
117
257
  case 0:
118
258
  filePreview = isBannedLocalPreview ? undefined : fileState.status !== 'error' && 'mimeType' in fileState && isMimeTypeSupportedByBrowser(fileState.mimeType) ? fileState.preview : undefined;
119
259
  isRemotePreviewReady = isImageRepresentationReady(fileState);
120
- _context.prev = 2;
260
+ _context2.prev = 2;
121
261
  mode = imageURLParams.mode;
122
262
  cachedPreview = mediaFilePreviewCache.get(identifier.id, mode);
123
263
  dimensionsAreBigger = isBigger(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, requestDimensions);
124
264
  if (!(cachedPreview && !dimensionsAreBigger)) {
125
- _context.next = 8;
265
+ _context2.next = 8;
126
266
  break;
127
267
  }
128
- return _context.abrupt("return", cachedPreview);
268
+ return _context2.abrupt("return", cachedPreview);
129
269
  case 8:
130
- _context.prev = 8;
270
+ _context2.prev = 8;
131
271
  if (!filePreview) {
132
- _context.next = 15;
272
+ _context2.next = 15;
133
273
  break;
134
274
  }
135
- _context.next = 12;
275
+ _context2.next = 12;
136
276
  return getAndCacheLocalPreview(identifier.id, filePreview, requestDimensions || {}, mode, mediaBlobUrlAttrs);
137
277
  case 12:
138
- localPreview = _context.sent;
139
- setCardPreview(localPreview);
140
- return _context.abrupt("return");
278
+ localPreview = _context2.sent;
279
+ setPreview(localPreview);
280
+ return _context2.abrupt("return");
141
281
  case 15:
142
- _context.next = 22;
282
+ _context2.next = 22;
143
283
  break;
144
284
  case 17:
145
- _context.prev = 17;
146
- _context.t0 = _context["catch"](8);
285
+ _context2.prev = 17;
286
+ _context2.t0 = _context2["catch"](8);
147
287
  /**
148
288
  * We report the error if:
149
289
  * - local preview is supported and fails
@@ -154,36 +294,36 @@ export var useFilePreview = function useFilePreview(_ref) {
154
294
  * i.e. local preview is available and not supported,
155
295
  * but we are after the remote preview instead.
156
296
  */
157
- if (!isUnsupportedLocalPreviewError(_context.t0) || isUnsupportedLocalPreviewError(_context.t0) && !isRemotePreviewReady) {
297
+ if (!isUnsupportedLocalPreviewError(_context2.t0) || isUnsupportedLocalPreviewError(_context2.t0) && !isRemotePreviewReady) {
158
298
  // CXP-2723 TODO: We might have to wrap this error in MediaCardError
159
- setNonCriticalError(_context.t0);
299
+ setNonCriticalError(_context2.t0);
160
300
  }
161
301
  /**
162
302
  * No matter the reason why the local preview failed, we break the process
163
303
  * if there is no remote preview available
164
304
  */
165
305
  if (isRemotePreviewReady) {
166
- _context.next = 22;
306
+ _context2.next = 22;
167
307
  break;
168
308
  }
169
- throw _context.t0;
309
+ throw _context2.t0;
170
310
  case 22:
171
311
  if (isRemotePreviewReady) {
172
- _context.next = 24;
312
+ _context2.next = 24;
173
313
  break;
174
314
  }
175
315
  throw new MediaFilePreviewError('remote-preview-not-ready');
176
316
  case 24:
177
- _context.next = 26;
178
- return fetchRemotePreviewRef.current(identifier);
317
+ _context2.next = 26;
318
+ return getAndCacheRemotePreviewRef.current();
179
319
  case 26:
180
- remotePreview = _context.sent;
181
- setCardPreview(remotePreview);
182
- return _context.abrupt("return");
320
+ remotePreview = _context2.sent;
321
+ setPreview(remotePreview);
322
+ return _context2.abrupt("return");
183
323
  case 31:
184
- _context.prev = 31;
185
- _context.t1 = _context["catch"](2);
186
- wrappedError = ensureMediaFilePreviewError('preview-fetch', _context.t1); // If remote preview fails, we set status 'error'
324
+ _context2.prev = 31;
325
+ _context2.t1 = _context2["catch"](2);
326
+ wrappedError = ensureMediaFilePreviewError('preview-fetch', _context2.t1); // If remote preview fails, we set status 'error'
187
327
  // If local preview fails (i.e, no remote preview available),
188
328
  // we can stay in the same status until there is a remote preview available
189
329
  // If it's any other error we set status 'error'
@@ -198,187 +338,50 @@ export var useFilePreview = function useFilePreview(_ref) {
198
338
  }
199
339
  case 35:
200
340
  case "end":
201
- return _context.stop();
341
+ return _context2.stop();
202
342
  }
203
- }, _callee, null, [[2, 31], [8, 17]]);
343
+ }, _callee2, null, [[2, 31], [8, 17]]);
204
344
  }));
205
345
  return function (_x, _x2) {
206
- return _ref2.apply(this, arguments);
346
+ return _ref3.apply(this, arguments);
207
347
  };
208
348
  }());
209
-
210
- //----------------------------------------------------------------//
211
- //------------ resolveUpfrontPreview useEffect -------------------//
212
- //----------------------------------------------------------------//
213
- var prevCardPreview = usePrevious(cardPreview);
214
- var requestDimensionsRef = useCurrentValueRef(requestDimensions);
215
- useEffect(function () {
216
- var resolveUpfrontPreview = /*#__PURE__*/function () {
217
- var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(identifier) {
218
- var fetchedDimensions, newCardPreview, areValidFetchedDimensions;
219
- return _regeneratorRuntime.wrap(function _callee2$(_context2) {
220
- while (1) switch (_context2.prev = _context2.next) {
221
- case 0:
222
- // We block any possible future call to this method regardless of the outcome (success or fail)
223
- // If it fails, the normal preview fetch should occur after the file state is fetched anyways
224
- wasResolvedUpfrontPreviewRef.current = true;
225
- _context2.prev = 1;
226
- fetchedDimensions = _objectSpread({}, requestDimensions);
227
- _context2.next = 5;
228
- return fetchRemotePreviewRef.current(identifier);
229
- case 5:
230
- newCardPreview = _context2.sent;
231
- areValidFetchedDimensions = !isBigger(fetchedDimensions, requestDimensionsRef.current); // If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
232
- // the fetched preview is no longer valid, and thus, we dismiss it
233
- if (areValidFetchedDimensions) {
234
- setCardPreview(newCardPreview);
235
- }
236
- _context2.next = 12;
237
- break;
238
- case 10:
239
- _context2.prev = 10;
240
- _context2.t0 = _context2["catch"](1);
241
- case 12:
242
- case "end":
243
- return _context2.stop();
244
- }
245
- }, _callee2, null, [[1, 10]]);
246
- }));
247
- return function resolveUpfrontPreview(_x3) {
248
- return _ref3.apply(this, arguments);
249
- };
250
- }();
251
- var hadSSRCardPreview = ssr === 'client' && !!prevCardPreview && isSSRClientPreview(prevCardPreview);
252
-
253
- // CXP-2723 TODO: `hadSSRCardPreview` is most likely redundant
254
- if (!wasResolvedUpfrontPreviewRef.current && (!skipRemote || hadSSRCardPreview) && !cardPreview) {
255
- resolveUpfrontPreview(identifier);
256
- }
257
- }, [cardPreview, requestDimensions, requestDimensionsRef, fetchRemotePreviewRef, identifier, skipRemote, prevCardPreview, ssr]);
258
-
259
- //----------------------------------------------------------------//
260
- //---------------- fetch and resolve card preview ----------------//
261
- //----------------------------------------------------------------//
262
-
263
- var prevRequestDimensions = usePrevious(requestDimensions);
264
349
  useEffect(function () {
265
- // CXP-2813 TODO: This is called too many times if the refetch failed. Should be called only once
266
- if (cardPreview && !skipRemote && isSSRDataPreview(cardPreview) && isBigger(cardPreview.dimensions, requestDimensions)) {
267
- // refetchSRRPreview: If dimensions from Server have changed and are bigger,
268
- // we need to refetch
269
- fetchRemotePreviewRef.current(identifier).then(setCardPreview).catch(function (e) {
270
- var wrappedError = ensureMediaFilePreviewError('remote-preview-fetch-ssr', e, true);
271
- setNonCriticalError(wrappedError);
272
- });
273
- }
274
- // CXP-2723 TODO: The above and below preview fetch logic seem very similar and could be revisted
275
- // Both compare dimensions, but the above is only for SSR in order to refetchSRRPreview and
276
- // will swallow any errors. Below logic only applies when there is no card preview or the dimensions
277
- // are bigger.
278
- if (fileState && wasResolvedUpfrontPreviewRef.current && isPreviewableStatus(status, extractFilePreviewStatus(fileState, isBannedLocalPreview)) && (!cardPreview || isBigger(prevRequestDimensions, requestDimensions))) {
350
+ if (fileState && wasResolvedUpfrontPreviewRef.current && isPreviewableStatus(status, extractFilePreviewStatus(fileState, isBannedLocalPreview)) && (!preview || isBigger(prevRequestDimensions, requestDimensions))) {
279
351
  resolvePreviewRef.current(identifier, fileState);
280
352
  }
281
- if (!skipRemote && ssr && !!cardPreview && isSSRClientPreview(cardPreview)) {
282
- // Since the SSR preview brings the token in the query params,
283
- // We need to fetch the remote preview to be able to cache it,
284
- fetchRemotePreviewRef.current(identifier).catch(function () {
285
- // No need to log this error.
286
- // If preview fails, it will be refetched later
287
- //TODO: test this catch
288
- // https://product-fabric.atlassian.net/browse/MEX-1071
289
- });
290
- }
291
- }, [cardPreview, requestDimensions, fetchRemotePreviewRef, fileState, identifier, isBannedLocalPreview, prevRequestDimensions, resolvePreviewRef, skipRemote, ssr, status]);
292
-
293
- //----------------------------------------------------------------//
294
- //----------------- set complete status --------------------------//
295
- //----------------------------------------------------------------//
353
+ }, [fileState, identifier, isBannedLocalPreview, prevRequestDimensions, preview, requestDimensions, resolvePreviewRef, status]);
296
354
 
297
- useEffect(function () {
298
- if (previewDidRender &&
299
- // We should't complete if status is uploading
300
- ['loading-preview', 'processing'].includes(status)) {
301
- setStatus('complete');
302
- // TODO MEX-788: add test for "do not remove the card preview when unsubscribing".
303
- setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
304
- }
305
- }, [previewDidRender, status]);
306
-
307
- // CXP-2723 TODO: Create test cases for banning local preview after status is complete
308
-
309
- //----------------------------------------------------------------//
310
- //------------------ Subscribe to file state ---------------------//
311
- //----------------------------------------------------------------//
355
+ //----------------------------------------------------------------
356
+ // RETURN
357
+ //----------------------------------------------------------------
312
358
 
313
- var updateFileStateRef = useCurrentValueRef(function () {
314
- if (fileState) {
315
- // do not update the card status if the status is final
316
- if (['complete', 'error', 'failed-processing'].includes(status)) {
317
- return;
318
- }
319
- if (fileState.status !== 'error') {
320
- var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
321
- var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
322
- var isPreviewableFileState = !!fileState.preview;
323
- var isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
324
- var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && isMimeTypeSupportedByBrowser(fileState.mimeType);
325
- var hasRemotePreview = isImageRepresentationReady(fileState);
326
- var hasPreview = hasLocalPreview || hasRemotePreview;
327
- var newStatus;
328
- switch (fileState.status) {
329
- case 'uploading':
330
- case 'failed-processing':
331
- case 'processing':
332
- newStatus = fileState.status;
333
- break;
334
- case 'processed':
335
- if (!isPreviewable || !hasPreview) {
336
- newStatus = 'complete';
337
- break;
338
- }
339
- newStatus = 'loading-preview';
340
- break;
341
- default:
342
- newStatus = 'loading';
343
- }
344
- setStatus(newStatus);
345
- } else {
346
- var e = new MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
347
- var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
348
- setError(new MediaFilePreviewError(errorReason, e));
349
- setStatus('error');
350
- }
351
- }
352
- });
353
- useEffect(function () {
354
- updateFileStateRef.current();
355
- }, [fileState, updateFileStateRef]);
356
- var onImageError = function onImageError(newCardPreview) {
357
- if (newCardPreview) {
359
+ var onImageError = useCallback(function (newPreview) {
360
+ if (newPreview) {
358
361
  var failedSSRObject = _objectSpread({
359
362
  status: 'fail'
360
- }, extractErrorInfo(new ImageLoadError(newCardPreview.source)));
361
- if (isSSRClientPreview(newCardPreview)) {
363
+ }, extractErrorInfo(new ImageLoadError(newPreview.source)));
364
+ if (isSSRClientPreview(newPreview)) {
362
365
  ssrReliabilityRef.current.client = failedSSRObject;
363
366
  }
364
367
 
365
368
  /*
366
- If the cardPreview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
369
+ If the preview failed and it comes from server (global scope / ssrData), it means that we have reused it in client and the error counts for both: server & client.
367
370
  */
368
371
 
369
- if (isSSRDataPreview(newCardPreview)) {
372
+ if (isSSRDataPreview(newPreview)) {
370
373
  ssrReliabilityRef.current.server = failedSSRObject;
371
374
  ssrReliabilityRef.current.client = failedSSRObject;
372
375
  }
373
376
  }
374
377
 
375
378
  // If the dataURI has been replaced, we can dismiss this error
376
- if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
379
+ if ((newPreview === null || newPreview === void 0 ? void 0 : newPreview.dataURI) !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
377
380
  return;
378
381
  }
379
- var error = new ImageLoadError(newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.source);
380
- var isLocal = newCardPreview && isLocalPreview(newCardPreview);
381
- var isSSR = newCardPreview && (isSSRClientPreview(newCardPreview) || isSSRDataPreview(newCardPreview));
382
+ var error = new ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
383
+ var isLocal = newPreview && isLocalPreview(newPreview);
384
+ var isSSR = newPreview && (isSSRClientPreview(newPreview) || isSSRDataPreview(newPreview));
382
385
  if (isLocal || isSSR) {
383
386
  if (isLocal) {
384
387
  setIsBannedLocalPreview(true);
@@ -386,27 +389,27 @@ export var useFilePreview = function useFilePreview(_ref) {
386
389
  }
387
390
  var fileImageMode = imageResizeModeToFileImageMode(resizeMode);
388
391
  mediaFilePreviewCache.remove(identifier.id, fileImageMode);
389
- setCardPreview(undefined);
392
+ setPreview(undefined);
390
393
  } else {
391
394
  if (!['complete', 'error', 'failed-processing'].includes(status)) {
392
395
  setStatus('error');
393
396
  setError(error);
394
397
  }
395
398
  }
396
- };
397
- var onImageLoad = function onImageLoad(newCardPreview) {
398
- if (newCardPreview) {
399
- if (isSSRClientPreview(newCardPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
399
+ }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, status]);
400
+ var onImageLoad = useCallback(function (newPreview) {
401
+ if (newPreview) {
402
+ if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
400
403
  ssrReliabilityRef.current.client = {
401
404
  status: 'success'
402
405
  };
403
406
  }
404
407
 
405
408
  /*
406
- If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
409
+ If the image loads successfully and it comes from server (global scope / ssrData), it means that we have reused it in client and the success counts for both: server & client.
407
410
  */
408
411
 
409
- if (isSSRDataPreview(newCardPreview) && ssrReliabilityRef.current.server.status === 'unknown') {
412
+ if (isSSRDataPreview(newPreview) && ssrReliabilityRef.current.server.status === 'unknown') {
410
413
  ssrReliabilityRef.current.server = {
411
414
  status: 'success'
412
415
  };
@@ -417,25 +420,21 @@ export var useFilePreview = function useFilePreview(_ref) {
417
420
  }
418
421
 
419
422
  // If the dataURI has been replaced, we can dismiss this callback
420
- if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
423
+ if ((newPreview === null || newPreview === void 0 ? void 0 : newPreview.dataURI) !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
421
424
  return;
422
425
  }
423
- };
424
-
425
- //----------------------------------------------------------------//
426
- // RETURN
427
- //----------------------------------------------------------------//
426
+ }, [preview === null || preview === void 0 ? void 0 : preview.dataURI]);
428
427
 
429
428
  // FOR SSR
430
429
  var getScriptProps = function getScriptProps() {
431
430
  var _ssrReliabilityRef$cu;
432
- return generateScriptProps(identifier, cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI, requestDimensions, ((_ssrReliabilityRef$cu = ssrReliabilityRef.current.server) === null || _ssrReliabilityRef$cu === void 0 ? void 0 : _ssrReliabilityRef$cu.status) === 'fail' ? ssrReliabilityRef.current.server : undefined);
431
+ return generateScriptProps(identifier, preview === null || preview === void 0 ? void 0 : preview.dataURI, requestDimensions, ((_ssrReliabilityRef$cu = ssrReliabilityRef.current.server) === null || _ssrReliabilityRef$cu === void 0 ? void 0 : _ssrReliabilityRef$cu.status) === 'fail' ? ssrReliabilityRef.current.server : undefined);
433
432
  };
434
433
 
435
434
  // CXP-2723 TODO: should consider simplifying our analytics, and how
436
435
  // we might get rid of ssrReliabiltyRef from our hook
437
436
  return {
438
- cardPreview: cardPreview,
437
+ preview: preview,
439
438
  error: error,
440
439
  nonCriticalError: nonCriticalError,
441
440
  ssrReliabilityRef: ssrReliabilityRef,
@@ -103,7 +103,7 @@ var MediaInlineCardLoader = /*#__PURE__*/function (_React$PureComponent) {
103
103
  ErrorBoundary = _this$state.ErrorBoundary;
104
104
  var analyticsContext = {
105
105
  packageVersion: "@atlaskit/media-card",
106
- packageName: "77.6.1",
106
+ packageName: "77.6.3",
107
107
  componentName: 'mediaInlineCard',
108
108
  component: 'mediaInlineCard'
109
109
  };