@atlaskit/media-card 77.4.4 → 77.4.6

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 (31) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/card/card.js +42 -38
  3. package/dist/cjs/card/getCardPreview/filePreviewStatus.js +2 -0
  4. package/dist/cjs/card/media-card-analytics-error-boundary.js +1 -1
  5. package/dist/cjs/card/v2/cardV2.js +1 -1
  6. package/dist/cjs/card/v2/fileCard.js +120 -521
  7. package/dist/cjs/card/v2/useFilePreview.js +592 -0
  8. package/dist/cjs/inline/loader.js +1 -1
  9. package/dist/cjs/utils/ufoExperiences.js +1 -1
  10. package/dist/es2019/card/card.js +7 -4
  11. package/dist/es2019/card/getCardPreview/filePreviewStatus.js +2 -0
  12. package/dist/es2019/card/media-card-analytics-error-boundary.js +1 -1
  13. package/dist/es2019/card/v2/cardV2.js +1 -1
  14. package/dist/es2019/card/v2/fileCard.js +105 -436
  15. package/dist/es2019/card/v2/useFilePreview.js +499 -0
  16. package/dist/es2019/inline/loader.js +1 -1
  17. package/dist/es2019/utils/ufoExperiences.js +1 -1
  18. package/dist/esm/card/card.js +42 -38
  19. package/dist/esm/card/getCardPreview/filePreviewStatus.js +2 -0
  20. package/dist/esm/card/media-card-analytics-error-boundary.js +1 -1
  21. package/dist/esm/card/v2/cardV2.js +1 -1
  22. package/dist/esm/card/v2/fileCard.js +125 -526
  23. package/dist/esm/card/v2/useFilePreview.js +584 -0
  24. package/dist/esm/inline/loader.js +1 -1
  25. package/dist/esm/utils/ufoExperiences.js +1 -1
  26. package/dist/types/card/card.d.ts +1 -1
  27. package/dist/types/card/v2/useFilePreview.d.ts +38 -0
  28. package/dist/types-ts4.5/card/card.d.ts +1 -1
  29. package/dist/types-ts4.5/card/v2/useFilePreview.d.ts +38 -0
  30. package/package.json +4 -4
  31. package/tmp/api-report-tmp.d.ts +0 -345
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.FileCard = void 0;
9
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
9
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
@@ -15,36 +13,30 @@ var _download = _interopRequireDefault(require("@atlaskit/icon/glyph/download"))
15
13
  var _mediaClient = require("@atlaskit/media-client");
16
14
  var _mediaClientReact = require("@atlaskit/media-client-react");
17
15
  var _mediaCommon = require("@atlaskit/media-common");
18
- var _mediaUi = require("@atlaskit/media-ui");
19
16
  var _mediaViewer = require("@atlaskit/media-viewer");
20
17
  var _react = _interopRequireWildcard(require("react"));
21
18
  var _reactDom = _interopRequireDefault(require("react-dom"));
22
19
  var _errors = require("../../errors");
23
- var _analytics = require("../../utils/analytics");
24
- var _dimensionComparer = require("../../utils/dimensionComparer");
25
20
  var _document = _interopRequireDefault(require("../../utils/document"));
26
21
  var _generateUniqueId = require("../../utils/generateUniqueId");
27
22
  var _getDataURIDimension = require("../../utils/getDataURIDimension");
28
23
  var _getMediaCardCursor = require("../../utils/getMediaCardCursor");
29
- var _globalScope = require("../../utils/globalScope");
30
24
  var _metadata = require("../../utils/metadata");
31
25
  var _ufoExperiences = require("../../utils/ufoExperiences");
32
26
  var _useCurrentValueRef = require("../../utils/useCurrentValueRef");
33
27
  var _usePrevious = require("../../utils/usePrevious");
34
28
  var _videoIsPlayable = require("../../utils/videoIsPlayable");
35
- var _videoSnapshot = require("../../utils/videoSnapshot");
36
29
  var _viewportDetector = require("../../utils/viewportDetector");
37
30
  var _cardAnalytics = require("../cardAnalytics");
38
31
  var _getCardPreview = require("../getCardPreview");
39
- var _cache = _interopRequireDefault(require("../getCardPreview/cache"));
40
32
  var _cardViewV = require("./cardViewV2");
41
33
  var _inlinePlayerLazyV = require("./inlinePlayerLazyV2");
