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