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