34
+ var _useFilePreview2 = require("./useFilePreview");
42
35
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
43
36
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
44
37
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
45
38
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
46
39
  var FileCard = exports.FileCard = function FileCard(_ref) {
47
- var _ssrReliabilityRef$cu;
48
40
  var _ref$appearance = _ref.appearance,
49
41
  appearance = _ref$appearance === void 0 ? 'auto' : _ref$appearance,
50
42
  _ref$resizeMode = _ref.resizeMode,
@@ -78,102 +70,26 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
78
70
  onMouseEnter = _ref.onMouseEnter,
79
71
  createAnalyticsEvent = _ref.createAnalyticsEvent;
80
72
  //----------------------------------------------------------------//
81
- //---------------- State Initializer Functions -------------------//
73
+ //------------ State, Refs & Initial Values ----------------------//
82
74
  //----------------------------------------------------------------//
83
75
 
84
- var ssrDataRef = (0, _react.useRef)();
85
- var ssrReliabilityRef = (0, _react.useRef)({
86
- server: {
87
- status: 'unknown'
88
- },
89
- client: {
90
- status: 'unknown'
91
- }
92
- });
93
76
  var _useState = (0, _react.useState)(null),
94
77
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
95
78
  cardElement = _useState2[0],
96
79
  setCardElement = _useState2[1];
97
- var imageURLParams = (0, _react.useMemo)(function () {
98
- return _objectSpread(_objectSpread({
99
- collection: identifier.collectionName,
100
- mode: resizeMode === 'stretchy-fit' ? 'full-fit' : resizeMode
101
- }, (0, _getDataURIDimension.getRequestedDimensions)({
102
- dimensions: dimensions,
103
- element: cardElement
104
- })), {}, {
105
- allowAnimated: true
106
- });
107
- }, [cardElement, dimensions, identifier.collectionName, resizeMode]);
108
- var getMediaBlobUrlAttrs = (0, _react.useCallback)(function (fileState) {
109
- var id = identifier.id,
110
- collection = identifier.collectionName;
111
- var _getFileDetails = (0, _metadata.getFileDetails)(identifier, fileState),
112
- mimeType = _getFileDetails.mimeType,
113
- name = _getFileDetails.name,
114
- size = _getFileDetails.size;
115
- return contextId ? _objectSpread(_objectSpread({
116
- id: id,
117
- collection: collection,
118
- contextId: contextId,
119
- mimeType: mimeType,
120
- name: name,
121
- size: size
122
- }, originalDimensions || (0, _getDataURIDimension.getRequestedDimensions)({
123
- dimensions: dimensions,
124
- element: cardElement
125
- })), {}, {
126
- alt: alt
127
- }) : undefined;
128
- }, [alt, cardElement, contextId, dimensions, identifier, originalDimensions]);
129
- var getSSRPreview = function getSSRPreview(ssr, identifier, mediaClient) {
130
- var _ssrDataRef$current, _ssrDataRef$current2;
131
- ssrDataRef.current = (0, _globalScope.getSSRData)(identifier);
132
- if ((_ssrDataRef$current = ssrDataRef.current) !== null && _ssrDataRef$current !== void 0 && _ssrDataRef$current.error) {
133
- ssrReliabilityRef.current.server = _objectSpread({
134
- status: 'fail'
135
- }, ssrDataRef.current.error);
136
- }
137
- if (!((_ssrDataRef$current2 = ssrDataRef.current) !== null && _ssrDataRef$current2 !== void 0 && _ssrDataRef$current2.dataURI)) {
138
- try {
139
- return (0, _getCardPreview.getSSRCardPreview)(ssr, mediaClient, identifier.id, imageURLParams, getMediaBlobUrlAttrs(fileStateValue));
140
- } catch (e) {
141
- ssrReliabilityRef.current[ssr] = _objectSpread({
142
- status: 'fail'
143
- }, (0, _analytics.extractErrorInfo)(e));
144
- }
145
- } else {
146
- return {
147
- dataURI: ssrDataRef.current.dataURI,
148
- source: 'ssr-data'
149
- };
150
- }
151
- };
152
- var cardPreviewInitializer = function cardPreviewInitializer() {
153
- var cardPreview;
154
- var id = identifier.id;
155
- var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
156
- cardPreview = (0, _getCardPreview.getCardPreviewFromCache)(id, fileImageMode);
157
- if (!cardPreview && ssr) {
158
- cardPreview = getSSRPreview(ssr, identifier, mediaClient);
159
- }
160
- return cardPreview;
161
- };
162
- var _useState3 = (0, _react.useState)(cardPreviewInitializer),
80
+ var requestedDimensions = (0, _react.useMemo)(function () {
81
+ return (
82
+ // requested dimensions is eventually an expensive operation if the dimensions are a percentage
83
+ (0, _getDataURIDimension.getRequestedDimensions)({
84
+ dimensions: dimensions,
85
+ element: cardElement
86
+ })
87
+ );
88
+ }, [dimensions, cardElement]);
89
+ var _useState3 = (0, _react.useState)(!isLazy),
163
90
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
164
- cardPreview = _useState4[0],
165
- setCardPreview = _useState4[1];
166
-
167
- // If cardPreview is available from local cache or external, `isCardVisible`
168
- // should be true to avoid flickers during re-mount of the component
169
- // should not be visible for SSR preview, otherwise we'll fire the metadata fetch from
170
- // outside the viewport
171
- var _useState5 = (0, _react.useState)(function () {
172
- return !isLazy || cardPreview && !(0, _getCardPreview.isSSRPreview)(cardPreview);
173
- }),
174
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
175
- isCardVisible = _useState6[0],
176
- setIsCardVisible = _useState6[1];
91
+ isCardVisible = _useState4[0],
92
+ setIsCardVisible = _useState4[1];
177
93
  var _useFileState = (0, _mediaClientReact.useFileState)(identifier.id, {
178
94
  skipRemote: !isCardVisible,
179
95
  collectionName: identifier.collectionName,
@@ -210,35 +126,79 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
210
126
  traceId: (0, _mediaCommon.getRandomHex)(8)
211
127
  };
212
128
  }, []);
213
- var _useState7 = (0, _react.useState)('loading'),
129
+ var _useState5 = (0, _react.useState)('loading'),
130
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
131
+ status = _useState6[0],
132
+ setStatus = _useState6[1];
133
+ var _useState7 = (0, _react.useState)(false),
214
134
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
215
- status = _useState8[0],
216
- setStatus = _useState8[1];
135
+ isPlayingFile = _useState8[0],
136
+ setIsPlayingFile = _useState8[1];
217
137
  var _useState9 = (0, _react.useState)(false),
218
138
  _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
