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