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