219
- isPlayingFile = _useState10[0],
220
- setIsPlayingFile = _useState10[1];
139
+ shouldAutoplay = _useState10[0],
140
+ setShouldAutoplay = _useState10[1];
141
+
142
+ // CXP-2723 TODO: remove isBannedLocalPreview
221
143
  var _useState11 = (0, _react.useState)(false),
222
144
  _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
223
- shouldAutoplay = _useState12[0],
224
- setShouldAutoplay = _useState12[1];
145
+ isBannedLocalPreview = _useState12[0],
146
+ setIsBannedLocalPreview = _useState12[1];
225
147
  var _useState13 = (0, _react.useState)(false),
226
148
  _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
227
- isBannedLocalPreview = _useState14[0],
228
- setIsBannedLocalPreview = _useState14[1];
229
- var _useState15 = (0, _react.useState)(false),
149
+ previewDidRender = _useState14[0],
150
+ setPreviewDidRender = _useState14[1];
151
+
152
+ // CXP-2723 TODO: Do we have tests to validate the use of the below attributes
153
+ var mediaBlobUrlAttrs = (0, _react.useMemo)(function () {
154
+ var id = identifier.id,
155
+ collection = identifier.collectionName;
156
+ var _getFileDetails = (0, _metadata.getFileDetails)(identifier, fileStateValue),
157
+ mimeType = _getFileDetails.mimeType,
158
+ name = _getFileDetails.name,
159
+ size = _getFileDetails.size;
160
+ return contextId ? _objectSpread(_objectSpread({
161
+ id: id,
162
+ collection: collection,
163
+ contextId: contextId,
164
+ mimeType: mimeType,
165
+ name: name,
166
+ size: size
167
+ }, originalDimensions || requestedDimensions), {}, {
168
+ alt: alt
169
+ }) : undefined;
170
+ }, [alt, requestedDimensions, contextId, fileStateValue, identifier, originalDimensions]);
171
+ var _useFilePreview = (0, _useFilePreview2.useFilePreview)({
172
+ mediaBlobUrlAttrs: mediaBlobUrlAttrs,
173
+ resizeMode: resizeMode,
174
+ identifier: identifier,
175
+ ssr: ssr,
176
+ mediaClient: mediaClient,
177
+ dimensions: dimensions,
178
+ requestedDimensions: requestedDimensions,
179
+ traceContext: traceContext,
180
+ previewDidRender: previewDidRender,
181
+ skipRemote: !isCardVisible
182
+ }),
183
+ cardPreview = _useFilePreview.cardPreview,
184
+ previewError = _useFilePreview.error,
185
+ nonCriticalError = _useFilePreview.nonCriticalError,
186
+ ssrReliabilityRef = _useFilePreview.ssrReliabilityRef,
187
+ onImageErrorBase = _useFilePreview.onImageError,
188
+ onImageLoadBase = _useFilePreview.onImageLoad,
189
+ StoreSSRDataScript = _useFilePreview.StoreSSRDataScript;
190
+ var _useState15 = (0, _react.useState)(),
230
191
  _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
231
- previewDidRender = _useState16[0],
232
- setPreviewDidRender = _useState16[1];
233
- var _useState17 = (0, _react.useState)(),
192
+ error = _useState16[0],
193
+ setError = _useState16[1];
194
+
195
+ // CXP-2723 TODO: TEMPORARY VARIABLES
196
+ var finalError = error || previewError;
197
+ var finalStatus = finalError ? 'error' : status;
198
+ var _useState17 = (0, _react.useState)(null),
234
199
  _useState18 = (0, _slicedToArray2.default)(_useState17, 2),
235
- error = _useState18[0],
236
- setError = _useState18[1];
237
- var wasResolvedUpfrontPreviewRef = (0, _react.useRef)(false);
238
- var _useState19 = (0, _react.useState)(null),
239
- _useState20 = (0, _slicedToArray2.default)(_useState19, 2),
240
- mediaViewerSelectedItem = _useState20[0],
241
- setMediaViewerSelectedItem = _useState20[1];
200
+ mediaViewerSelectedItem = _useState18[0],
201
+ setMediaViewerSelectedItem = _useState18[1];
242
202
  var uploadProgressRef = (0, _react.useRef)();
243
203
  var metadata = (0, _react.useMemo)(function () {
244
204
  var getProcessingStatusFromFileState = function getProcessingStatusFromFileState(status) {
@@ -277,7 +237,7 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
277
237
  };
278
238
  }, [fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.status, metadata.id, metadata.mediaType, metadata.mimeType, metadata.size]);
279
239
  var computedActions = (0, _react.useMemo)(function () {
280
- if (status === 'failed-processing' || shouldEnableDownloadButton) {
240
+ if (finalStatus === 'failed-processing' || shouldEnableDownloadButton) {
281
241
  var downloadAction = {
282
242
  label: 'Download',
283
243
  icon: /*#__PURE__*/_react.default.createElement(_download.default, {
@@ -291,7 +251,7 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
291
251
  } else {
292
252
  return actions;
293
253
  }
294
- }, [actions, identifier.collectionName, identifier.id, mediaClient.file, metadata.name, shouldEnableDownloadButton, status]);
254
+ }, [actions, identifier.collectionName, identifier.id, mediaClient.file, metadata.name, shouldEnableDownloadButton, finalStatus]);
295
255
 
296
256
  //----------------------------------------------------------------//
297
257
  //---------------------- Analytics ------------------------------//
@@ -306,12 +266,17 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
306
266
  durationSinceCommenced: durationSinceCommenced
307
267
  }
308
268
  };
