@atlaskit/media-file-preview 0.1.0 → 0.2.0
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 +6 -0
- package/dist/cjs/getPreview/getPreview.js +6 -9
- package/dist/cjs/getPreview/index.js +6 -0
- package/dist/cjs/useFilePreview.js +26 -91
- package/dist/es2019/getPreview/getPreview.js +4 -9
- package/dist/es2019/getPreview/index.js +1 -1
- package/dist/es2019/useFilePreview.js +29 -94
- package/dist/esm/getPreview/getPreview.js +5 -8
- package/dist/esm/getPreview/index.js +1 -1
- package/dist/esm/useFilePreview.js +29 -94
- package/dist/types/getPreview/getPreview.d.ts +1 -0
- package/dist/types/getPreview/index.d.ts +1 -1
- package/dist/types/types.d.ts +2 -2
- package/dist/types/useFilePreview.d.ts +3 -4
- package/dist/types-ts4.5/getPreview/getPreview.d.ts +1 -0
- package/dist/types-ts4.5/getPreview/index.d.ts +1 -1
- package/dist/types-ts4.5/types.d.ts +2 -2
- package/dist/types-ts4.5/useFilePreview.d.ts +3 -4
- package/package.json +5 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @atlaskit/media-file-preview
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#65817](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/65817) [`de45ff7a33a9`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/de45ff7a33a9) - Breaking: removed previewDidRender property
|
|
8
|
+
|
|
3
9
|
## 0.1.0
|
|
4
10
|
|
|
5
11
|
### Minor Changes
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.isSSRDataPreview = exports.isSSRClientPreview = exports.isLocalPreview = exports.getSSRPreview = exports.getAndCacheRemotePreview = exports.getAndCacheLocalPreview = void 0;
|
|
7
|
+
exports.isSSRPreview = exports.isSSRDataPreview = exports.isSSRClientPreview = exports.isLocalPreview = exports.getSSRPreview = exports.getAndCacheRemotePreview = exports.getAndCacheLocalPreview = void 0;
|
|
8
8
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
9
|
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
10
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
@@ -23,12 +23,6 @@ var extendAndCachePreview = function extendAndCachePreview(id, mode, preview, me
|
|
|
23
23
|
case 'remote':
|
|
24
24
|
source = 'cache-remote';
|
|
25
25
|
break;
|
|
26
|
-
case 'ssr-server':
|
|
27
|
-
source = 'cache-ssr-server';
|
|
28
|
-
break;
|
|
29
|
-
case 'ssr-client':
|
|
30
|
-
source = 'cache-ssr-client';
|
|
31
|
-
break;
|
|
32
26
|
default:
|
|
33
27
|
source = preview.source;
|
|
34
28
|
}
|
|
@@ -65,12 +59,15 @@ var isLocalPreview = exports.isLocalPreview = function isLocalPreview(preview) {
|
|
|
65
59
|
return localSources.includes(preview.source);
|
|
66
60
|
};
|
|
67
61
|
var isSSRClientPreview = exports.isSSRClientPreview = function isSSRClientPreview(preview) {
|
|
68
|
-
|
|
69
|
-
return ssrClientSources.includes(preview.source);
|
|
62
|
+
return preview.source === 'ssr-client';
|
|
70
63
|
};
|
|
71
64
|
var isSSRDataPreview = exports.isSSRDataPreview = function isSSRDataPreview(preview) {
|
|
72
65
|
return preview.source === 'ssr-data';
|
|
73
66
|
};
|
|
67
|
+
var isSSRPreview = exports.isSSRPreview = function isSSRPreview(preview) {
|
|
68
|
+
var ssrClientSources = ['ssr-client', 'ssr-server', 'ssr-data'];
|
|
69
|
+
return ssrClientSources.includes(preview.source);
|
|
70
|
+
};
|
|
74
71
|
var getAndCacheRemotePreview = exports.getAndCacheRemotePreview = /*#__PURE__*/function () {
|
|
75
72
|
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(mediaClient, id, dimensions, params, mediaBlobUrlAttrs, traceContext) {
|
|
76
73
|
var remotePreview;
|
|
@@ -39,6 +39,12 @@ Object.defineProperty(exports, "isSSRDataPreview", {
|
|
|
39
39
|
return _getPreview.isSSRDataPreview;
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
+
Object.defineProperty(exports, "isSSRPreview", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function get() {
|
|
45
|
+
return _getPreview.isSSRPreview;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
42
48
|
Object.defineProperty(exports, "isSupportedLocalPreview", {
|
|
43
49
|
enumerable: true,
|
|
44
50
|
get: function get() {
|
|
@@ -25,7 +25,6 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
25
25
|
ssr = _ref.ssr,
|
|
26
26
|
dimensions = _ref.dimensions,
|
|
27
27
|
traceContext = _ref.traceContext,
|
|
28
|
-
previewDidRender = _ref.previewDidRender,
|
|
29
28
|
skipRemote = _ref.skipRemote,
|
|
30
29
|
mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs,
|
|
31
30
|
_ref$allowAnimated = _ref.allowAnimated,
|
|
@@ -113,60 +112,15 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
113
112
|
(0, _react.useEffect)(function () {
|
|
114
113
|
setStatus('loading');
|
|
115
114
|
}, [identifier]);
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
if (fileState.status !== 'error') {
|
|
123
|
-
var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
|
|
124
|
-
var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
|
|
125
|
-
var isPreviewableFileState = !!fileState.preview;
|
|
126
|
-
var _isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
|
|
127
|
-
var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && _isSupportedLocalPreview && !!fileState.mimeType && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType);
|
|
128
|
-
var hasRemotePreview = (0, _mediaClient.isImageRepresentationReady)(fileState);
|
|
129
|
-
var hasPreview = hasLocalPreview || hasRemotePreview;
|
|
130
|
-
var newStatus;
|
|
131
|
-
switch (fileState.status) {
|
|
132
|
-
case 'uploading':
|
|
133
|
-
case 'failed-processing':
|
|
134
|
-
case 'processing':
|
|
135
|
-
newStatus = fileState.status;
|
|
136
|
-
break;
|
|
137
|
-
case 'processed':
|
|
138
|
-
if (!isPreviewable || !hasPreview) {
|
|
139
|
-
newStatus = 'complete';
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
142
|
-
newStatus = 'loading-preview';
|
|
143
|
-
break;
|
|
144
|
-
default:
|
|
145
|
-
newStatus = 'loading';
|
|
146
|
-
}
|
|
147
|
-
setStatus(newStatus);
|
|
115
|
+
(0, _react.useEffect)(function () {
|
|
116
|
+
if (status !== 'error') {
|
|
117
|
+
if (!preview) {
|
|
118
|
+
setStatus('loading');
|
|
148
119
|
} else {
|
|
149
|
-
|
|
150
|
-
var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
|
|
151
|
-
setError(new _errors.MediaFilePreviewError(errorReason, e));
|
|
152
|
-
setStatus('error');
|
|
120
|
+
setStatus('complete');
|
|
153
121
|
}
|
|
154
122
|
}
|
|
155
|
-
});
|
|
156
|
-
(0, _react.useEffect)(function () {
|
|
157
|
-
updateFileStateRef.current();
|
|
158
|
-
}, [fileState, updateFileStateRef]);
|
|
159
|
-
(0, _react.useEffect)(function () {
|
|
160
|
-
if (previewDidRender &&
|
|
161
|
-
// We should't complete if status is uploading
|
|
162
|
-
['loading-preview', 'processing'].includes(status)) {
|
|
163
|
-
setStatus('complete');
|
|
164
|
-
// TODO MEX-788: add test for "do not remove the preview when unsubscribing".
|
|
165
|
-
setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
|
|
166
|
-
}
|
|
167
|
-
}, [previewDidRender, status]);
|
|
168
|
-
|
|
169
|
-
// CXP-2723 TODO: Create test cases for banning local preview after status is complete
|
|
123
|
+
}, [preview, status]);
|
|
170
124
|
|
|
171
125
|
//----------------------------------------------------------------
|
|
172
126
|
// Preview Fetch Helper
|
|
@@ -175,40 +129,14 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
175
129
|
return (0, _getPreview.getAndCacheRemotePreview)(mediaClient, identifier.id, requestDimensions || {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
|
|
176
130
|
});
|
|
177
131
|
|
|
178
|
-
//----------------------------------------------------------------
|
|
179
|
-
// Cache SSR Preview
|
|
180
|
-
//----------------------------------------------------------------
|
|
181
|
-
(0, _react.useEffect)(function () {
|
|
182
|
-
if (!skipRemote && ssr && !!preview && (0, _getPreview.isSSRClientPreview)(preview)) {
|
|
183
|
-
// Since the SSR preview brings the token in the query params,
|
|
184
|
-
// We need to fetch the remote preview to be able to cache it,
|
|
185
|
-
getAndCacheRemotePreviewRef.current().catch(function () {
|
|
186
|
-
// No need to log this error.
|
|
187
|
-
// If preview fails, it will be refetched later
|
|
188
|
-
//TODO: test this catch
|
|
189
|
-
// https://product-fabric.atlassian.net/browse/MEX-1071
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}, [getAndCacheRemotePreviewRef, preview, skipRemote, ssr]);
|
|
193
|
-
|
|
194
|
-
//----------------------------------------------------------------
|
|
195
|
-
// Refetch SRR Preview if dimensions from Server have changed and are bigger,
|
|
196
|
-
//----------------------------------------------------------------
|
|
197
|
-
(0, _react.useEffect)(function () {
|
|
198
|
-
// CXP-2813 TODO: This is called too many times if the refetch failed. Should be called only once
|
|
199
|
-
if (preview && !skipRemote && (0, _getPreview.isSSRDataPreview)(preview) && (0, _helpers.isBigger)(preview.dimensions, requestDimensions)) {
|
|
200
|
-
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
201
|
-
var wrappedError = (0, _errors.ensureMediaFilePreviewError)('remote-preview-fetch-ssr', e, true);
|
|
202
|
-
setNonCriticalError(wrappedError);
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, skipRemote]);
|
|
206
|
-
|
|
207
132
|
//----------------------------------------------------------------
|
|
208
133
|
// Upfront Preview
|
|
209
134
|
//----------------------------------------------------------------
|
|
210
135
|
(0, _react.useEffect)(function () {
|
|
211
|
-
if
|
|
136
|
+
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
137
|
+
if (preview) {
|
|
138
|
+
wasResolvedUpfrontPreviewRef.current = true;
|
|
139
|
+
} else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
|
|
212
140
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
213
141
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
214
142
|
wasResolvedUpfrontPreviewRef.current = true;
|
|
@@ -249,13 +177,21 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
249
177
|
});
|
|
250
178
|
}
|
|
251
179
|
// Remote Preview ----------------------------------------------------------------
|
|
252
|
-
else if ((!preview || (0, _helpers.isBigger)(preview.dimensions, requestDimensions)
|
|
180
|
+
else if (!error && !nonCriticalError && (!preview || (0, _helpers.isBigger)(preview.dimensions, requestDimensions) ||
|
|
181
|
+
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
182
|
+
(0, _getPreview.isSSRPreview)(preview)) && !skipRemote && wasResolvedUpfrontPreviewRef.current && !!fileState && (0, _mediaClient.isImageRepresentationReady)(fileState)) {
|
|
253
183
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
254
|
-
|
|
255
|
-
|
|
184
|
+
var wrappedError = (0, _errors.ensureMediaFilePreviewError)('preview-fetch', e);
|
|
185
|
+
if (!preview) {
|
|
186
|
+
setStatus('error');
|
|
187
|
+
setError(wrappedError);
|
|
188
|
+
} else {
|
|
189
|
+
// If there is already a preview, we consider it a non-critical error
|
|
190
|
+
setNonCriticalError(wrappedError);
|
|
191
|
+
}
|
|
256
192
|
});
|
|
257
193
|
}
|
|
258
|
-
}, [fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
194
|
+
}, [error, nonCriticalError, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
259
195
|
|
|
260
196
|
//----------------------------------------------------------------
|
|
261
197
|
// RETURN
|
|
@@ -295,12 +231,10 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
295
231
|
_getPreview.mediaFilePreviewCache.remove(identifier.id, resizeMode);
|
|
296
232
|
setPreview(undefined);
|
|
297
233
|
} else {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
setError(error);
|
|
301
|
-
}
|
|
234
|
+
setStatus('error');
|
|
235
|
+
setError(error);
|
|
302
236
|
}
|
|
303
|
-
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode
|
|
237
|
+
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
|
|
304
238
|
var onImageLoad = (0, _react.useCallback)(function (newPreview) {
|
|
305
239
|
if (newPreview) {
|
|
306
240
|
if ((0, _getPreview.isSSRClientPreview)(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
|
|
@@ -339,6 +273,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
339
273
|
// we might get rid of ssrReliabiltyRef from our hook
|
|
340
274
|
return {
|
|
341
275
|
preview: preview,
|
|
276
|
+
status: status,
|
|
342
277
|
error: error,
|
|
343
278
|
nonCriticalError: nonCriticalError,
|
|
344
279
|
ssrReliabilityRef: ssrReliabilityRef,
|
|
@@ -11,12 +11,6 @@ const extendAndCachePreview = (id, mode, preview, mediaBlobUrlAttrs) => {
|
|
|
11
11
|
case 'remote':
|
|
12
12
|
source = 'cache-remote';
|
|
13
13
|
break;
|
|
14
|
-
case 'ssr-server':
|
|
15
|
-
source = 'cache-ssr-server';
|
|
16
|
-
break;
|
|
17
|
-
case 'ssr-client':
|
|
18
|
-
source = 'cache-ssr-client';
|
|
19
|
-
break;
|
|
20
14
|
default:
|
|
21
15
|
source = preview.source;
|
|
22
16
|
}
|
|
@@ -54,11 +48,12 @@ export const isLocalPreview = preview => {
|
|
|
54
48
|
const localSources = ['local', 'cache-local'];
|
|
55
49
|
return localSources.includes(preview.source);
|
|
56
50
|
};
|
|
57
|
-
export const isSSRClientPreview = preview =>
|
|
58
|
-
|
|
51
|
+
export const isSSRClientPreview = preview => preview.source === 'ssr-client';
|
|
52
|
+
export const isSSRDataPreview = preview => preview.source === 'ssr-data';
|
|
53
|
+
export const isSSRPreview = preview => {
|
|
54
|
+
const ssrClientSources = ['ssr-client', 'ssr-server', 'ssr-data'];
|
|
59
55
|
return ssrClientSources.includes(preview.source);
|
|
60
56
|
};
|
|
61
|
-
export const isSSRDataPreview = preview => preview.source === 'ssr-data';
|
|
62
57
|
export const getAndCacheRemotePreview = async (mediaClient, id, dimensions, params, mediaBlobUrlAttrs, traceContext) => {
|
|
63
58
|
const remotePreview = await getRemotePreview(mediaClient, id, params, traceContext);
|
|
64
59
|
return extendAndCachePreview(id, params.mode, {
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { mediaFilePreviewCache } from './cache';
|
|
2
|
-
export { getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
|
|
2
|
+
export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
|
|
3
3
|
export { isSupportedLocalPreview } from './helpers';
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
import { isImageRepresentationReady } from '@atlaskit/media-client';
|
|
3
|
-
import {
|
|
3
|
+
import { useFileState, useMediaClient } from '@atlaskit/media-client-react';
|
|
4
4
|
import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
|
|
5
5
|
import { extractErrorInfo } from './analytics';
|
|
6
|
-
import { ensureMediaFilePreviewError, ImageLoadError
|
|
7
|
-
import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
|
|
6
|
+
import { ensureMediaFilePreviewError, ImageLoadError } from './errors';
|
|
7
|
+
import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
|
|
8
8
|
import { generateScriptProps, getSSRData } from './globalScope';
|
|
9
9
|
import { createRequestDimensions, isBigger, useCurrentValueRef } from './helpers';
|
|
10
10
|
export const useFilePreview = ({
|
|
@@ -13,7 +13,6 @@ export const useFilePreview = ({
|
|
|
13
13
|
ssr,
|
|
14
14
|
dimensions,
|
|
15
15
|
traceContext,
|
|
16
|
-
previewDidRender,
|
|
17
16
|
skipRemote,
|
|
18
17
|
mediaBlobUrlAttrs,
|
|
19
18
|
allowAnimated = true,
|
|
@@ -89,60 +88,15 @@ export const useFilePreview = ({
|
|
|
89
88
|
useEffect(() => {
|
|
90
89
|
setStatus('loading');
|
|
91
90
|
}, [identifier]);
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (fileState.status !== 'error') {
|
|
99
|
-
const mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
|
|
100
|
-
const isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
|
|
101
|
-
const isPreviewableFileState = !!fileState.preview;
|
|
102
|
-
const isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
|
|
103
|
-
const hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && isSupportedLocalPreview && !!fileState.mimeType && isMimeTypeSupportedByBrowser(fileState.mimeType);
|
|
104
|
-
const hasRemotePreview = isImageRepresentationReady(fileState);
|
|
105
|
-
const hasPreview = hasLocalPreview || hasRemotePreview;
|
|
106
|
-
let newStatus;
|
|
107
|
-
switch (fileState.status) {
|
|
108
|
-
case 'uploading':
|
|
109
|
-
case 'failed-processing':
|
|
110
|
-
case 'processing':
|
|
111
|
-
newStatus = fileState.status;
|
|
112
|
-
break;
|
|
113
|
-
case 'processed':
|
|
114
|
-
if (!isPreviewable || !hasPreview) {
|
|
115
|
-
newStatus = 'complete';
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
newStatus = 'loading-preview';
|
|
119
|
-
break;
|
|
120
|
-
default:
|
|
121
|
-
newStatus = 'loading';
|
|
122
|
-
}
|
|
123
|
-
setStatus(newStatus);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (status !== 'error') {
|
|
93
|
+
if (!preview) {
|
|
94
|
+
setStatus('loading');
|
|
124
95
|
} else {
|
|
125
|
-
|
|
126
|
-
const errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
|
|
127
|
-
setError(new MediaFilePreviewError(errorReason, e));
|
|
128
|
-
setStatus('error');
|
|
96
|
+
setStatus('complete');
|
|
129
97
|
}
|
|
130
98
|
}
|
|
131
|
-
});
|
|
132
|
-
useEffect(() => {
|
|
133
|
-
updateFileStateRef.current();
|
|
134
|
-
}, [fileState, updateFileStateRef]);
|
|
135
|
-
useEffect(() => {
|
|
136
|
-
if (previewDidRender &&
|
|
137
|
-
// We should't complete if status is uploading
|
|
138
|
-
['loading-preview', 'processing'].includes(status)) {
|
|
139
|
-
setStatus('complete');
|
|
140
|
-
// TODO MEX-788: add test for "do not remove the preview when unsubscribing".
|
|
141
|
-
setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
|
|
142
|
-
}
|
|
143
|
-
}, [previewDidRender, status]);
|
|
144
|
-
|
|
145
|
-
// CXP-2723 TODO: Create test cases for banning local preview after status is complete
|
|
99
|
+
}, [preview, status]);
|
|
146
100
|
|
|
147
101
|
//----------------------------------------------------------------
|
|
148
102
|
// Preview Fetch Helper
|
|
@@ -151,40 +105,14 @@ export const useFilePreview = ({
|
|
|
151
105
|
return getAndCacheRemotePreview(mediaClient, identifier.id, requestDimensions || {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
|
|
152
106
|
});
|
|
153
107
|
|
|
154
|
-
//----------------------------------------------------------------
|
|
155
|
-
// Cache SSR Preview
|
|
156
|
-
//----------------------------------------------------------------
|
|
157
|
-
useEffect(() => {
|
|
158
|
-
if (!skipRemote && ssr && !!preview && isSSRClientPreview(preview)) {
|
|
159
|
-
// Since the SSR preview brings the token in the query params,
|
|
160
|
-
// We need to fetch the remote preview to be able to cache it,
|
|
161
|
-
getAndCacheRemotePreviewRef.current().catch(() => {
|
|
162
|
-
// No need to log this error.
|
|
163
|
-
// If preview fails, it will be refetched later
|
|
164
|
-
//TODO: test this catch
|
|
165
|
-
// https://product-fabric.atlassian.net/browse/MEX-1071
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}, [getAndCacheRemotePreviewRef, preview, skipRemote, ssr]);
|
|
169
|
-
|
|
170
|
-
//----------------------------------------------------------------
|
|
171
|
-
// Refetch SRR Preview if dimensions from Server have changed and are bigger,
|
|
172
|
-
//----------------------------------------------------------------
|
|
173
|
-
useEffect(() => {
|
|
174
|
-
// CXP-2813 TODO: This is called too many times if the refetch failed. Should be called only once
|
|
175
|
-
if (preview && !skipRemote && isSSRDataPreview(preview) && isBigger(preview.dimensions, requestDimensions)) {
|
|
176
|
-
getAndCacheRemotePreviewRef.current().then(setPreview).catch(e => {
|
|
177
|
-
const wrappedError = ensureMediaFilePreviewError('remote-preview-fetch-ssr', e, true);
|
|
178
|
-
setNonCriticalError(wrappedError);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, skipRemote]);
|
|
182
|
-
|
|
183
108
|
//----------------------------------------------------------------
|
|
184
109
|
// Upfront Preview
|
|
185
110
|
//----------------------------------------------------------------
|
|
186
111
|
useEffect(() => {
|
|
187
|
-
if
|
|
112
|
+
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
113
|
+
if (preview) {
|
|
114
|
+
wasResolvedUpfrontPreviewRef.current = true;
|
|
115
|
+
} else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
|
|
188
116
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
189
117
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
190
118
|
wasResolvedUpfrontPreviewRef.current = true;
|
|
@@ -227,13 +155,21 @@ export const useFilePreview = ({
|
|
|
227
155
|
});
|
|
228
156
|
}
|
|
229
157
|
// Remote Preview ----------------------------------------------------------------
|
|
230
|
-
else if ((!preview || isBigger(preview.dimensions, requestDimensions)
|
|
158
|
+
else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
|
|
159
|
+
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
160
|
+
isSSRPreview(preview)) && !skipRemote && wasResolvedUpfrontPreviewRef.current && !!fileState && isImageRepresentationReady(fileState)) {
|
|
231
161
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(e => {
|
|
232
|
-
|
|
233
|
-
|
|
162
|
+
const wrappedError = ensureMediaFilePreviewError('preview-fetch', e);
|
|
163
|
+
if (!preview) {
|
|
164
|
+
setStatus('error');
|
|
165
|
+
setError(wrappedError);
|
|
166
|
+
} else {
|
|
167
|
+
// If there is already a preview, we consider it a non-critical error
|
|
168
|
+
setNonCriticalError(wrappedError);
|
|
169
|
+
}
|
|
234
170
|
});
|
|
235
171
|
}
|
|
236
|
-
}, [fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
172
|
+
}, [error, nonCriticalError, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
237
173
|
|
|
238
174
|
//----------------------------------------------------------------
|
|
239
175
|
// RETURN
|
|
@@ -274,12 +210,10 @@ export const useFilePreview = ({
|
|
|
274
210
|
mediaFilePreviewCache.remove(identifier.id, resizeMode);
|
|
275
211
|
setPreview(undefined);
|
|
276
212
|
} else {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
setError(error);
|
|
280
|
-
}
|
|
213
|
+
setStatus('error');
|
|
214
|
+
setError(error);
|
|
281
215
|
}
|
|
282
|
-
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode
|
|
216
|
+
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
|
|
283
217
|
const onImageLoad = useCallback(newPreview => {
|
|
284
218
|
if (newPreview) {
|
|
285
219
|
if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
|
|
@@ -318,6 +252,7 @@ export const useFilePreview = ({
|
|
|
318
252
|
// we might get rid of ssrReliabiltyRef from our hook
|
|
319
253
|
return {
|
|
320
254
|
preview,
|
|
255
|
+
status,
|
|
321
256
|
error,
|
|
322
257
|
nonCriticalError,
|
|
323
258
|
ssrReliabilityRef,
|
|
@@ -16,12 +16,6 @@ var extendAndCachePreview = function extendAndCachePreview(id, mode, preview, me
|
|
|
16
16
|
case 'remote':
|
|
17
17
|
source = 'cache-remote';
|
|
18
18
|
break;
|
|
19
|
-
case 'ssr-server':
|
|
20
|
-
source = 'cache-ssr-server';
|
|
21
|
-
break;
|
|
22
|
-
case 'ssr-client':
|
|
23
|
-
source = 'cache-ssr-client';
|
|
24
|
-
break;
|
|
25
19
|
default:
|
|
26
20
|
source = preview.source;
|
|
27
21
|
}
|
|
@@ -58,12 +52,15 @@ export var isLocalPreview = function isLocalPreview(preview) {
|
|
|
58
52
|
return localSources.includes(preview.source);
|
|
59
53
|
};
|
|
60
54
|
export var isSSRClientPreview = function isSSRClientPreview(preview) {
|
|
61
|
-
|
|
62
|
-
return ssrClientSources.includes(preview.source);
|
|
55
|
+
return preview.source === 'ssr-client';
|
|
63
56
|
};
|
|
64
57
|
export var isSSRDataPreview = function isSSRDataPreview(preview) {
|
|
65
58
|
return preview.source === 'ssr-data';
|
|
66
59
|
};
|
|
60
|
+
export var isSSRPreview = function isSSRPreview(preview) {
|
|
61
|
+
var ssrClientSources = ['ssr-client', 'ssr-server', 'ssr-data'];
|
|
62
|
+
return ssrClientSources.includes(preview.source);
|
|
63
|
+
};
|
|
67
64
|
export var getAndCacheRemotePreview = /*#__PURE__*/function () {
|
|
68
65
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(mediaClient, id, dimensions, params, mediaBlobUrlAttrs, traceContext) {
|
|
69
66
|
var remotePreview;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { mediaFilePreviewCache } from './cache';
|
|
2
|
-
export { getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
|
|
2
|
+
export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
|
|
3
3
|
export { isSupportedLocalPreview } from './helpers';
|
|
@@ -4,11 +4,11 @@ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbol
|
|
|
4
4
|
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; }
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
6
6
|
import { isImageRepresentationReady } from '@atlaskit/media-client';
|
|
7
|
-
import {
|
|
7
|
+
import { useFileState, useMediaClient } from '@atlaskit/media-client-react';
|
|
8
8
|
import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
|
|
9
9
|
import { extractErrorInfo } from './analytics';
|
|
10
|
-
import { ensureMediaFilePreviewError, ImageLoadError
|
|
11
|
-
import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
|
|
10
|
+
import { ensureMediaFilePreviewError, ImageLoadError } from './errors';
|
|
11
|
+
import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
|
|
12
12
|
import { generateScriptProps, getSSRData } from './globalScope';
|
|
13
13
|
import { createRequestDimensions, isBigger, useCurrentValueRef } from './helpers';
|
|
14
14
|
export var useFilePreview = function useFilePreview(_ref) {
|
|
@@ -18,7 +18,6 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
18
18
|
ssr = _ref.ssr,
|
|
19
19
|
dimensions = _ref.dimensions,
|
|
20
20
|
traceContext = _ref.traceContext,
|
|
21
|
-
previewDidRender = _ref.previewDidRender,
|
|
22
21
|
skipRemote = _ref.skipRemote,
|
|
23
22
|
mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs,
|
|
24
23
|
_ref$allowAnimated = _ref.allowAnimated,
|
|
@@ -106,60 +105,15 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
106
105
|
useEffect(function () {
|
|
107
106
|
setStatus('loading');
|
|
108
107
|
}, [identifier]);
|
|
109
|
-
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
if (fileState.status !== 'error') {
|
|
116
|
-
var mediaType = 'mediaType' in fileState ? fileState.mediaType : undefined;
|
|
117
|
-
var isPreviewable = !!mediaType && ['audio', 'video', 'image', 'doc'].indexOf(mediaType) > -1;
|
|
118
|
-
var isPreviewableFileState = !!fileState.preview;
|
|
119
|
-
var _isSupportedLocalPreview = mediaType === 'image' || mediaType === 'video';
|
|
120
|
-
var hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState && _isSupportedLocalPreview && !!fileState.mimeType && isMimeTypeSupportedByBrowser(fileState.mimeType);
|
|
121
|
-
var hasRemotePreview = isImageRepresentationReady(fileState);
|
|
122
|
-
var hasPreview = hasLocalPreview || hasRemotePreview;
|
|
123
|
-
var newStatus;
|
|
124
|
-
switch (fileState.status) {
|
|
125
|
-
case 'uploading':
|
|
126
|
-
case 'failed-processing':
|
|
127
|
-
case 'processing':
|
|
128
|
-
newStatus = fileState.status;
|
|
129
|
-
break;
|
|
130
|
-
case 'processed':
|
|
131
|
-
if (!isPreviewable || !hasPreview) {
|
|
132
|
-
newStatus = 'complete';
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
newStatus = 'loading-preview';
|
|
136
|
-
break;
|
|
137
|
-
default:
|
|
138
|
-
newStatus = 'loading';
|
|
139
|
-
}
|
|
140
|
-
setStatus(newStatus);
|
|
108
|
+
useEffect(function () {
|
|
109
|
+
if (status !== 'error') {
|
|
110
|
+
if (!preview) {
|
|
111
|
+
setStatus('loading');
|
|
141
112
|
} else {
|
|
142
|
-
|
|
143
|
-
var errorReason = status === 'uploading' ? 'upload' : 'metadata-fetch';
|
|
144
|
-
setError(new MediaFilePreviewError(errorReason, e));
|
|
145
|
-
setStatus('error');
|
|
113
|
+
setStatus('complete');
|
|
146
114
|
}
|
|
147
115
|
}
|
|
148
|
-
});
|
|
149
|
-
useEffect(function () {
|
|
150
|
-
updateFileStateRef.current();
|
|
151
|
-
}, [fileState, updateFileStateRef]);
|
|
152
|
-
useEffect(function () {
|
|
153
|
-
if (previewDidRender &&
|
|
154
|
-
// We should't complete if status is uploading
|
|
155
|
-
['loading-preview', 'processing'].includes(status)) {
|
|
156
|
-
setStatus('complete');
|
|
157
|
-
// TODO MEX-788: add test for "do not remove the preview when unsubscribing".
|
|
158
|
-
setIsBannedLocalPreview(false); // CXP-2723 TODO: we might be able to remove this??
|
|
159
|
-
}
|
|
160
|
-
}, [previewDidRender, status]);
|
|
161
|
-
|
|
162
|
-
// CXP-2723 TODO: Create test cases for banning local preview after status is complete
|
|
116
|
+
}, [preview, status]);
|
|
163
117
|
|
|
164
118
|
//----------------------------------------------------------------
|
|
165
119
|
// Preview Fetch Helper
|
|
@@ -168,40 +122,14 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
168
122
|
return getAndCacheRemotePreview(mediaClient, identifier.id, requestDimensions || {}, imageURLParams, mediaBlobUrlAttrs, traceContext);
|
|
169
123
|
});
|
|
170
124
|
|
|
171
|
-
//----------------------------------------------------------------
|
|
172
|
-
// Cache SSR Preview
|
|
173
|
-
//----------------------------------------------------------------
|
|
174
|
-
useEffect(function () {
|
|
175
|
-
if (!skipRemote && ssr && !!preview && isSSRClientPreview(preview)) {
|
|
176
|
-
// Since the SSR preview brings the token in the query params,
|
|
177
|
-
// We need to fetch the remote preview to be able to cache it,
|
|
178
|
-
getAndCacheRemotePreviewRef.current().catch(function () {
|
|
179
|
-
// No need to log this error.
|
|
180
|
-
// If preview fails, it will be refetched later
|
|
181
|
-
//TODO: test this catch
|
|
182
|
-
// https://product-fabric.atlassian.net/browse/MEX-1071
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
}, [getAndCacheRemotePreviewRef, preview, skipRemote, ssr]);
|
|
186
|
-
|
|
187
|
-
//----------------------------------------------------------------
|
|
188
|
-
// Refetch SRR Preview if dimensions from Server have changed and are bigger,
|
|
189
|
-
//----------------------------------------------------------------
|
|
190
|
-
useEffect(function () {
|
|
191
|
-
// CXP-2813 TODO: This is called too many times if the refetch failed. Should be called only once
|
|
192
|
-
if (preview && !skipRemote && isSSRDataPreview(preview) && isBigger(preview.dimensions, requestDimensions)) {
|
|
193
|
-
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
194
|
-
var wrappedError = ensureMediaFilePreviewError('remote-preview-fetch-ssr', e, true);
|
|
195
|
-
setNonCriticalError(wrappedError);
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, skipRemote]);
|
|
199
|
-
|
|
200
125
|
//----------------------------------------------------------------
|
|
201
126
|
// Upfront Preview
|
|
202
127
|
//----------------------------------------------------------------
|
|
203
128
|
useEffect(function () {
|
|
204
|
-
if
|
|
129
|
+
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
130
|
+
if (preview) {
|
|
131
|
+
wasResolvedUpfrontPreviewRef.current = true;
|
|
132
|
+
} else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
|
|
205
133
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
206
134
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
207
135
|
wasResolvedUpfrontPreviewRef.current = true;
|
|
@@ -242,13 +170,21 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
242
170
|
});
|
|
243
171
|
}
|
|
244
172
|
// Remote Preview ----------------------------------------------------------------
|
|
245
|
-
else if ((!preview || isBigger(preview.dimensions, requestDimensions)
|
|
173
|
+
else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
|
|
174
|
+
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
175
|
+
isSSRPreview(preview)) && !skipRemote && wasResolvedUpfrontPreviewRef.current && !!fileState && isImageRepresentationReady(fileState)) {
|
|
246
176
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
247
|
-
|
|
248
|
-
|
|
177
|
+
var wrappedError = ensureMediaFilePreviewError('preview-fetch', e);
|
|
178
|
+
if (!preview) {
|
|
179
|
+
setStatus('error');
|
|
180
|
+
setError(wrappedError);
|
|
181
|
+
} else {
|
|
182
|
+
// If there is already a preview, we consider it a non-critical error
|
|
183
|
+
setNonCriticalError(wrappedError);
|
|
184
|
+
}
|
|
249
185
|
});
|
|
250
186
|
}
|
|
251
|
-
}, [fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
187
|
+
}, [error, nonCriticalError, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
|
|
252
188
|
|
|
253
189
|
//----------------------------------------------------------------
|
|
254
190
|
// RETURN
|
|
@@ -288,12 +224,10 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
288
224
|
mediaFilePreviewCache.remove(identifier.id, resizeMode);
|
|
289
225
|
setPreview(undefined);
|
|
290
226
|
} else {
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
setError(error);
|
|
294
|
-
}
|
|
227
|
+
setStatus('error');
|
|
228
|
+
setError(error);
|
|
295
229
|
}
|
|
296
|
-
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode
|
|
230
|
+
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
|
|
297
231
|
var onImageLoad = useCallback(function (newPreview) {
|
|
298
232
|
if (newPreview) {
|
|
299
233
|
if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
|
|
@@ -332,6 +266,7 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
332
266
|
// we might get rid of ssrReliabiltyRef from our hook
|
|
333
267
|
return {
|
|
334
268
|
preview: preview,
|
|
269
|
+
status: status,
|
|
335
270
|
error: error,
|
|
336
271
|
nonCriticalError: nonCriticalError,
|
|
337
272
|
ssrReliabilityRef: ssrReliabilityRef,
|
|
@@ -5,5 +5,6 @@ export declare const getSSRPreview: (ssr: SSR, mediaClient: MediaClient, id: str
|
|
|
5
5
|
export declare const isLocalPreview: (preview: MediaFilePreview) => boolean;
|
|
6
6
|
export declare const isSSRClientPreview: (preview: MediaFilePreview) => boolean;
|
|
7
7
|
export declare const isSSRDataPreview: (preview: MediaFilePreview) => boolean;
|
|
8
|
+
export declare const isSSRPreview: (preview: MediaFilePreview) => boolean;
|
|
8
9
|
export declare const getAndCacheRemotePreview: (mediaClient: MediaClient, id: string, dimensions: MediaFilePreviewDimensions, params: MediaStoreGetFileImageParams, mediaBlobUrlAttrs?: MediaBlobUrlAttrs, traceContext?: MediaTraceContext) => Promise<MediaFilePreview>;
|
|
9
10
|
export declare const getAndCacheLocalPreview: (id: string, filePreview: FilePreview | Promise<FilePreview>, dimensions: MediaFilePreviewDimensions, mode: MediaStoreGetFileImageParams['mode'], mediaBlobUrlAttrs?: MediaBlobUrlAttrs) => Promise<MediaFilePreview>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { mediaFilePreviewCache } from './cache';
|
|
2
|
-
export { getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
|
|
2
|
+
export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
|
|
3
3
|
export { isSupportedLocalPreview } from './helpers';
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type MediaFilePreviewSource = 'local' | 'remote' | 'ssr-server' | 'ssr-client' | 'ssr-data' | 'cache-local' | 'cache-remote' | '
|
|
1
|
+
export type MediaFilePreviewSource = 'local' | 'remote' | 'ssr-server' | 'ssr-client' | 'ssr-data' | 'cache-local' | 'cache-remote' | 'external';
|
|
2
2
|
export type MediaFilePreviewDimensions = {
|
|
3
3
|
width?: number;
|
|
4
4
|
height?: number;
|
|
@@ -9,4 +9,4 @@ export interface MediaFilePreview {
|
|
|
9
9
|
dimensions?: MediaFilePreviewDimensions;
|
|
10
10
|
source: MediaFilePreviewSource;
|
|
11
11
|
}
|
|
12
|
-
export type MediaFilePreviewStatus = '
|
|
12
|
+
export type MediaFilePreviewStatus = 'loading' | 'complete' | 'error';
|
|
@@ -3,7 +3,7 @@ import { FileIdentifier, MediaBlobUrlAttrs, MediaStoreGetFileImageParams } from
|
|
|
3
3
|
import { MediaTraceContext, SSR } from '@atlaskit/media-common';
|
|
4
4
|
import { SSRStatus } from './analytics';
|
|
5
5
|
import { MediaFilePreviewError } from './errors';
|
|
6
|
-
import { MediaFilePreview, MediaFilePreviewDimensions } from './types';
|
|
6
|
+
import { MediaFilePreview, MediaFilePreviewDimensions, MediaFilePreviewStatus } from './types';
|
|
7
7
|
export interface UseFilePreviewParams {
|
|
8
8
|
/** Instance of file identifier. */
|
|
9
9
|
readonly identifier: FileIdentifier;
|
|
@@ -17,8 +17,6 @@ export interface UseFilePreviewParams {
|
|
|
17
17
|
readonly mediaBlobUrlAttrs?: MediaBlobUrlAttrs;
|
|
18
18
|
/** Trace context to be passed to the backend requests */
|
|
19
19
|
readonly traceContext?: MediaTraceContext;
|
|
20
|
-
/** Notify the hook that the preview successfully rendered */
|
|
21
|
-
readonly previewDidRender?: boolean;
|
|
22
20
|
/** Do not fetch a remote preview. Helpful for lazy loading */
|
|
23
21
|
readonly skipRemote?: boolean;
|
|
24
22
|
/** Define whether an animated image is acceptable to return */
|
|
@@ -29,8 +27,9 @@ export interface UseFilePreviewParams {
|
|
|
29
27
|
*/
|
|
30
28
|
readonly maxAge?: number;
|
|
31
29
|
}
|
|
32
|
-
export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions, traceContext,
|
|
30
|
+
export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions, traceContext, skipRemote, mediaBlobUrlAttrs, allowAnimated, upscale, maxAge, }: UseFilePreviewParams) => {
|
|
33
31
|
preview: MediaFilePreview | undefined;
|
|
32
|
+
status: MediaFilePreviewStatus;
|
|
34
33
|
error: MediaFilePreviewError | undefined;
|
|
35
34
|
nonCriticalError: MediaFilePreviewError | undefined;
|
|
36
35
|
ssrReliabilityRef: import("react").MutableRefObject<SSRStatus>;
|
|
@@ -5,5 +5,6 @@ export declare const getSSRPreview: (ssr: SSR, mediaClient: MediaClient, id: str
|
|
|
5
5
|
export declare const isLocalPreview: (preview: MediaFilePreview) => boolean;
|
|
6
6
|
export declare const isSSRClientPreview: (preview: MediaFilePreview) => boolean;
|
|
7
7
|
export declare const isSSRDataPreview: (preview: MediaFilePreview) => boolean;
|
|
8
|
+
export declare const isSSRPreview: (preview: MediaFilePreview) => boolean;
|
|
8
9
|
export declare const getAndCacheRemotePreview: (mediaClient: MediaClient, id: string, dimensions: MediaFilePreviewDimensions, params: MediaStoreGetFileImageParams, mediaBlobUrlAttrs?: MediaBlobUrlAttrs, traceContext?: MediaTraceContext) => Promise<MediaFilePreview>;
|
|
9
10
|
export declare const getAndCacheLocalPreview: (id: string, filePreview: FilePreview | Promise<FilePreview>, dimensions: MediaFilePreviewDimensions, mode: MediaStoreGetFileImageParams['mode'], mediaBlobUrlAttrs?: MediaBlobUrlAttrs) => Promise<MediaFilePreview>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { mediaFilePreviewCache } from './cache';
|
|
2
|
-
export { getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
|
|
2
|
+
export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
|
|
3
3
|
export { isSupportedLocalPreview } from './helpers';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type MediaFilePreviewSource = 'local' | 'remote' | 'ssr-server' | 'ssr-client' | 'ssr-data' | 'cache-local' | 'cache-remote' | '
|
|
1
|
+
export type MediaFilePreviewSource = 'local' | 'remote' | 'ssr-server' | 'ssr-client' | 'ssr-data' | 'cache-local' | 'cache-remote' | 'external';
|
|
2
2
|
export type MediaFilePreviewDimensions = {
|
|
3
3
|
width?: number;
|
|
4
4
|
height?: number;
|
|
@@ -9,4 +9,4 @@ export interface MediaFilePreview {
|
|
|
9
9
|
dimensions?: MediaFilePreviewDimensions;
|
|
10
10
|
source: MediaFilePreviewSource;
|
|
11
11
|
}
|
|
12
|
-
export type MediaFilePreviewStatus = '
|
|
12
|
+
export type MediaFilePreviewStatus = 'loading' | 'complete' | 'error';
|
|
@@ -3,7 +3,7 @@ import { FileIdentifier, MediaBlobUrlAttrs, MediaStoreGetFileImageParams } from
|
|
|
3
3
|
import { MediaTraceContext, SSR } from '@atlaskit/media-common';
|
|
4
4
|
import { SSRStatus } from './analytics';
|
|
5
5
|
import { MediaFilePreviewError } from './errors';
|
|
6
|
-
import { MediaFilePreview, MediaFilePreviewDimensions } from './types';
|
|
6
|
+
import { MediaFilePreview, MediaFilePreviewDimensions, MediaFilePreviewStatus } from './types';
|
|
7
7
|
export interface UseFilePreviewParams {
|
|
8
8
|
/** Instance of file identifier. */
|
|
9
9
|
readonly identifier: FileIdentifier;
|
|
@@ -17,8 +17,6 @@ export interface UseFilePreviewParams {
|
|
|
17
17
|
readonly mediaBlobUrlAttrs?: MediaBlobUrlAttrs;
|
|
18
18
|
/** Trace context to be passed to the backend requests */
|
|
19
19
|
readonly traceContext?: MediaTraceContext;
|
|
20
|
-
/** Notify the hook that the preview successfully rendered */
|
|
21
|
-
readonly previewDidRender?: boolean;
|
|
22
20
|
/** Do not fetch a remote preview. Helpful for lazy loading */
|
|
23
21
|
readonly skipRemote?: boolean;
|
|
24
22
|
/** Define whether an animated image is acceptable to return */
|
|
@@ -29,8 +27,9 @@ export interface UseFilePreviewParams {
|
|
|
29
27
|
*/
|
|
30
28
|
readonly maxAge?: number;
|
|
31
29
|
}
|
|
32
|
-
export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions, traceContext,
|
|
30
|
+
export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions, traceContext, skipRemote, mediaBlobUrlAttrs, allowAnimated, upscale, maxAge, }: UseFilePreviewParams) => {
|
|
33
31
|
preview: MediaFilePreview | undefined;
|
|
32
|
+
status: MediaFilePreviewStatus;
|
|
34
33
|
error: MediaFilePreviewError | undefined;
|
|
35
34
|
nonCriticalError: MediaFilePreviewError | undefined;
|
|
36
35
|
ssrReliabilityRef: import("react").MutableRefObject<SSRStatus>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/media-file-preview",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A React Hook to fetch and render file previews. It's overloaded with fancy features like SSR, lazy loading, memory cache and local preview.",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"category": "Components"
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
|
-
"repository": "https://bitbucket.org/atlassian/atlassian-frontend",
|
|
19
|
+
"repository": "https://bitbucket.org/atlassian/atlassian-frontend-mirror",
|
|
20
20
|
"main": "dist/cjs/index.js",
|
|
21
21
|
"module": "dist/esm/index.js",
|
|
22
22
|
"module:es2019": "dist/es2019/index.js",
|
|
@@ -49,11 +49,14 @@
|
|
|
49
49
|
"devDependencies": {
|
|
50
50
|
"@af/integration-testing": "*",
|
|
51
51
|
"@af/visual-regression": "*",
|
|
52
|
+
"@atlaskit/media-state": "^1.0.3",
|
|
53
|
+
"@atlaskit/media-test-data": "^1.1.1",
|
|
52
54
|
"@atlaskit/section-message": "^6.4.17",
|
|
53
55
|
"@atlaskit/ssr": "*",
|
|
54
56
|
"@atlaskit/visual-regression": "*",
|
|
55
57
|
"@atlassian/atlassian-frontend-prettier-config-1.0.0": "npm:@atlassian/atlassian-frontend-prettier-config@1.0.0",
|
|
56
58
|
"@testing-library/react": "^12.1.5",
|
|
59
|
+
"@testing-library/react-hooks": "^8.0.1",
|
|
57
60
|
"react-dom": "^16.8.0",
|
|
58
61
|
"typescript": "~4.9.5",
|
|
59
62
|
"wait-for-expect": "^1.2.0"
|