@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
@@ -0,0 +1,592 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useFilePreview = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+ var _react = _interopRequireWildcard(require("react"));
14
+ var _mediaClient = require("@atlaskit/media-client");
15
+ var _mediaClientReact = require("@atlaskit/media-client-react");
16
+ var _mediaCommon = require("@atlaskit/media-common");
17
+ var _mediaUi = require("@atlaskit/media-ui");
18
+ var _errors = require("../../errors");
19
+ var _analytics = require("../../utils/analytics");
20
+ var _dimensionComparer = require("../../utils/dimensionComparer");
21
+ var _globalScope = require("../../utils/globalScope");
22
+ var _useCurrentValueRef = require("../../utils/useCurrentValueRef");
23
+ var _usePrevious = require("../../utils/usePrevious");
24
+ var _videoSnapshot = require("../../utils/videoSnapshot");
25
+ var _getCardPreview = require("../getCardPreview");
26
+ var _cache = _interopRequireDefault(require("../getCardPreview/cache"));
27
+ 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); }
28
+ 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; }
29
+ 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; }
30
+ 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; }
31
+ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
32
+ var _ref$resizeMode = _ref.resizeMode,
33
+ resizeMode = _ref$resizeMode === void 0 ? 'crop' : _ref$resizeMode,
34
+ identifier = _ref.identifier,
35
+ ssr = _ref.ssr,
36
+ mediaClient = _ref.mediaClient,
37
+ dimensions = _ref.dimensions,
38
+ requestedDimensions = _ref.requestedDimensions,
39
+ traceContext = _ref.traceContext,
40
+ previewDidRender = _ref.previewDidRender,
41
+ skipRemote = _ref.skipRemote,
42
+ mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs;
43
+ var _useState = (0, _react.useState)(),
44
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
45
+ error = _useState2[0],
46
+ setError = _useState2[1];
47
+ var _useState3 = (0, _react.useState)(),
48
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
49
+ nonCriticalError = _useState4[0],
50
+ setNonCriticalError = _useState4[1];
51
+ //----------------------------------------------------------------//
52
+ //---------------- State Initializer Functions -------------------//
53
+ //----------------------------------------------------------------//
54
+
55
+ var ssrDataRef = (0, _react.useRef)();
56
+ var ssrReliabilityRef = (0, _react.useRef)({
57
+ server: {
58
+ status: 'unknown'
59
+ },
60
+ client: {
61
+ status: 'unknown'
62
+ }
63
+ });
64
+ var imageURLParams = (0, _react.useMemo)(function () {
65
+ return _objectSpread(_objectSpread({
66
+ collection: identifier.collectionName,
67
+ mode: resizeMode === 'stretchy-fit' ? 'full-fit' : resizeMode
68
+ }, requestedDimensions), {}, {
69
+ allowAnimated: true
70
+ });
71
+ }, [requestedDimensions, identifier.collectionName, resizeMode]);
72
+ var getSSRPreview = function getSSRPreview(ssr, identifier, mediaClient) {
73
+ var _ssrDataRef$current, _ssrDataRef$current2;
74
+ ssrDataRef.current = (0, _globalScope.getSSRData)(identifier);
75
+ if ((_ssrDataRef$current = ssrDataRef.current) !== null && _ssrDataRef$current !== void 0 && _ssrDataRef$current.error) {
76
+ ssrReliabilityRef.current.server = _objectSpread({
77
+ status: 'fail'
78
+ }, ssrDataRef.current.error);
79
+ }
80
+ if (!((_ssrDataRef$current2 = ssrDataRef.current) !== null && _ssrDataRef$current2 !== void 0 && _ssrDataRef$current2.dataURI)) {
81
+ try {
82
+ return (0, _getCardPreview.getSSRCardPreview)(ssr, mediaClient, identifier.id, imageURLParams, mediaBlobUrlAttrs);
83
+ } catch (e) {
84
+ ssrReliabilityRef.current[ssr] = _objectSpread({
85
+ status: 'fail'
86
+ }, (0, _analytics.extractErrorInfo)(e));
87
+ }
88
+ } else {
89
+ return {
90
+ dataURI: ssrDataRef.current.dataURI,
91
+ source: 'ssr-data'
92
+ };
93
+ }
94
+ };
95
+ var cardPreviewInitializer = function cardPreviewInitializer() {
96
+ var cardPreview;
97
+ var id = identifier.id;
98
+ var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
99
+ cardPreview = (0, _getCardPreview.getCardPreviewFromCache)(id, fileImageMode);
100
+ if (!cardPreview && ssr) {
101
+ cardPreview = getSSRPreview(ssr, identifier, mediaClient);
102
+ }
103
+ return cardPreview;
104
+ };
105
+ var _useState5 = (0, _react.useState)(cardPreviewInitializer),
106
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
107
+ cardPreview = _useState6[0],
108
+ setCardPreview = _useState6[1];
109
+ var _useFileState = (0, _mediaClientReact.useFileState)(identifier.id, {
110
+ skipRemote: skipRemote,
111
+ collectionName: identifier.collectionName,
112
+ occurrenceKey: identifier.occurrenceKey
113
+ }),
114
+ fileState = _useFileState.fileState;
115
+
116
+ //----------------------------------------------------------------//
117
+ //------------ State, Refs & Initial Values ----------------------//
118
+ //----------------------------------------------------------------//
119
+
120
+ var _useState7 = (0, _react.useState)('loading'),
121
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
122
+ status = _useState8[0],
123
+ setStatus = _useState8[1];
124
+ (0, _react.useEffect)(function () {
125
+ setStatus('loading');
126
+ }, [identifier]);
127
+ var _useState9 = (0, _react.useState)(false),
128
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
129
+ isBannedLocalPreview = _useState10[0],
130
+ setIsBannedLocalPreview = _useState10[1];
131
+ var wasResolvedUpfrontPreviewRef = (0, _react.useRef)(false);
132
+
133
+ //----------------------------------------------------------------//
134
+ //---------------------- Helper Functions -----------------------//
135
+ //----------------------------------------------------------------//
136
+
137
+ var fetchRemotePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)(function (identifier) {
138
+ return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, mediaBlobUrlAttrs);
139
+ });
140
+ var resolvePreviewRef = (0, _useCurrentValueRef.useCurrentValueRef)( /*#__PURE__*/function () {
141
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(identifier, fileState) {
142
+ var filePreview, isRemotePreviewReady, mode, cachedPreview, dimensionsAreBigger, localPreview, value, resolvedFilePreview, _value, type, mediaType, orientation, _dataURI, _dataURI2, preview, source, dataURI, remotePreview, wrappedError;
143
+ return _regenerator.default.wrap(function _callee$(_context) {
144
+ while (1) switch (_context.prev = _context.next) {
145
+ case 0:
146
+ filePreview = isBannedLocalPreview ? undefined : fileState.status !== 'error' && 'mimeType' in fileState && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType) ? fileState.preview : undefined;
147
+ isRemotePreviewReady = (0, _mediaClient.isImageRepresentationReady)(fileState);
148
+ _context.prev = 2;
149
+ mode = imageURLParams.mode;
150
+ cachedPreview = _cache.default.get(identifier.id, mode);
151
+ dimensionsAreBigger = (0, _dimensionComparer.isBigger)(cachedPreview === null || cachedPreview === void 0 ? void 0 : cachedPreview.dimensions, dimensions);
152
+ if (!(cachedPreview && !dimensionsAreBigger)) {
153
+ _context.next = 8;
154
+ break;
155
+ }
156
+ return _context.abrupt("return", cachedPreview);
157
+ case 8:
158
+ _context.prev = 8;
159
+ if (!filePreview) {
160
+ _context.next = 74;
161
+ break;
162
+ }
163
+ _context.prev = 10;
164
+ _context.next = 13;
165
+ return filePreview;
166
+ case 13:
167
+ resolvedFilePreview = _context.sent;
168
+ value = resolvedFilePreview.value;
169
+ _context.next = 20;
170
+ break;
171
+ case 17:
172
+ _context.prev = 17;
173
+ _context.t0 = _context["catch"](10);
174
+ throw new _errors.LocalPreviewError('local-preview-rejected', _context.t0 instanceof Error ? _context.t0 : undefined);
175
+ case 20:
176
+ if (!(typeof value === 'string')) {
177
+ _context.next = 24;
178
+ break;
179
+ }
180
+ localPreview = {
181
+ dataURI: value,
182
+ orientation: 1,
183
+ source: 'local'
184
+ };
185
+ _context.next = 57;
186
+ break;
187
+ case 24:
188
+ if (!(value instanceof Blob)) {
189
+ _context.next = 56;
190
+ break;
191
+ }
192
+ _value = value, type = _value.type;
193
+ mediaType = (0, _mediaCommon.getMediaTypeFromMimeType)(type);
194
+ _context.t1 = mediaType;
195
+ _context.next = _context.t1 === 'image' ? 30 : _context.t1 === 'video' ? 42 : 53;
196
+ break;
197
+ case 30:
198
+ _context.prev = 30;
199
+ _context.next = 33;
200
+ return (0, _mediaUi.getOrientation)(value);
201
+ case 33:
202
+ orientation = _context.sent;
203
+ _dataURI = URL.createObjectURL(value);
204
+ localPreview = {
205
+ dataURI: _dataURI,
206
+ orientation: orientation,
207
+ source: 'local'
208
+ };
209
+ _context.next = 41;
210
+ break;
211
+ case 38:
212
+ _context.prev = 38;
213
+ _context.t2 = _context["catch"](30);
214
+ throw new _errors.LocalPreviewError('local-preview-image', _context.t2 instanceof Error ? _context.t2 : undefined);
215
+ case 41:
216
+ return _context.abrupt("break", 54);
217
+ case 42:
218
+ _context.prev = 42;
219
+ _context.next = 45;
220
+ return (0, _videoSnapshot.takeSnapshot)(value);
221
+ case 45:
222
+ _dataURI2 = _context.sent;
223
+ localPreview = {
224
+ dataURI: _dataURI2,
225
+ orientation: 1,
226
+ source: 'local'
227
+ };
228
+ _context.next = 52;
229
+ break;
230
+ case 49:
231
+ _context.prev = 49;
232
+ _context.t3 = _context["catch"](42);
233
+ throw new _errors.LocalPreviewError('local-preview-video', _context.t3 instanceof Error ? _context.t3 : undefined);
234
+ case 52:
235
+ return _context.abrupt("break", 54);
236
+ case 53:
237
+ throw new _errors.LocalPreviewError('local-preview-unsupported');
238
+ case 54:
239
+ _context.next = 57;
240
+ break;
241
+ case 56:
242
+ throw new _errors.LocalPreviewError('local-preview-unsupported');
243
+ case 57:
244
+ preview = _objectSpread(_objectSpread({}, localPreview), {}, {
245
+ dimensions: dimensions
246
+ });
247
+ _context.t4 = preview.source;
248
+ _context.next = _context.t4 === 'local' ? 61 : _context.t4 === 'remote' ? 63 : _context.t4 === 'ssr-server' ? 65 : _context.t4 === 'ssr-client' ? 67 : 69;
249
+ break;
250
+ case 61:
251
+ source = 'cache-local';
252
+ return _context.abrupt("break", 70);
253
+ case 63:
254
+ source = 'cache-remote';
255
+ return _context.abrupt("break", 70);
256
+ case 65:
257
+ source = 'cache-ssr-server';
258
+ return _context.abrupt("break", 70);
259
+ case 67:
260
+ source = 'cache-ssr-client';
261
+ return _context.abrupt("break", 70);
262
+ case 69:
263
+ source = preview.source;
264
+ case 70:
265
+ // We want to embed some meta context into dataURI for Copy/Paste to work.
266
+ dataURI = mediaBlobUrlAttrs ? (0, _mediaClient.addFileAttrsToUrl)(preview.dataURI, mediaBlobUrlAttrs) : preview.dataURI; // We store new cardPreview into cache
267
+ _cache.default.set(identifier.id, mode, _objectSpread(_objectSpread({}, preview), {}, {
268
+ source: source,
269
+ dataURI: dataURI
270
+ }));
271
+ setCardPreview(_objectSpread(_objectSpread({}, preview), {}, {
272
+ dataURI: dataURI
273
+ }));
274
+ return _context.abrupt("return");
275
+ case 74:
276
+ _context.next = 81;
277
+ break;
278
+ case 76:
279
+ _context.prev = 76;
280
+ _context.t5 = _context["catch"](8);
281
+ /**
282
+ * We report the error if:
283
+ * - local preview is supported and fails
284
+ * - local preview is unsupported and remote preview is NOT READY
285
+ * i.e. the function was called for "no reason".
286
+ * We DON'T report the error if:
287
+ * - local preview is unsupported and remote preview IS READY
288
+ * i.e. local preview is available and not supported,
289
+ * but we are after the remote preview instead.
290
+ */
291
+ if (!(0, _errors.isUnsupportedLocalPreviewError)(_context.t5) || (0, _errors.isUnsupportedLocalPreviewError)(_context.t5) && !isRemotePreviewReady) {
292
+ // CXP-2723 TODO: We might have to wrap this error in MediaCardError
293
+ setNonCriticalError(_context.t5);
294
+ }
295
+ /**
296
+ * No matter the reason why the local preview failed, we break the process
297
+ * if there is no remote preview available
298
+ */
299
+ if (isRemotePreviewReady) {
300
+ _context.next = 81;
301
+ break;
302
+ }
303
+ throw _context.t5;
304
+ case 81:
305
+ if (isRemotePreviewReady) {
306
+ _context.next = 83;
307
+ break;
308
+ }
309
+ throw new _errors.MediaCardError('remote-preview-not-ready');
310
+ case 83:
311
+ _context.next = 85;
312
+ return (0, _getCardPreview.fetchAndCacheRemotePreview)(mediaClient, identifier.id, dimensions !== null && dimensions !== void 0 ? dimensions : {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
313
+ case 85:
314
+ remotePreview = _context.sent;
315
+ setCardPreview(remotePreview);
316
+ return _context.abrupt("return");
317
+ case 90:
318
+ _context.prev = 90;
319
+ _context.t6 = _context["catch"](2);
320
+ wrappedError = (0, _errors.ensureMediaCardError)('preview-fetch', _context.t6); // If remote preview fails, we set status 'error'
321
+ // If local preview fails (i.e, no remote preview available),
322
+ // we can stay in the same status until there is a remote preview available
323
+ // If it's any other error we set status 'error'
324
+ if ((0, _errors.isLocalPreviewError)(wrappedError)) {
325
+ // This error should already been logged inside the getCardPreview. No need to log it here.
326
+ setIsBannedLocalPreview(true);
327
+ } else {
328
+ if (!['complete', 'error', 'failed-processing'].includes(status)) {
329
+ setStatus('error');
330
+ setError(wrappedError);
331
+ }
332
+ }
333
+ case 94:
334
+ case "end":
335
+ return _context.stop();
336
+ }
337
+ }, _callee, null, [[2, 90], [8, 76], [10, 17], [30, 38], [42, 49]]);
338
+ }));
339
+ return function (_x, _x2) {
340
+ return _ref2.apply(this, arguments);
341
+ };
342
+ }());
343
+
344
+ //----------------------------------------------------------------//
345
+ //------------ resolveUpfrontPreview useEffect -------------------//
346
+ //----------------------------------------------------------------//
347
+ var prevCardPreview = (0, _usePrevious.usePrevious)(cardPreview);
348
+ var dimensionsRef = (0, _useCurrentValueRef.useCurrentValueRef)(dimensions);
349
+ (0, _react.useEffect)(function () {
350
+ var resolveUpfrontPreview = /*#__PURE__*/function () {
351
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(identifier) {
352
+ var fetchedDimensions, newCardPreview, areValidFetchedDimensions;
353
+ return _regenerator.default.wrap(function _callee2$(_context2) {
354
+ while (1) switch (_context2.prev = _context2.next) {
355
+ case 0:
356
+ // We block any possible future call to this method regardless of the outcome (success or fail)
357
+ // If it fails, the normal preview fetch should occur after the file state is fetched anyways
358
+ wasResolvedUpfrontPreviewRef.current = true;
359
+ _context2.prev = 1;
360
+ fetchedDimensions = _objectSpread({}, dimensions);
361
+ _context2.next = 5;
362
+ return fetchRemotePreviewRef.current(identifier);
363
+ case 5:
364
+ newCardPreview = _context2.sent;
365
+ areValidFetchedDimensions = !(0, _dimensionComparer.isBigger)(fetchedDimensions, dimensionsRef.current); // If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
366
+ // the fetched preview is no longer valid, and thus, we dismiss it
367
+ if (areValidFetchedDimensions) {
368
+ setCardPreview(newCardPreview);
369
+ }
370
+ _context2.next = 12;
371
+ break;
372
+ case 10:
373
+ _context2.prev = 10;
374
+ _context2.t0 = _context2["catch"](1);
375
+ case 12:
376
+ case "end":
377
+ return _context2.stop();
378
+ }
379
+ }, _callee2, null, [[1, 10]]);
380
+ }));
381
+ return function resolveUpfrontPreview(_x3) {
382
+ return _ref3.apply(this, arguments);
383
+ };
384
+ }();
385
+ var hadSSRCardPreview = ssr === 'client' && !!prevCardPreview && (0, _getCardPreview.isSSRClientPreview)(prevCardPreview);
386
+
387
+ // CXP-2723 TODO: `hadSSRCardPreview` is most likely redundant
388
+ if (!wasResolvedUpfrontPreviewRef.current && (!skipRemote || hadSSRCardPreview) && !cardPreview) {
389
+ resolveUpfrontPreview(identifier);
390
+ }
391
+ }, [cardPreview, dimensions, dimensionsRef, fetchRemotePreviewRef, identifier, skipRemote, prevCardPreview, ssr]);
392
+
393
+ //----------------------------------------------------------------//
394
+ //---------------- fetch and resolve card preview ----------------//
395
+ //----------------------------------------------------------------//
396
+
397
+ var prevDimensions = (0, _usePrevious.usePrevious)(dimensions);
398
+ (0, _react.useEffect)(function () {
399
+ var _ssrDataRef$current3;
400
+ if (cardPreview && !skipRemote && (0, _getCardPreview.isSSRDataPreview)(cardPreview) && (0, _dimensionComparer.isBigger)((_ssrDataRef$current3 = ssrDataRef.current) === null || _ssrDataRef$current3 === void 0 ? void 0 : _ssrDataRef$current3.dimensions, dimensions)) {
401
+ // refetchSRRPreview: If dimensions from Server have changed and are bigger,
402
+ // we need to refetch
403
+ fetchRemotePreviewRef.current(identifier).then(setCardPreview).catch(function (e) {
404
+ var wrappedError = (0, _errors.ensureMediaCardError)('remote-preview-fetch-ssr', e, true);
405
+ setNonCriticalError(wrappedError);
406
+ });
407
+ }
408
+ // CXP-2723 TODO: The above and below preview fetch logic seem very similar and could be revisted
409
+ // Both compare dimensions, but the above is only for SSR in order to refetchSRRPreview and
410
+ // will swallow any errors. Below logic only applies when there is no card preview or the dimensions
411
+ // are bigger.
412
+ if (fileState && (0, _getCardPreview.shouldResolvePreview)({
413
+ status: status,
414
+ fileState: fileState,
415
+ prevDimensions: prevDimensions,
416
+ dimensions: dimensions,
417
+ hasCardPreview: !!cardPreview,
418
+ isBannedLocalPreview: isBannedLocalPreview,
419
+ wasResolvedUpfrontPreview: wasResolvedUpfrontPreviewRef.current
420
+ })) {
421
+ resolvePreviewRef.current(identifier, fileState);
422
+ }
423
+ if (!skipRemote && ssr && !!cardPreview && (0, _getCardPreview.isSSRClientPreview)(cardPreview)) {
424
+ // Since the SSR preview brings the token in the query params,
425
+ // We need to fetch the remote preview to be able to cache it,
426
+ fetchRemotePreviewRef.current(identifier).catch(function () {
427
+ // No need to log this error.
428
+ // If preview fails, it will be refetched later
429
+ //TODO: test this catch
430
+ // https://product-fabric.atlassian.net/browse/MEX-1071
431
+ });
432
+ }
433
+ }, [cardPreview, dimensions, fetchRemotePreviewRef, fileState, identifier, isBannedLocalPreview, prevDimensions, resolvePreviewRef, skipRemote, ssr, status]);
434
+
435
+ //----------------------------------------------------------------//
436
+ //----------------- set complete status --------------------------//
437
+ //----------------------------------------------------------------//
438
+
439
+ (0, _react.useEffect)(function () {
440
+ if (previewDidRender &&
441
+ // We should't complete if status is uploading
442
+ ['loading-preview', 'processing'].includes(status)) {
443
+ setStatus('complete');
444
+ // TODO MEX-788: add test for "do not remove the card preview when unsubscribing".
445
+ setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
446
+ }
447
+ }, [previewDidRender, status]);
448
+
449
+ // CXP-2723 TODO: Create test cases for banning local preview after status is complete
450
+
451
+ //----------------------------------------------------------------//
452
+ //------------------ Subscribe to file state ---------------------//
453
+ //----------------------------------------------------------------//
454
+
455
+ var updateFileStateRef = (0, _useCurrentValueRef.useCurrentValueRef)(function () {
456
+ if (fileState) {
457
+ // do not update the card status if the status is final
458
+ if (['complete', 'error', 'failed-processing'].includes(status)) {
459
+ return;
460
+ }
461
+ if (fileState.status !== 'error') {
462
+ var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
463
+ var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
464
+ var isPreviewableFileState = !!fileState.preview;
465
+ var isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
466
+ var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType);
467
+ var hasRemotePreview = (0, _mediaClient.isImageRepresentationReady)(fileState);
468
+ var hasPreview = hasLocalPreview || hasRemotePreview;
469
+ var newStatus;
470
+ switch (fileState.status) {
471
+ case 'uploading':
472
+ case 'failed-processing':
473
+ case 'processing':
474
+ newStatus = fileState.status;
475
+ break;
476
+ case 'processed':
477
+ if (!isPreviewable || !hasPreview) {
478
+ newStatus = 'complete';
479
+ break;
480
+ }
481
+ newStatus = 'loading-preview';
482
+ break;
483
+ default:
484
+ newStatus = 'loading';
485
+ }
486
+ setStatus(newStatus);
487
+ } else {
488
+ var e = new _mediaClientReact.MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
489
+ var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
490
+ setError(new _errors.MediaCardError(errorReason, e));
491
+ setStatus('error');
492
+ }
493
+ }
494
+ });
495
+ (0, _react.useEffect)(function () {
496
+ updateFileStateRef.current();
497
+ }, [fileState, updateFileStateRef]);
498
+ var onImageError = function onImageError(newCardPreview) {
499
+ if (newCardPreview) {
500
+ var failedSSRObject = _objectSpread({
501
+ status: 'fail'
502
+ }, (0, _analytics.extractErrorInfo)(new _errors.ImageLoadError(newCardPreview.source)));
503
+ if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview)) {
504
+ ssrReliabilityRef.current.client = failedSSRObject;
505
+ }
506
+
507
+ /*
508
+ 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.
509
+ */
510
+
511
+ if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview)) {
512
+ ssrReliabilityRef.current.server = failedSSRObject;
513
+ ssrReliabilityRef.current.client = failedSSRObject;
514
+ }
515
+ }
516
+
517
+ // If the dataURI has been replaced, we can dismiss this error
518
+ if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
519
+ return;
520
+ }
521
+ var error = new _errors.ImageLoadError(newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.source);
522
+ var isLocal = newCardPreview && (0, _getCardPreview.isLocalPreview)(newCardPreview);
523
+ var isSSR = newCardPreview && ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) || (0, _getCardPreview.isSSRDataPreview)(newCardPreview));
524
+ if (isLocal || isSSR) {
525
+ if (isLocal) {
526
+ setIsBannedLocalPreview(true);
527
+ setNonCriticalError(error);
528
+ }
529
+ var fileImageMode = (0, _mediaClient.imageResizeModeToFileImageMode)(resizeMode);
530
+ (0, _getCardPreview.removeCardPreviewFromCache)(identifier.id, fileImageMode);
531
+ setCardPreview(undefined);
532
+ } else {
533
+ if (!['complete', 'error', 'failed-processing'].includes(status)) {
534
+ setStatus('error');
535
+ setError(error);
536
+ }
537
+ }
538
+ };
539
+ var onImageLoad = function onImageLoad(newCardPreview) {
540
+ if (newCardPreview) {
541
+ if ((0, _getCardPreview.isSSRClientPreview)(newCardPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
542
+ ssrReliabilityRef.current.client = {
543
+ status: 'success'
544
+ };
545
+ }
546
+
547
+ /*
548
+ 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.
549
+ */
550
+
551
+ if ((0, _getCardPreview.isSSRDataPreview)(newCardPreview) && ssrReliabilityRef.current.server.status === 'unknown') {
552
+ ssrReliabilityRef.current.server = {
553
+ status: 'success'
554
+ };
555
+ ssrReliabilityRef.current.client = {
556
+ status: 'success'
557
+ };
558
+ }
559
+ }
560
+
561
+ // If the dataURI has been replaced, we can dismiss this callback
562
+ if ((newCardPreview === null || newCardPreview === void 0 ? void 0 : newCardPreview.dataURI) !== (cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI)) {
563
+ return;
564
+ }
565
+ };
566
+
567
+ //----------------------------------------------------------------//
568
+ // RETURN
569
+ //----------------------------------------------------------------//
570
+
571
+ var StoreSSRDataScriptComponent = function StoreSSRDataScriptComponent() {
572
+ var _ssrReliabilityRef$cu;
573
+ return /*#__PURE__*/_react.default.createElement(_globalScope.StoreSSRDataScript, {
574
+ identifier: identifier,
575
+ dataURI: cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.dataURI,
576
+ dimensions: requestedDimensions,
577
+ error: ((_ssrReliabilityRef$cu = ssrReliabilityRef.current.server) === null || _ssrReliabilityRef$cu === void 0 ? void 0 : _ssrReliabilityRef$cu.status) === 'fail' ? ssrReliabilityRef.current.server : undefined
578
+ });
579
+ };
580
+
581
+ // CXP-2723 TODO: should consider simplifying our analytics, and how
582
+ // we might get rid of ssrReliabiltyRef from our hook
583
+ return {
584
+ cardPreview: cardPreview,
585
+ error: error,
586
+ nonCriticalError: nonCriticalError,
587
+ ssrReliabilityRef: ssrReliabilityRef,
588
+ onImageError: onImageError,
589
+ onImageLoad: onImageLoad,
590
+ StoreSSRDataScript: StoreSSRDataScriptComponent
591
+ };
592
+ };
@@ -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.4.4",
122
+ packageName: "77.4.6",
123
123
  componentName: 'mediaInlineCard',