309
- createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, fileAttributes, performanceAttributes, ssrReliabilityRef.current, error, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
310
- (0, _ufoExperiences.completeUfoExperience)(internalOccurrenceKey, status, fileAttributes, fileStateFlagsRef.current, ssrReliabilityRef.current, error);
269
+ createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, finalStatus, fileAttributes, performanceAttributes, ssrReliabilityRef.current, finalError, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
270
+ (0, _ufoExperiences.completeUfoExperience)(internalOccurrenceKey, finalStatus, fileAttributes, fileStateFlagsRef.current, ssrReliabilityRef.current, finalError);
311
271
  });
312
272
  var fireNonCriticalErrorEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function (error) {
313
- createAnalyticsEvent && (0, _cardAnalytics.fireNonCriticalErrorEvent)(createAnalyticsEvent, status, fileAttributes, ssrReliabilityRef.current, error, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
273
+ createAnalyticsEvent && (0, _cardAnalytics.fireNonCriticalErrorEvent)(createAnalyticsEvent, finalStatus, fileAttributes, ssrReliabilityRef.current, error, traceContext, fileStateValue === null || fileStateValue === void 0 ? void 0 : fileStateValue.metadataTraceContext);
314
274
  });
275
+ (0, _react.useEffect)(function () {
276
+ if (nonCriticalError) {
277
+ fireNonCriticalErrorEventRef.current(nonCriticalError);
278
+ }
279
+ }, [nonCriticalError, fireNonCriticalErrorEventRef]);
315
280
  var fireScreenEventRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
316
281
  createAnalyticsEvent && (0, _cardAnalytics.fireScreenEvent)(createAnalyticsEvent, fileAttributes);
317
282
  });
@@ -337,72 +302,10 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
337
302
  //----------------------------------------------------------------//
338
303
 
339
304
  var onImageError = function onImageError(newCardPreview) {
340
- if (newCardPreview) {
341
- var failedSSRObject = _objectSpread({
342
- status: 'fail'
343
- }, (0, _analytics.extractErrorInfo)(new _errors.ImageLoadError(newCardPreview.source)));
344
- if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview)) {
345
- ssrReliabilityRef.current.client = failedSSRObject;
346
- }
347
-
348
- /*
349
- 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.
350
- */
351
-
352
- if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview)) {
353
- ssrReliabilityRef.current.server = failedSSRObject;
354
- ssrReliabilityRef.current.client = failedSSRObject;
355
- }
356
- }
357
-
358
- // If the dataURI has been replaced, we can dismiss this error
359
- if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
360
- return;
361
- }
362
- var error = new _errors.ImageLoadError(newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.source);
363
- var isLocal = newCardPreview && (0, _getCardPreview.isLocalPreview)(newCardPreview);
364
- var isSSR = newCardPreview && ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) || (0, _getCardPreview.isSSRDataPreview)(newCardPreview));
365
- if (isLocal || isSSR) {
366
- if (isLocal) {
367
- setIsBannedLocalPreview(true);
368
- fireNonCriticalErrorEventRef.current && fireNonCriticalErrorEventRef.current(error);
369
- }
370
- var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
371
- (0, _mediaClient.isFileIdentifier)(identifier) && (0, _getCardPreview.removeCardPreviewFromCache)(identifier.id, fileImageMode);
372
- setCardPreview(undefined);
373
- } else {
374
- if (!['complete', 'error', 'failed-processing'].includes(status)) {
375
- setStatus('error');
376
- setError(error);
377
- }
378
- }
305
+ onImageErrorBase(newCardPreview);
379
306
  };
380
307
  var onImageLoad = function onImageLoad(newCardPreview) {
381
- if (newCardPreview) {
382
- if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
383
- ssrReliabilityRef.current.client = {
384
- status: 'success'
385
- };
386
- }
387
-
388
- /*
389
- 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.
390
- */
391
-
392
- if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview) && ssrReliabilityRef.current.server.status === 'unknown') {
393
- ssrReliabilityRef.current.server = {
394
- status: 'success'
395
- };
396
- ssrReliabilityRef.current.client = {
397
- status: 'success'
398
- };
399
- }
400
- }
401
-
402
- // If the dataURI has been replaced, we can dismiss this callback
403
- if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
404
- return;
405
- }
308
+ onImageLoadBase(newCardPreview);
406
309
  setPreviewDidRender(true);
407
310
  };
408
311
  var onCardClick = function onCardClick(event, analyticsEvent) {
@@ -420,7 +323,7 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
420
323
  return;
421
324
  }
422
325
  var isVideo = metadata && metadata.mediaType === 'video';
423
- if (useInlinePlayer && isVideo && !!cardPreview) {
326
+ if (useInlinePlayer && isVideo && !!cardPreview && finalStatus !== 'error') {
424
327
  setIsPlayingFile(true);
425
328
  setShouldAutoplay(true);
426
329
  } else if (shouldOpenMediaViewer) {
@@ -433,264 +336,6 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
433
336
  }
434
337
  };
435
338
 
436
- //----------------------------------------------------------------//
437
- //---------------------- Helper Functions -----------------------//
438
- //----------------------------------------------------------------//
439
-
440
- var fetchRemotePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)(function (identifier) {
441
- return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, getMediaBlobUrlAttrs(fileStateValue));
442
- });
443
- var resolvePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)( /*#__PURE__*/function () {
444
- var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(identifier, fileState) {
445
- var filePreview, isRemotePreviewReady, mode, cachedPreview, dimensionsAreBigger, localPreview, value, resolvedFilePreview, _value, type, mediaType, orientation, _dataURI, _dataURI2, preview, source, mediaBlobUrlAttrs, dataURI, remotePreview, wrappedError;
446
- return _regenerator.default.wrap(function _callee$(_context) {
447
- while (1) switch (_context.prev = _context.next) {
448
- case 0:
449
- filePreview = isBannedLocalPreview ? undefined : fileState.status !== 'error' && 'mimeType' in fileState && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType) ? fileState.preview : undefined;
450
- isRemotePreviewReady = (0, _mediaClient.isImageRepresentationReady)(fileState);
451
- _context.prev = 2;
452
- mode = imageURLParams.mode;
453
- cachedPreview = _cache.default.get(identifier.id, mode);
454
- dimensionsAreBigger = (0, _dimensionComparer.isBigger)(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions);
455
- if (!(cachedPreview && !dimensionsAreBigger)) {
456
- _context.next = 8;
457
- break;
458
- }
459
- return _context.abrupt("return", cachedPreview);
460
- case 8:
461
- _context.prev = 8;
462
- if (!filePreview) {
463
- _context.next = 75;
464
- break;
465
- }
466
- _context.prev = 10;
467
- _context.next = 13;
468
- return filePreview;
469
- case 13:
470
- resolvedFilePreview = _context.sent;
471
- value = resolvedFilePreview.value;
472
- _context.next = 20;
473
- break;
474
- case 17:
475
- _context.prev = 17;
476
- _context.t0 = _context["catch"](10);
477
- throw new _errors.LocalPreviewError('local-preview-rejected', _context.t0 instanceof Error ? _context.t0 : undefined);
478
- case 20:
479
- if (!(typeof value === 'string')) {
480
- _context.next = 24;
481
- break;
482
- }
483
- localPreview = {
484
- dataURI: value,
485
- orientation: 1,
486
- source: 'local'
487
- };
488
- _context.next = 57;
489
- break;
490
- case 24:
491
- if (!(value instanceof Blob)) {
492
- _context.next = 56;
493
- break;
494
- }
495
- _value = value, type = _value.type;
496
- mediaType = (0, _mediaCommon.getMediaTypeFromMimeType)(type);
497
- _context.t1 = mediaType;
498
- _context.next = _context.t1 === 'image' ? 30 : _context.t1 === 'video' ? 42 : 53;
499
- break;
500
- case 30:
501
- _context.prev = 30;
502
- _context.next = 33;
503
- return (0, _mediaUi.getOrientation)(value);
504
- case 33:
505
- orientation = _context.sent;
506
- _dataURI = URL.createObjectURL(value);
507
- localPreview = {
508
- dataURI: _dataURI,
509
- orientation: orientation,
510
- source: 'local'
511
- };
512
- _context.next = 41;
513
- break;
514
- case 38:
515
- _context.prev = 38;
516
- _context.t2 = _context["catch"](30);
517
- throw new _errors.LocalPreviewError('local-preview-image', _context.t2 instanceof Error ? _context.t2 : undefined);
518
- case 41:
519
- return _context.abrupt("break", 54);
520
- case 42:
521
- _context.prev = 42;
522
- _context.next = 45;
523
- return (0, _videoSnapshot.takeSnapshot)(value);
524
- case 45:
525
- _dataURI2 = _context.sent;
526
- localPreview = {
527
- dataURI: _dataURI2,
528
- orientation: 1,
529
- source: 'local'
530
- };
531
- _context.next = 52;
532
- break;
533
- case 49:
534
- _context.prev = 49;
535
- _context.t3 = _context["catch"](42);
536
- throw new _errors.LocalPreviewError('local-preview-video', _context.t3 instanceof Error ? _context.t3 : undefined);
537
- case 52:
538
- return _context.abrupt("break", 54);
539
- case 53:
540
- throw new _errors.LocalPreviewError('local-preview-unsupported');
541
- case 54:
542
- _context.next = 57;
543
- break;
544
- case 56:
545
- throw new _errors.LocalPreviewError('local-preview-unsupported');
546
- case 57:
547
- preview = _objectSpread(_objectSpread({}, localPreview), {}, {
548
- dimensions: dimensions
549
- });
550
- _context.t4 = preview.source;
551
- _context.next = _context.t4 === 'local' ? 61 : _context.t4 === 'remote' ? 63 : _context.t4 === 'ssr-server' ? 65 : _context.t4 === 'ssr-client' ? 67 : 69;
552
- break;
553
- case 61:
554
- source = 'cache-local';
555
- return _context.abrupt("break", 70);
556
- case 63:
557
- source = 'cache-remote';
558
- return _context.abrupt("break", 70);
559
- case 65:
560
- source = 'cache-ssr-server';
561
- return _context.abrupt("break", 70);
562
- case 67:
563
- source = 'cache-ssr-client';
564
- return _context.abrupt("break", 70);
565
- case 69:
566
- source = preview.source;
567
- case 70:
568
- // We want to embed some meta context into dataURI for Copy/Paste to work.
569
- mediaBlobUrlAttrs = getMediaBlobUrlAttrs(fileStateValue);
570
- dataURI = mediaBlobUrlAttrs ? (0, _mediaClient.addFileAttrsToUrl)(preview.dataURI, mediaBlobUrlAttrs) : preview.dataURI; // We store new cardPreview into cache
571
- _cache.default.set(identifier.id, mode, _objectSpread(_objectSpread({}, preview), {}, {
572
- source: source,
573
- dataURI: dataURI
574
- }));
575
- setCardPreview(_objectSpread(_objectSpread({}, preview), {}, {
576
- dataURI: dataURI
577
- }));
578
- return _context.abrupt("return");
579
- case 75:
580
- _context.next = 82;
581
- break;
582
- case 77:
583
- _context.prev = 77;
584
- _context.t5 = _context["catch"](8);
585
- /**
586
- * We report the error if:
587
- * - local preview is supported and fails
588
- * - local preview is unsupported and remote preview is NOT READY
589
- * i.e. the function was called for "no reason".
590
- * We DON'T report the error if:
591
- * - local preview is unsupported and remote preview IS READY
592
- * i.e. local preview is available and not supported,
593
- * but we are after the remote preview instead.
594
- */
595
- if (!(0, _errors.isUnsupportedLocalPreviewError)(_context.t5) || (0, _errors.isUnsupportedLocalPreviewError)(_context.t5) && !isRemotePreviewReady) {
596
- fireNonCriticalErrorEventRef.current && fireNonCriticalErrorEventRef.current(_context.t5);
597
- }
598
- /**
599
- * No matter the reason why the local preview failed, we break the process
600
- * if there is no remote preview available
601
- */
602
- if (isRemotePreviewReady) {
603
- _context.next = 82;
604
- break;
605
- }
606
- throw _context.t5;
607
- case 82:
608
- if (isRemotePreviewReady) {
609
- _context.next = 84;
610
- break;
611
- }
612
- throw new _errors.MediaCardError('remote-preview-not-ready');
613
- case 84:
614
- _context.next = 86;
615
- return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, getMediaBlobUrlAttrs(fileStateValue), traceContext);
616
- case 86:
617
- remotePreview = _context.sent;
618
- setCardPreview(remotePreview);
619
- return _context.abrupt("return");
620
- case 91:
621
- _context.prev = 91;
622
- _context.t6 = _context["catch"](2);
623
- wrappedError = (0, _errors.ensureMediaCardError)('preview-fetch', _context.t6); // If remote preview fails, we set status 'error'
624
- // If local preview fails (i.e, no remote preview available),
625
- // we can stay in the same status until there is a remote preview available
626
- // If it's any other error we set status 'error'
627
- if ((0, _errors.isLocalPreviewError)(wrappedError)) {
628
- // This error should already been logged inside the getCardPreview. No need to log it here.
629
- setIsBannedLocalPreview(true);
630
- } else {
631
- if (!['complete', 'error', 'failed-processing'].includes(status)) {
632
- setStatus('error');
633
- setError(wrappedError);
634
- }
635
- }
636
- case 95:
637
- case "end":
638
- return _context.stop();
639
- }
640
- }, _callee, null, [[2, 91], [8, 77], [10, 17], [30, 38], [42, 49]]);
641
- }));
642
- return function (_x, _x2) {
643
- return _ref2.apply(this, arguments);
644
- };
645
- }());
646
-
647
- //----------------------------------------------------------------//
648
- //------------ resolveUpfrontPreview useEffect -------------------//
649
- //----------------------------------------------------------------//
650
- var prevCardPreview = (0, _usePrevious.usePrevious)(cardPreview);
651
- var dimensionsRef = (0, _useCurrentValueRef.useCurrentValueRef)(dimensions);
652
- (0, _react.useEffect)(function () {
653
- var resolveUpfrontPreview = /*#__PURE__*/function () {
654
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(identifier) {
655
- var requestedDimensions, newCardPreview, areValidRequestedDimensions;
656
- return _regenerator.default.wrap(function _callee2$(_context2) {
657
- while (1) switch (_context2.prev = _context2.next) {
658
- case 0:
659
- // We block any possible future call to this method regardless of the outcome (success or fail)
660
- // If it fails, the normal preview fetch should occur after the file state is fetched anyways
661
- wasResolvedUpfrontPreviewRef.current = true;
662
- _context2.prev = 1;
663
- requestedDimensions = _objectSpread({}, dimensions);
664
- _context2.next = 5;
665
- return fetchRemotePreviewRef.current(identifier);
666
- case 5:
667
- newCardPreview = _context2.sent;
668
- areValidRequestedDimensions = !(0, _dimensionComparer.isBigger)(requestedDimensions, dimensionsRef.current); // If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
669
- // the fetched preview is no longer valid, and thus, we dismiss it
670
- if (areValidRequestedDimensions) {
671
- setCardPreview(newCardPreview);
672
- }
673
- _context2.next = 12;
674
- break;
675
- case 10:
676
- _context2.prev = 10;
677
- _context2.t0 = _context2["catch"](1);
678
- case 12:
679
- case "end":
680
- return _context2.stop();
681
- }
682
- }, _callee2, null, [[1, 10]]);
683
- }));
684
- return function resolveUpfrontPreview(_x3) {
685
- return _ref3.apply(this, arguments);
686
- };
687
- }();
688
- var hadSSRCardPreview = ssr === 'client' && !!prevCardPreview && (0, _getCardPreview.isSSRClientPreview)(prevCardPreview);
689
- if ((isCardVisible || hadSSRCardPreview) && !cardPreview && !wasResolvedUpfrontPreviewRef.current) {
690
- resolveUpfrontPreview(identifier);
691
- }
692
- }, [cardPreview, dimensions, dimensionsRef, fetchRemotePreviewRef, identifier, isCardVisible, prevCardPreview, ssr]);
693
-
694
339
  //----------------------------------------------------------------//