124
124
  component: 'mediaInlineCard'
125
125
  };
@@ -14,7 +14,7 @@ var _mediaClient = require("@atlaskit/media-client");
14
14
  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; }
15
15
  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; }
16
16
  var packageName = "@atlaskit/media-card";
17
- var packageVersion = "77.4.4";
17
+ var packageVersion = "77.4.6";
18
18
  var concurrentExperience;
19
19
  var getExperience = function getExperience(id) {
20
20
  if (!concurrentExperience) {
@@ -27,7 +27,7 @@ import { getMediaCardCursor } from '../utils/getMediaCardCursor';
27
27
  import { completeUfoExperience, startUfoExperience, abortUfoExperience } from '../utils/ufoExperiences';
28
28
  import { generateUniqueId } from '../utils/generateUniqueId';
29
29
  const packageName = "@atlaskit/media-card";
30
- const packageVersion = "77.4.4";
30
+ const packageVersion = "77.4.6";
31
31
  export class CardBase extends Component {
32
32
  constructor(props) {
33
33
  super(props);
@@ -347,6 +347,7 @@ export class CardBase extends Component {
347
347
  shouldOpenMediaViewer
348
348
  } = this.props;
349
349
  const {
350
+ status,
350
351
  cardPreview
351
352
  } = this.state;
352
353
  const {
@@ -357,7 +358,7 @@ export class CardBase extends Component {
357
358
  return;
358
359
  }
359
360
  const isVideo = metadata && metadata.mediaType === 'video';
360
- if (useInlinePlayer && isVideo && !!cardPreview) {
361
+ if (useInlinePlayer && isVideo && !!cardPreview && status !== 'error') {
361
362
  this.setState({
362
363
  isPlayingFile: true,
363
364
  shouldAutoplay: true
@@ -383,8 +384,10 @@ export class CardBase extends Component {
383
384
  });
384
385
  }
385
386
  });
386
- _defineProperty(this, "onInlinePlayerError", () => {
387
+ _defineProperty(this, "onInlinePlayerError", e => {
387
388
  this.setState({
389
+ error: new MediaCardError('error-file-state', e),
390
+ status: 'error',
388
391
  isPlayingFile: false
389
392
  });
390
393
  });
@@ -834,7 +837,7 @@ export class CardBase extends Component {
834
837
  mimeType
835
838
  } = getFileDetails(identifier, fileState);
836
839
  const isVideoPlayable = videoIsPlayable(isBannedLocalPreview, fileState, mimeType);
837
- if (isVideo && !isPlayingFile && disableOverlay && useInlinePlayer && isVideoPlayable) {
840
+ if (isVideo && !isPlayingFile && disableOverlay && useInlinePlayer && isVideoPlayable && status !== 'error') {
838
841
  this.setState({
839
842
  isPlayingFile: true
840
843
  });
@@ -28,6 +28,8 @@ export const extractFilePreviewStatus = (fileState, isBannedLocalPreview) => {
28
28
  isSupportedByBrowser
29
29
  };
30
30
  };
31
+
32
+ // CXP-2723 TODO: Review this in relation to removing status from the hook
31
33
  export const isPreviewableStatus = (cardStatus, {
32
34
  isPreviewable,
33
35
  hasPreview,