695
340
  //------------------------ handle fireCopiedEvent --------------//
696
341
  //----------------------------------------------------------------//
@@ -728,64 +373,19 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
728
373
  //---------------- fetch and resolve card preview ----------------//
729
374
  //----------------------------------------------------------------//
730
375
 
731
- var prevDimensions = (0, _usePrevious.usePrevious)(dimensions);
376
+ var prevStatus = (0, _usePrevious.usePrevious)(finalStatus);
732
377
  var prevIsCardVisible = (0, _usePrevious.usePrevious)(isCardVisible);
733
- var prevStatus = (0, _usePrevious.usePrevious)(status);
734
378
  (0, _react.useEffect)(function () {
735
- if (prevStatus !== undefined && status !== prevStatus) {
379
+ if (prevStatus !== undefined && finalStatus !== prevStatus) {
736
380
  fireOperationalEventRef.current();
737
381
  }
738
- }, [fireOperationalEventRef, prevStatus, status]);
382
+ }, [fireOperationalEventRef, prevStatus, finalStatus]);
739
383
  (0, _react.useEffect)(function () {
740
- var _ssrDataRef$current3;
741
- /**
742
- * Variable turnedVisible should only be true when media card
743
- * was invisible in the previous state and is visible in the current one
744
- *
745
- * prevIsCardVisible | isCardVisible | turnedVisible
746
- * ----------------------------------------------------
747
- * false | false | false
748
- * false | true | true
749
- * true | true | false
750
- * true | false | false (unreachable case)
751
- * ----------------------------------------------------
752
- */
753
-
754
384
  var turnedVisible = !prevIsCardVisible && isCardVisible;
755
385
  if (turnedVisible) {
756
386
  fireCommencedEventRef.current();
757
387
  }
758
- if (cardPreview && turnedVisible && (0, _getCardPreview.isSSRDataPreview)(cardPreview) && (0, _dimensionComparer.isBigger)((_ssrDataRef$current3 = ssrDataRef.current) === null || _ssrDataRef$current3 === void 0 ? void 0 : _ssrDataRef$current3.dimensions, dimensions)) {
759
- // If dimensions from Server have changed and are bigger,
760
- // we need to refetch
761
- // refetchSRRPreview
762
- fetchRemotePreviewRef.current(identifier).then(setCardPreview).catch(function (e) {
763
- var wrappedError = (0, _errors.ensureMediaCardError)('remote-preview-fetch-ssr', e, true);
764
- fireNonCriticalErrorEventRef.current(wrappedError);
765
- });
766
- }
767
- if (fileStateValue && (0, _getCardPreview.shouldResolvePreview)({
768
- status: status,
769
- fileState: fileStateValue,
770
- prevDimensions: prevDimensions,
771
- dimensions: dimensions,
772
- hasCardPreview: !!cardPreview,
773
- isBannedLocalPreview: isBannedLocalPreview,
774
- wasResolvedUpfrontPreview: wasResolvedUpfrontPreviewRef.current
775
- })) {
776
- resolvePreviewRef.current(identifier, fileStateValue);
777
- }
778
- if (turnedVisible && ssr && !!cardPreview && (0, _getCardPreview.isSSRClientPreview)(cardPreview)) {
779
- // Since the SSR preview brings the token in the query params,
780
- // We need to fetch the remote preview to be able to cache it,
781
- fetchRemotePreviewRef.current(identifier).catch(function () {
782
- // No need to log this error.
783
- // If preview fails, it will be refetched later
784
- //TODO: test this catch
785
- // https://product-fabric.atlassian.net/browse/MEX-1071
786
- });
787
- }
788
- }, [cardPreview, dimensions, fetchRemotePreviewRef, fileStateValue, fireCommencedEventRef, fireNonCriticalErrorEventRef, identifier, isBannedLocalPreview, isCardVisible, prevDimensions, prevIsCardVisible, resolvePreviewRef, ssr, status]);
388
+ }, [fireCommencedEventRef, isCardVisible, prevIsCardVisible]);
789
389
 
790
390
  //----------------------------------------------------------------//
791
391
  //----------------- set complete status --------------------------//
@@ -794,12 +394,12 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
794
394
  (0, _react.useEffect)(function () {
795
395
  if (previewDidRender &&
796
396
  // We should't complete if status is uploading
797
- ['loading-preview', 'processing'].includes(status)) {
397
+ ['loading-preview', 'processing'].includes(finalStatus)) {
798
398
  setStatus('complete');
799
399
  // TODO MEX-788: add test for "do not remove the card preview when unsubscribing".
800
400
  setIsBannedLocalPreview(false);
801
401
  }
802
- }, [previewDidRender, status]);
402
+ }, [previewDidRender, finalStatus]);
803
403
 
804
404
  //----------------------------------------------------------------//
805
405
  //----------------- set isPlayingFile state ----------------------//
@@ -816,22 +416,22 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
816
416
  * in order to avoid race conditions of the ViewportDector being unmounted before
817
417
  * it is able to set isCardVisible to true.
818
418
  */
819
- isCardVisible && isVideo && !isPlayingFile && disableOverlay && useInlinePlayer && isVideoPlayable) {
419
+ isCardVisible && isVideo && !isPlayingFile && disableOverlay && useInlinePlayer && isVideoPlayable && finalStatus !== 'error') {
820
420
  setIsPlayingFile(true);
821
421
  }
822
- }, [isCardVisible, disableOverlay, fileAttributes.fileMediatype, fileStateValue, identifier, isBannedLocalPreview, isPlayingFile, useInlinePlayer]);
422
+ }, [isCardVisible, disableOverlay, fileAttributes.fileMediatype, fileStateValue, identifier, isBannedLocalPreview, isPlayingFile, finalStatus, useInlinePlayer]);
823
423
 
824
424
  //----------------------------------------------------------------//
825
425
  //----------------- fireScreenEvent ------------------------------//
826
426
  //----------------------------------------------------------------//
827
427
 
828
428
  (0, _react.useEffect)(function () {
829
- if (prevStatus !== undefined && status !== prevStatus) {
830
- if (status === 'complete' || fileAttributes.fileMediatype === 'video' && !!cardPreview && status === 'processing') {
429
+ if (prevStatus !== undefined && finalStatus !== prevStatus) {
430
+ if (finalStatus === 'complete' || fileAttributes.fileMediatype === 'video' && !!cardPreview && finalStatus === 'processing') {
831
431
  fireScreenEventRef.current();
832
432
  }
833
433
  }
834
- }, [status, prevStatus, fileAttributes, cardPreview, fireScreenEventRef]);
434
+ }, [finalStatus, prevStatus, fileAttributes, cardPreview, fireScreenEventRef]);
835
435
 
836
436
  //----------------------------------------------------------------//
837
437
  //----------------- abort UFO experience -------------------------//
@@ -851,7 +451,7 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
851
451
  var updateFileStateRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
852
452
  if (fileState) {
853
453
  // do not update the card status if the status is final
854
- if (['complete', 'error', 'failed-processing'].includes(status)) {
454
+ if (['complete', 'error', 'failed-processing'].includes(finalStatus)) {
855
455
  return;
856
456
  }
857
457
  if (fileState.status !== 'error') {
@@ -859,7 +459,9 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
859
459
  var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
860
460
  var isPreviewableFileState = !!fileState.preview;
861
461
  var isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
862
- var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType);
462
+ var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState &&
463
+ // CXP-2723 TODO: isPreviewableFileState is most likely redundant
464
+ isSupportedLocalPreview && !!fileState.mimeType && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType);
863
465
  var hasRemotePreview = (0, _mediaClient.isImageRepresentationReady)(fileState);
864
466
  var hasPreview = hasLocalPreview || hasRemotePreview;
865
467
  var newStatus;
@@ -884,7 +486,7 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
884
486
  uploadProgressRef.current = newProgress;
885
487
  } else {
886
488
  var e = new _mediaClientReact.MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
887
- var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
489
+ var errorReason = finalStatus === 'uploading' ? 'upload' : 'metadata-fetch';
888
490
  setError(new _errors.MediaCardError(errorReason, e));
889
491
  setStatus('error');
890
492
  }
@@ -905,15 +507,18 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
905
507
  var mediaItemType = identifier.mediaItemType;
906
508
  var isLazyWithOverride = izLazyOverride === undefined ? isLazy : izLazyOverride;
907
509
 
908
- // Card can be artificially turned visible before entering the viewport
909
- // For example, when we have the image in cache
910
- var nativeLazyLoad = isLazyWithOverride && !isCardVisible;
510
+ // We should natively lazy load an SSR preview when card is not visible,
511
+ // otherwise we'll fire the metadata fetch from outside the viewport
512
+ // Side note: We should not lazy load if the cardPreview is available from local cache,
513
+ // in order to avoid flickers during re-mount of the component
514
+ // CXP-2723 TODO: Create test cases for the above scenarios
515
+ var nativeLazyLoad = isLazyWithOverride && !isCardVisible && cardPreview && (0, _getCardPreview.isSSRPreview)(cardPreview);
911
516
  // Force Media Image to always display img for SSR
912
517
  var forceSyncDisplay = !!ssr;
913
- var mediaCardCursor = (0, _getMediaCardCursor.getMediaCardCursor)(!!useInlinePlayer, !!shouldOpenMediaViewer, status === 'error' || status === 'failed-processing', !!cardPreview, metadata.mediaType);
518
+ var mediaCardCursor = (0, _getMediaCardCursor.getMediaCardCursor)(!!useInlinePlayer, !!shouldOpenMediaViewer, finalStatus === 'error' || finalStatus === 'failed-processing', !!cardPreview, metadata.mediaType);
914
519
  var card = /*#__PURE__*/_react.default.createElement(_cardViewV.CardViewV2, {
915
- status: cardStatusOverride || status,
916
- error: error,
520
+ status: cardStatusOverride || finalStatus,
521
+ error: finalError,
917
522
  mediaItemType: mediaItemType,
918
523
  metadata: metadata,
919
524
  cardPreview: cardPreview,
@@ -976,7 +581,9 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
976
581
  identifier: identifier,
977
582
  autoplay: !!shouldAutoplay,
978
583
  onFullscreenChange: onFullscreenChange,
979
- onError: function onError() {
584
+ onError: function onError(e) {
585
+ setError(new _errors.MediaCardError('error-file-state', e));
586
+ setStatus('error');
980
587
  setIsPlayingFile(false);
981
588
  },
982
589
  onClick: onCardClick,
@@ -994,13 +601,5 @@ var FileCard = exports.FileCard = function FileCard(_ref) {
994
601
  },
995
602
  contextId: contextId,
996
603
  featureFlags: featureFlags
997
- }), document.body) : null, ssr === 'server' && /*#__PURE__*/_react.default.createElement(_globalScope.StoreSSRDataScript, {
998
- identifier: identifier,
999
- dataURI: cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI,
1000
- dimensions: (0, _getDataURIDimension.getRequestedDimensions)({
1001
- dimensions: dimensions,
1002
- element: cardElement
1003
- }),
1004
- error: ((_ssrReliabilityRef$cu = ssrReliabilityRef.current.server) === null || _ssrReliabilityRef$cu === void 0 ? void 0 : _ssrReliabilityRef$cu.status) === 'fail' ? ssrReliabilityRef.current.server : undefined
1005
- }));
604
+ }), document.body) : null, ssr === 'server' && /*#__PURE__*/_react.default.createElement(StoreSSRDataScript, null));
1006
605
  };