@atlaskit/media-file-preview 0.4.1 → 0.5.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 +12 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/useFilePreview.js +41 -17
- package/dist/cjs/useMediaImage.js +64 -0
- package/dist/es2019/index.js +2 -1
- package/dist/es2019/useFilePreview.js +32 -13
- package/dist/es2019/useMediaImage.js +58 -0
- package/dist/esm/index.js +2 -1
- package/dist/esm/useFilePreview.js +41 -17
- package/dist/esm/useMediaImage.js +58 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/useMediaImage.d.ts +43 -0
- package/dist/types-ts4.5/index.d.ts +3 -0
- package/dist/types-ts4.5/useMediaImage.d.ts +43 -0
- package/example-helpers/TerminalTextDisplay.tsx +30 -0
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/media-file-preview
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#73279](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/73279) [`cdad00f21119`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/cdad00f21119) - Create useMediaImage hook
|
|
8
|
+
|
|
9
|
+
## 0.4.2
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [#71793](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/71793) [`26115be71855`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/26115be71855) - Added support for Error File State
|
|
14
|
+
|
|
3
15
|
## 0.4.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/cjs/index.js
CHANGED
|
@@ -9,4 +9,11 @@ Object.defineProperty(exports, "useFilePreview", {
|
|
|
9
9
|
return _useFilePreview.useFilePreview;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
|
-
|
|
12
|
+
Object.defineProperty(exports, "useMediaImage", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function get() {
|
|
15
|
+
return _useMediaImage.useMediaImage;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var _useFilePreview = require("./useFilePreview");
|
|
19
|
+
var _useMediaImage = require("./useMediaImage");
|
|
@@ -48,7 +48,10 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
48
48
|
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
49
49
|
isBannedLocalPreview = _useState8[0],
|
|
50
50
|
setIsBannedLocalPreview = _useState8[1];
|
|
51
|
-
var
|
|
51
|
+
var _useState9 = (0, _react.useState)('not-resolved'),
|
|
52
|
+
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
53
|
+
upfrontPreviewStatus = _useState10[0],
|
|
54
|
+
setUpfrontPreviewStatus = _useState10[1];
|
|
52
55
|
var ssrReliabilityRef = (0, _react.useRef)({
|
|
53
56
|
server: {
|
|
54
57
|
status: 'unknown'
|
|
@@ -100,10 +103,15 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
100
103
|
}
|
|
101
104
|
}
|
|
102
105
|
};
|
|
103
|
-
var
|
|
104
|
-
|
|
105
|
-
preview =
|
|
106
|
-
setPreview =
|
|
106
|
+
var _useState11 = (0, _react.useState)(previewInitializer),
|
|
107
|
+
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
|
|
108
|
+
preview = _useState12[0],
|
|
109
|
+
setPreview = _useState12[1];
|
|
110
|
+
|
|
111
|
+
//----------------------------------------------------------------
|
|
112
|
+
// FILE STATE
|
|
113
|
+
//----------------------------------------------------------------
|
|
114
|
+
|
|
107
115
|
var _useFileState = (0, _mediaClientReact.useFileState)(identifier.id, {
|
|
108
116
|
skipRemote: skipRemote,
|
|
109
117
|
collectionName: identifier.collectionName,
|
|
@@ -111,6 +119,18 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
111
119
|
}),
|
|
112
120
|
fileState = _useFileState.fileState;
|
|
113
121
|
|
|
122
|
+
// Derived from File State
|
|
123
|
+
var fileStatus = fileState === null || fileState === void 0 ? void 0 : fileState.status;
|
|
124
|
+
var isBackendPreviewReady = !!fileState && (0, _mediaClient.isImageRepresentationReady)(fileState);
|
|
125
|
+
var fileStateErrorMessage = (fileState === null || fileState === void 0 ? void 0 : fileState.status) === 'error' ? fileState.message : undefined;
|
|
126
|
+
var _ref2 = fileState && (fileState === null || fileState === void 0 ? void 0 : fileState.status) !== 'error' ? fileState : {},
|
|
127
|
+
_ref2$preview = _ref2.preview,
|
|
128
|
+
localBinary = _ref2$preview === void 0 ? undefined : _ref2$preview,
|
|
129
|
+
_ref2$mediaType = _ref2.mediaType,
|
|
130
|
+
mediaType = _ref2$mediaType === void 0 ? undefined : _ref2$mediaType,
|
|
131
|
+
_ref2$mimeType = _ref2.mimeType,
|
|
132
|
+
mimeType = _ref2$mimeType === void 0 ? undefined : _ref2$mimeType;
|
|
133
|
+
|
|
114
134
|
//----------------------------------------------------------------
|
|
115
135
|
// Update status
|
|
116
136
|
//----------------------------------------------------------------
|
|
@@ -121,16 +141,19 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
121
141
|
}, [identifier]);
|
|
122
142
|
(0, _react.useEffect)(function () {
|
|
123
143
|
if (status !== 'error') {
|
|
124
|
-
if (preview ||
|
|
144
|
+
if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
|
|
125
145
|
setStatus('complete');
|
|
126
|
-
} else if (!preview &&
|
|
146
|
+
} else if (!preview && fileStatus === 'failed-processing' && !isBackendPreviewReady) {
|
|
127
147
|
setStatus('error');
|
|
128
148
|
setError(new _errors.MediaFilePreviewError('failed-processing'));
|
|
149
|
+
} else if (!preview && fileStatus === 'error' && upfrontPreviewStatus === 'resolved') {
|
|
150
|
+
setStatus('error');
|
|
151
|
+
setError(new _errors.MediaFilePreviewError('metadata-fetch', new Error(fileStateErrorMessage)));
|
|
129
152
|
} else {
|
|
130
153
|
setStatus('loading');
|
|
131
154
|
}
|
|
132
155
|
}
|
|
133
|
-
}, [preview, status,
|
|
156
|
+
}, [preview, status, fileStatus, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
|
|
134
157
|
|
|
135
158
|
//----------------------------------------------------------------
|
|
136
159
|
// Preview Fetch Helper
|
|
@@ -145,11 +168,11 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
145
168
|
(0, _react.useEffect)(function () {
|
|
146
169
|
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
147
170
|
if (preview) {
|
|
148
|
-
|
|
149
|
-
} else if (!preview &&
|
|
171
|
+
setUpfrontPreviewStatus('resolved');
|
|
172
|
+
} else if (!preview && upfrontPreviewStatus === 'not-resolved' && !skipRemote) {
|
|
150
173
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
151
174
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
152
|
-
|
|
175
|
+
setUpfrontPreviewStatus('resolving');
|
|
153
176
|
var fetchedDimensions = _objectSpread({}, requestDimensions);
|
|
154
177
|
getAndCacheRemotePreviewRef.current().then(function (newPreview) {
|
|
155
178
|
// If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
|
|
@@ -159,9 +182,11 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
159
182
|
}
|
|
160
183
|
}).catch(function () {
|
|
161
184
|
// NO need to log error. If this call fails, a refetch will happen after
|
|
185
|
+
}).finally(function () {
|
|
186
|
+
setUpfrontPreviewStatus('resolved');
|
|
162
187
|
});
|
|
163
188
|
}
|
|
164
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote]);
|
|
189
|
+
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote, upfrontPreviewStatus]);
|
|
165
190
|
|
|
166
191
|
//----------------------------------------------------------------
|
|
167
192
|
// Cache, Local & Remote Preview
|
|
@@ -175,12 +200,12 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
175
200
|
setPreview(cachedPreview);
|
|
176
201
|
}
|
|
177
202
|
// Local Preview ----------------------------------------------------------------
|
|
178
|
-
else if (!preview && !isBannedLocalPreview &&
|
|
203
|
+
else if (!preview && !isBannedLocalPreview && localBinary && (0, _getPreview.isSupportedLocalPreview)(mediaType) && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(mimeType || '')) {
|
|
179
204
|
// Local preview is available only if it's supported by browser and supported by Media Card (isSupportedLocalPreview)
|
|
180
205
|
// For example, SVGs are mime type NOT supported by browser but media type supported by Media Card (image)
|
|
181
206
|
// Then, local Preview NOT available
|
|
182
207
|
|
|
183
|
-
(0, _getPreview.getAndCacheLocalPreview)(identifier.id,
|
|
208
|
+
(0, _getPreview.getAndCacheLocalPreview)(identifier.id, localBinary, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(function (e) {
|
|
184
209
|
setIsBannedLocalPreview(true);
|
|
185
210
|
// CXP-2723 TODO: We might have to wrap this error in MediaCardError
|
|
186
211
|
setNonCriticalError(e);
|
|
@@ -189,7 +214,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
189
214
|
// Remote Preview ----------------------------------------------------------------
|
|
190
215
|
else if (!error && !nonCriticalError && (!preview || (0, _helpers.isBigger)(preview.dimensions, requestDimensions) ||
|
|
191
216
|
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
192
|
-
(0, _getPreview.isSSRPreview)(preview)) && !skipRemote &&
|
|
217
|
+
(0, _getPreview.isSSRPreview)(preview)) && !skipRemote && upfrontPreviewStatus !== 'not-resolved' && isBackendPreviewReady) {
|
|
193
218
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
194
219
|
var wrappedError = (0, _errors.ensureMediaFilePreviewError)('preview-fetch', e);
|
|
195
220
|
if (!preview) {
|
|
@@ -201,7 +226,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
201
226
|
}
|
|
202
227
|
});
|
|
203
228
|
}
|
|
204
|
-
}, [error, nonCriticalError,
|
|
229
|
+
}, [error, nonCriticalError, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote, isBackendPreviewReady, localBinary, mediaType, mimeType, upfrontPreviewStatus]);
|
|
205
230
|
|
|
206
231
|
//----------------------------------------------------------------
|
|
207
232
|
// RETURN
|
|
@@ -237,7 +262,6 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
|
|
|
237
262
|
setStatus('error');
|
|
238
263
|
setError(_error);
|
|
239
264
|
}
|
|
240
|
-
// Should be set after the status
|
|
241
265
|
setPreview(undefined);
|
|
242
266
|
}
|
|
243
267
|
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useMediaImage = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _useFilePreview2 = require("./useFilePreview");
|
|
9
|
+
var useMediaImage = exports.useMediaImage = function useMediaImage(_ref) {
|
|
10
|
+
var identifier = _ref.identifier,
|
|
11
|
+
resizeMode = _ref.resizeMode,
|
|
12
|
+
dimensions = _ref.dimensions,
|
|
13
|
+
ssr = _ref.ssr,
|
|
14
|
+
mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs,
|
|
15
|
+
traceContext = _ref.traceContext,
|
|
16
|
+
skipRemote = _ref.skipRemote,
|
|
17
|
+
allowAnimated = _ref.allowAnimated,
|
|
18
|
+
upscale = _ref.upscale,
|
|
19
|
+
maxAge = _ref.maxAge,
|
|
20
|
+
onLoadCallback = _ref.onLoad,
|
|
21
|
+
onErrorCallback = _ref.onError;
|
|
22
|
+
var _useFilePreview = (0, _useFilePreview2.useFilePreview)({
|
|
23
|
+
identifier: identifier,
|
|
24
|
+
resizeMode: resizeMode,
|
|
25
|
+
dimensions: dimensions,
|
|
26
|
+
ssr: ssr,
|
|
27
|
+
mediaBlobUrlAttrs: mediaBlobUrlAttrs,
|
|
28
|
+
traceContext: traceContext,
|
|
29
|
+
skipRemote: skipRemote,
|
|
30
|
+
allowAnimated: allowAnimated,
|
|
31
|
+
upscale: upscale,
|
|
32
|
+
maxAge: maxAge
|
|
33
|
+
}),
|
|
34
|
+
preview = _useFilePreview.preview,
|
|
35
|
+
status = _useFilePreview.status,
|
|
36
|
+
error = _useFilePreview.error,
|
|
37
|
+
onImageError = _useFilePreview.onImageError,
|
|
38
|
+
onImageLoad = _useFilePreview.onImageLoad,
|
|
39
|
+
getSsrScriptProps = _useFilePreview.getSsrScriptProps;
|
|
40
|
+
var onLoad = (0, _react.useCallback)(function () {
|
|
41
|
+
onLoadCallback && onLoadCallback();
|
|
42
|
+
onImageLoad(preview);
|
|
43
|
+
}, [onImageLoad, onLoadCallback, preview]);
|
|
44
|
+
var onError = (0, _react.useCallback)(function () {
|
|
45
|
+
onErrorCallback && onErrorCallback();
|
|
46
|
+
onImageError(preview);
|
|
47
|
+
}, [onErrorCallback, onImageError, preview]);
|
|
48
|
+
var getImgProps = (0, _react.useCallback)(function () {
|
|
49
|
+
return {
|
|
50
|
+
src: preview === null || preview === void 0 ? void 0 : preview.dataURI,
|
|
51
|
+
onLoad: onLoad,
|
|
52
|
+
onError: onError,
|
|
53
|
+
'data-test-file-id': identifier.id,
|
|
54
|
+
'data-test-collection': identifier.collectionName,
|
|
55
|
+
'data-test-preview-source': preview === null || preview === void 0 ? void 0 : preview.source
|
|
56
|
+
};
|
|
57
|
+
}, [identifier.collectionName, identifier.id, onError, onLoad, preview === null || preview === void 0 ? void 0 : preview.dataURI, preview === null || preview === void 0 ? void 0 : preview.source]);
|
|
58
|
+
return {
|
|
59
|
+
status: status,
|
|
60
|
+
error: error,
|
|
61
|
+
getImgProps: getImgProps,
|
|
62
|
+
getSsrScriptProps: getSsrScriptProps
|
|
63
|
+
};
|
|
64
|
+
};
|
package/dist/es2019/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useFilePreview } from './useFilePreview';
|
|
1
|
+
export { useFilePreview } from './useFilePreview';
|
|
2
|
+
export { useMediaImage } from './useMediaImage';
|
|
@@ -25,7 +25,7 @@ export const useFilePreview = ({
|
|
|
25
25
|
const [error, setError] = useState();
|
|
26
26
|
const [nonCriticalError, setNonCriticalError] = useState();
|
|
27
27
|
const [isBannedLocalPreview, setIsBannedLocalPreview] = useState(false);
|
|
28
|
-
const
|
|
28
|
+
const [upfrontPreviewStatus, setUpfrontPreviewStatus] = useState('not-resolved');
|
|
29
29
|
const ssrReliabilityRef = useRef({
|
|
30
30
|
server: {
|
|
31
31
|
status: 'unknown'
|
|
@@ -80,6 +80,11 @@ export const useFilePreview = ({
|
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
82
|
const [preview, setPreview] = useState(previewInitializer);
|
|
83
|
+
|
|
84
|
+
//----------------------------------------------------------------
|
|
85
|
+
// FILE STATE
|
|
86
|
+
//----------------------------------------------------------------
|
|
87
|
+
|
|
83
88
|
const {
|
|
84
89
|
fileState
|
|
85
90
|
} = useFileState(identifier.id, {
|
|
@@ -88,6 +93,16 @@ export const useFilePreview = ({
|
|
|
88
93
|
occurrenceKey: identifier.occurrenceKey
|
|
89
94
|
});
|
|
90
95
|
|
|
96
|
+
// Derived from File State
|
|
97
|
+
const fileStatus = fileState === null || fileState === void 0 ? void 0 : fileState.status;
|
|
98
|
+
const isBackendPreviewReady = !!fileState && isImageRepresentationReady(fileState);
|
|
99
|
+
const fileStateErrorMessage = (fileState === null || fileState === void 0 ? void 0 : fileState.status) === 'error' ? fileState.message : undefined;
|
|
100
|
+
const {
|
|
101
|
+
preview: localBinary = undefined,
|
|
102
|
+
mediaType = undefined,
|
|
103
|
+
mimeType = undefined
|
|
104
|
+
} = fileState && (fileState === null || fileState === void 0 ? void 0 : fileState.status) !== 'error' ? fileState : {};
|
|
105
|
+
|
|
91
106
|
//----------------------------------------------------------------
|
|
92
107
|
// Update status
|
|
93
108
|
//----------------------------------------------------------------
|
|
@@ -98,16 +113,19 @@ export const useFilePreview = ({
|
|
|
98
113
|
}, [identifier]);
|
|
99
114
|
useEffect(() => {
|
|
100
115
|
if (status !== 'error') {
|
|
101
|
-
if (preview ||
|
|
116
|
+
if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
|
|
102
117
|
setStatus('complete');
|
|
103
|
-
} else if (!preview &&
|
|
118
|
+
} else if (!preview && fileStatus === 'failed-processing' && !isBackendPreviewReady) {
|
|
104
119
|
setStatus('error');
|
|
105
120
|
setError(new MediaFilePreviewError('failed-processing'));
|
|
121
|
+
} else if (!preview && fileStatus === 'error' && upfrontPreviewStatus === 'resolved') {
|
|
122
|
+
setStatus('error');
|
|
123
|
+
setError(new MediaFilePreviewError('metadata-fetch', new Error(fileStateErrorMessage)));
|
|
106
124
|
} else {
|
|
107
125
|
setStatus('loading');
|
|
108
126
|
}
|
|
109
127
|
}
|
|
110
|
-
}, [preview, status,
|
|
128
|
+
}, [preview, status, fileStatus, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
|
|
111
129
|
|
|
112
130
|
//----------------------------------------------------------------
|
|
113
131
|
// Preview Fetch Helper
|
|
@@ -122,11 +140,11 @@ export const useFilePreview = ({
|
|
|
122
140
|
useEffect(() => {
|
|
123
141
|
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
124
142
|
if (preview) {
|
|
125
|
-
|
|
126
|
-
} else if (!preview &&
|
|
143
|
+
setUpfrontPreviewStatus('resolved');
|
|
144
|
+
} else if (!preview && upfrontPreviewStatus === 'not-resolved' && !skipRemote) {
|
|
127
145
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
128
146
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
129
|
-
|
|
147
|
+
setUpfrontPreviewStatus('resolving');
|
|
130
148
|
const fetchedDimensions = {
|
|
131
149
|
...requestDimensions
|
|
132
150
|
};
|
|
@@ -138,9 +156,11 @@ export const useFilePreview = ({
|
|
|
138
156
|
}
|
|
139
157
|
}).catch(() => {
|
|
140
158
|
// NO need to log error. If this call fails, a refetch will happen after
|
|
159
|
+
}).finally(() => {
|
|
160
|
+
setUpfrontPreviewStatus('resolved');
|
|
141
161
|
});
|
|
142
162
|
}
|
|
143
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote]);
|
|
163
|
+
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote, upfrontPreviewStatus]);
|
|
144
164
|
|
|
145
165
|
//----------------------------------------------------------------
|
|
146
166
|
// Cache, Local & Remote Preview
|
|
@@ -154,12 +174,12 @@ export const useFilePreview = ({
|
|
|
154
174
|
setPreview(cachedPreview);
|
|
155
175
|
}
|
|
156
176
|
// Local Preview ----------------------------------------------------------------
|
|
157
|
-
else if (!preview && !isBannedLocalPreview &&
|
|
177
|
+
else if (!preview && !isBannedLocalPreview && localBinary && isSupportedLocalPreview(mediaType) && isMimeTypeSupportedByBrowser(mimeType || '')) {
|
|
158
178
|
// Local preview is available only if it's supported by browser and supported by Media Card (isSupportedLocalPreview)
|
|
159
179
|
// For example, SVGs are mime type NOT supported by browser but media type supported by Media Card (image)
|
|
160
180
|
// Then, local Preview NOT available
|
|
161
181
|
|
|
162
|
-
getAndCacheLocalPreview(identifier.id,
|
|
182
|
+
getAndCacheLocalPreview(identifier.id, localBinary, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(e => {
|
|
163
183
|
setIsBannedLocalPreview(true);
|
|
164
184
|
// CXP-2723 TODO: We might have to wrap this error in MediaCardError
|
|
165
185
|
setNonCriticalError(e);
|
|
@@ -168,7 +188,7 @@ export const useFilePreview = ({
|
|
|
168
188
|
// Remote Preview ----------------------------------------------------------------
|
|
169
189
|
else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
|
|
170
190
|
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
171
|
-
isSSRPreview(preview)) && !skipRemote &&
|
|
191
|
+
isSSRPreview(preview)) && !skipRemote && upfrontPreviewStatus !== 'not-resolved' && isBackendPreviewReady) {
|
|
172
192
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(e => {
|
|
173
193
|
const wrappedError = ensureMediaFilePreviewError('preview-fetch', e);
|
|
174
194
|
if (!preview) {
|
|
@@ -180,7 +200,7 @@ export const useFilePreview = ({
|
|
|
180
200
|
}
|
|
181
201
|
});
|
|
182
202
|
}
|
|
183
|
-
}, [error, nonCriticalError,
|
|
203
|
+
}, [error, nonCriticalError, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote, isBackendPreviewReady, localBinary, mediaType, mimeType, upfrontPreviewStatus]);
|
|
184
204
|
|
|
185
205
|
//----------------------------------------------------------------
|
|
186
206
|
// RETURN
|
|
@@ -216,7 +236,6 @@ export const useFilePreview = ({
|
|
|
216
236
|
setStatus('error');
|
|
217
237
|
setError(error);
|
|
218
238
|
}
|
|
219
|
-
// Should be set after the status
|
|
220
239
|
setPreview(undefined);
|
|
221
240
|
}
|
|
222
241
|
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useFilePreview } from './useFilePreview';
|
|
3
|
+
export const useMediaImage = ({
|
|
4
|
+
identifier,
|
|
5
|
+
resizeMode,
|
|
6
|
+
dimensions,
|
|
7
|
+
ssr,
|
|
8
|
+
mediaBlobUrlAttrs,
|
|
9
|
+
traceContext,
|
|
10
|
+
skipRemote,
|
|
11
|
+
allowAnimated,
|
|
12
|
+
upscale,
|
|
13
|
+
maxAge,
|
|
14
|
+
onLoad: onLoadCallback,
|
|
15
|
+
onError: onErrorCallback
|
|
16
|
+
}) => {
|
|
17
|
+
const {
|
|
18
|
+
preview,
|
|
19
|
+
status,
|
|
20
|
+
error,
|
|
21
|
+
onImageError,
|
|
22
|
+
onImageLoad,
|
|
23
|
+
getSsrScriptProps
|
|
24
|
+
} = useFilePreview({
|
|
25
|
+
identifier,
|
|
26
|
+
resizeMode,
|
|
27
|
+
dimensions,
|
|
28
|
+
ssr,
|
|
29
|
+
mediaBlobUrlAttrs,
|
|
30
|
+
traceContext,
|
|
31
|
+
skipRemote,
|
|
32
|
+
allowAnimated,
|
|
33
|
+
upscale,
|
|
34
|
+
maxAge
|
|
35
|
+
});
|
|
36
|
+
const onLoad = useCallback(() => {
|
|
37
|
+
onLoadCallback && onLoadCallback();
|
|
38
|
+
onImageLoad(preview);
|
|
39
|
+
}, [onImageLoad, onLoadCallback, preview]);
|
|
40
|
+
const onError = useCallback(() => {
|
|
41
|
+
onErrorCallback && onErrorCallback();
|
|
42
|
+
onImageError(preview);
|
|
43
|
+
}, [onErrorCallback, onImageError, preview]);
|
|
44
|
+
const getImgProps = useCallback(() => ({
|
|
45
|
+
src: preview === null || preview === void 0 ? void 0 : preview.dataURI,
|
|
46
|
+
onLoad,
|
|
47
|
+
onError,
|
|
48
|
+
'data-test-file-id': identifier.id,
|
|
49
|
+
'data-test-collection': identifier.collectionName,
|
|
50
|
+
'data-test-preview-source': preview === null || preview === void 0 ? void 0 : preview.source
|
|
51
|
+
}), [identifier.collectionName, identifier.id, onError, onLoad, preview === null || preview === void 0 ? void 0 : preview.dataURI, preview === null || preview === void 0 ? void 0 : preview.source]);
|
|
52
|
+
return {
|
|
53
|
+
status,
|
|
54
|
+
error,
|
|
55
|
+
getImgProps,
|
|
56
|
+
getSsrScriptProps
|
|
57
|
+
};
|
|
58
|
+
};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export { useFilePreview } from './useFilePreview';
|
|
1
|
+
export { useFilePreview } from './useFilePreview';
|
|
2
|
+
export { useMediaImage } from './useMediaImage';
|
|
@@ -41,7 +41,10 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
41
41
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
42
42
|
isBannedLocalPreview = _useState8[0],
|
|
43
43
|
setIsBannedLocalPreview = _useState8[1];
|
|
44
|
-
var
|
|
44
|
+
var _useState9 = useState('not-resolved'),
|
|
45
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
46
|
+
upfrontPreviewStatus = _useState10[0],
|
|
47
|
+
setUpfrontPreviewStatus = _useState10[1];
|
|
45
48
|
var ssrReliabilityRef = useRef({
|
|
46
49
|
server: {
|
|
47
50
|
status: 'unknown'
|
|
@@ -93,10 +96,15 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
93
96
|
}
|
|
94
97
|
}
|
|
95
98
|
};
|
|
96
|
-
var
|
|
97
|
-
|
|
98
|
-
preview =
|
|
99
|
-
setPreview =
|
|
99
|
+
var _useState11 = useState(previewInitializer),
|
|
100
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
101
|
+
preview = _useState12[0],
|
|
102
|
+
setPreview = _useState12[1];
|
|
103
|
+
|
|
104
|
+
//----------------------------------------------------------------
|
|
105
|
+
// FILE STATE
|
|
106
|
+
//----------------------------------------------------------------
|
|
107
|
+
|
|
100
108
|
var _useFileState = useFileState(identifier.id, {
|
|
101
109
|
skipRemote: skipRemote,
|
|
102
110
|
collectionName: identifier.collectionName,
|
|
@@ -104,6 +112,18 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
104
112
|
}),
|
|
105
113
|
fileState = _useFileState.fileState;
|
|
106
114
|
|
|
115
|
+
// Derived from File State
|
|
116
|
+
var fileStatus = fileState === null || fileState === void 0 ? void 0 : fileState.status;
|
|
117
|
+
var isBackendPreviewReady = !!fileState && isImageRepresentationReady(fileState);
|
|
118
|
+
var fileStateErrorMessage = (fileState === null || fileState === void 0 ? void 0 : fileState.status) === 'error' ? fileState.message : undefined;
|
|
119
|
+
var _ref2 = fileState && (fileState === null || fileState === void 0 ? void 0 : fileState.status) !== 'error' ? fileState : {},
|
|
120
|
+
_ref2$preview = _ref2.preview,
|
|
121
|
+
localBinary = _ref2$preview === void 0 ? undefined : _ref2$preview,
|
|
122
|
+
_ref2$mediaType = _ref2.mediaType,
|
|
123
|
+
mediaType = _ref2$mediaType === void 0 ? undefined : _ref2$mediaType,
|
|
124
|
+
_ref2$mimeType = _ref2.mimeType,
|
|
125
|
+
mimeType = _ref2$mimeType === void 0 ? undefined : _ref2$mimeType;
|
|
126
|
+
|
|
107
127
|
//----------------------------------------------------------------
|
|
108
128
|
// Update status
|
|
109
129
|
//----------------------------------------------------------------
|
|
@@ -114,16 +134,19 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
114
134
|
}, [identifier]);
|
|
115
135
|
useEffect(function () {
|
|
116
136
|
if (status !== 'error') {
|
|
117
|
-
if (preview ||
|
|
137
|
+
if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
|
|
118
138
|
setStatus('complete');
|
|
119
|
-
} else if (!preview &&
|
|
139
|
+
} else if (!preview && fileStatus === 'failed-processing' && !isBackendPreviewReady) {
|
|
120
140
|
setStatus('error');
|
|
121
141
|
setError(new MediaFilePreviewError('failed-processing'));
|
|
142
|
+
} else if (!preview && fileStatus === 'error' && upfrontPreviewStatus === 'resolved') {
|
|
143
|
+
setStatus('error');
|
|
144
|
+
setError(new MediaFilePreviewError('metadata-fetch', new Error(fileStateErrorMessage)));
|
|
122
145
|
} else {
|
|
123
146
|
setStatus('loading');
|
|
124
147
|
}
|
|
125
148
|
}
|
|
126
|
-
}, [preview, status,
|
|
149
|
+
}, [preview, status, fileStatus, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
|
|
127
150
|
|
|
128
151
|
//----------------------------------------------------------------
|
|
129
152
|
// Preview Fetch Helper
|
|
@@ -138,11 +161,11 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
138
161
|
useEffect(function () {
|
|
139
162
|
// Only fetch upfront (no file state) if there is no preview in the state already
|
|
140
163
|
if (preview) {
|
|
141
|
-
|
|
142
|
-
} else if (!preview &&
|
|
164
|
+
setUpfrontPreviewStatus('resolved');
|
|
165
|
+
} else if (!preview && upfrontPreviewStatus === 'not-resolved' && !skipRemote) {
|
|
143
166
|
// We block any possible future call to this method regardless of the outcome (success or fail)
|
|
144
167
|
// If it fails, the normal preview fetch should occur after the file state is fetched anyways
|
|
145
|
-
|
|
168
|
+
setUpfrontPreviewStatus('resolving');
|
|
146
169
|
var fetchedDimensions = _objectSpread({}, requestDimensions);
|
|
147
170
|
getAndCacheRemotePreviewRef.current().then(function (newPreview) {
|
|
148
171
|
// If there are new and bigger dimensions in the props, and the upfront preview is still resolving,
|
|
@@ -152,9 +175,11 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
152
175
|
}
|
|
153
176
|
}).catch(function () {
|
|
154
177
|
// NO need to log error. If this call fails, a refetch will happen after
|
|
178
|
+
}).finally(function () {
|
|
179
|
+
setUpfrontPreviewStatus('resolved');
|
|
155
180
|
});
|
|
156
181
|
}
|
|
157
|
-
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote]);
|
|
182
|
+
}, [getAndCacheRemotePreviewRef, preview, requestDimensions, requestDimensionsRef, skipRemote, upfrontPreviewStatus]);
|
|
158
183
|
|
|
159
184
|
//----------------------------------------------------------------
|
|
160
185
|
// Cache, Local & Remote Preview
|
|
@@ -168,12 +193,12 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
168
193
|
setPreview(cachedPreview);
|
|
169
194
|
}
|
|
170
195
|
// Local Preview ----------------------------------------------------------------
|
|
171
|
-
else if (!preview && !isBannedLocalPreview &&
|
|
196
|
+
else if (!preview && !isBannedLocalPreview && localBinary && isSupportedLocalPreview(mediaType) && isMimeTypeSupportedByBrowser(mimeType || '')) {
|
|
172
197
|
// Local preview is available only if it's supported by browser and supported by Media Card (isSupportedLocalPreview)
|
|
173
198
|
// For example, SVGs are mime type NOT supported by browser but media type supported by Media Card (image)
|
|
174
199
|
// Then, local Preview NOT available
|
|
175
200
|
|
|
176
|
-
getAndCacheLocalPreview(identifier.id,
|
|
201
|
+
getAndCacheLocalPreview(identifier.id, localBinary, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(function (e) {
|
|
177
202
|
setIsBannedLocalPreview(true);
|
|
178
203
|
// CXP-2723 TODO: We might have to wrap this error in MediaCardError
|
|
179
204
|
setNonCriticalError(e);
|
|
@@ -182,7 +207,7 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
182
207
|
// Remote Preview ----------------------------------------------------------------
|
|
183
208
|
else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
|
|
184
209
|
// We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
|
|
185
|
-
isSSRPreview(preview)) && !skipRemote &&
|
|
210
|
+
isSSRPreview(preview)) && !skipRemote && upfrontPreviewStatus !== 'not-resolved' && isBackendPreviewReady) {
|
|
186
211
|
getAndCacheRemotePreviewRef.current().then(setPreview).catch(function (e) {
|
|
187
212
|
var wrappedError = ensureMediaFilePreviewError('preview-fetch', e);
|
|
188
213
|
if (!preview) {
|
|
@@ -194,7 +219,7 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
194
219
|
}
|
|
195
220
|
});
|
|
196
221
|
}
|
|
197
|
-
}, [error, nonCriticalError,
|
|
222
|
+
}, [error, nonCriticalError, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote, isBackendPreviewReady, localBinary, mediaType, mimeType, upfrontPreviewStatus]);
|
|
198
223
|
|
|
199
224
|
//----------------------------------------------------------------
|
|
200
225
|
// RETURN
|
|
@@ -230,7 +255,6 @@ export var useFilePreview = function useFilePreview(_ref) {
|
|
|
230
255
|
setStatus('error');
|
|
231
256
|
setError(_error);
|
|
232
257
|
}
|
|
233
|
-
// Should be set after the status
|
|
234
258
|
setPreview(undefined);
|
|
235
259
|
}
|
|
236
260
|
}, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { useFilePreview } from './useFilePreview';
|
|
3
|
+
export var useMediaImage = function useMediaImage(_ref) {
|
|
4
|
+
var identifier = _ref.identifier,
|
|
5
|
+
resizeMode = _ref.resizeMode,
|
|
6
|
+
dimensions = _ref.dimensions,
|
|
7
|
+
ssr = _ref.ssr,
|
|
8
|
+
mediaBlobUrlAttrs = _ref.mediaBlobUrlAttrs,
|
|
9
|
+
traceContext = _ref.traceContext,
|
|
10
|
+
skipRemote = _ref.skipRemote,
|
|
11
|
+
allowAnimated = _ref.allowAnimated,
|
|
12
|
+
upscale = _ref.upscale,
|
|
13
|
+
maxAge = _ref.maxAge,
|
|
14
|
+
onLoadCallback = _ref.onLoad,
|
|
15
|
+
onErrorCallback = _ref.onError;
|
|
16
|
+
var _useFilePreview = useFilePreview({
|
|
17
|
+
identifier: identifier,
|
|
18
|
+
resizeMode: resizeMode,
|
|
19
|
+
dimensions: dimensions,
|
|
20
|
+
ssr: ssr,
|
|
21
|
+
mediaBlobUrlAttrs: mediaBlobUrlAttrs,
|
|
22
|
+
traceContext: traceContext,
|
|
23
|
+
skipRemote: skipRemote,
|
|
24
|
+
allowAnimated: allowAnimated,
|
|
25
|
+
upscale: upscale,
|
|
26
|
+
maxAge: maxAge
|
|
27
|
+
}),
|
|
28
|
+
preview = _useFilePreview.preview,
|
|
29
|
+
status = _useFilePreview.status,
|
|
30
|
+
error = _useFilePreview.error,
|
|
31
|
+
onImageError = _useFilePreview.onImageError,
|
|
32
|
+
onImageLoad = _useFilePreview.onImageLoad,
|
|
33
|
+
getSsrScriptProps = _useFilePreview.getSsrScriptProps;
|
|
34
|
+
var onLoad = useCallback(function () {
|
|
35
|
+
onLoadCallback && onLoadCallback();
|
|
36
|
+
onImageLoad(preview);
|
|
37
|
+
}, [onImageLoad, onLoadCallback, preview]);
|
|
38
|
+
var onError = useCallback(function () {
|
|
39
|
+
onErrorCallback && onErrorCallback();
|
|
40
|
+
onImageError(preview);
|
|
41
|
+
}, [onErrorCallback, onImageError, preview]);
|
|
42
|
+
var getImgProps = useCallback(function () {
|
|
43
|
+
return {
|
|
44
|
+
src: preview === null || preview === void 0 ? void 0 : preview.dataURI,
|
|
45
|
+
onLoad: onLoad,
|
|
46
|
+
onError: onError,
|
|
47
|
+
'data-test-file-id': identifier.id,
|
|
48
|
+
'data-test-collection': identifier.collectionName,
|
|
49
|
+
'data-test-preview-source': preview === null || preview === void 0 ? void 0 : preview.source
|
|
50
|
+
};
|
|
51
|
+
}, [identifier.collectionName, identifier.id, onError, onLoad, preview === null || preview === void 0 ? void 0 : preview.dataURI, preview === null || preview === void 0 ? void 0 : preview.source]);
|
|
52
|
+
return {
|
|
53
|
+
status: status,
|
|
54
|
+
error: error,
|
|
55
|
+
getImgProps: getImgProps,
|
|
56
|
+
getSsrScriptProps: getSsrScriptProps
|
|
57
|
+
};
|
|
58
|
+
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { useFilePreview } from './useFilePreview';
|
|
2
|
+
export type { UseFilePreviewParams } from './useFilePreview';
|
|
3
|
+
export { useMediaImage } from './useMediaImage';
|
|
4
|
+
export type { UseMediaImageParams } from './useMediaImage';
|
|
2
5
|
export type { MediaFilePreview } from './types';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FileIdentifier, MediaBlobUrlAttrs, MediaStoreGetFileImageParams } from '@atlaskit/media-client';
|
|
3
|
+
import { MediaTraceContext, SSR } from '@atlaskit/media-common';
|
|
4
|
+
import { MediaFilePreviewDimensions } from './types';
|
|
5
|
+
export interface UseMediaImageParams {
|
|
6
|
+
/** Instance of file identifier. */
|
|
7
|
+
readonly identifier: FileIdentifier;
|
|
8
|
+
/** Resize the media to 'crop' | 'fit' | 'full-fit' */
|
|
9
|
+
readonly resizeMode?: MediaStoreGetFileImageParams['mode'];
|
|
10
|
+
/** Dimensions to be requested to the server. Will be scaled x2 in Retina Displays */
|
|
11
|
+
readonly dimensions?: MediaFilePreviewDimensions;
|
|
12
|
+
/** Server-Side-Rendering modes are "server" and "client" */
|
|
13
|
+
readonly ssr?: SSR;
|
|
14
|
+
/** Attributes to attach to the created Blob Url */
|
|
15
|
+
readonly mediaBlobUrlAttrs?: MediaBlobUrlAttrs;
|
|
16
|
+
/** Trace context to be passed to the backend requests */
|
|
17
|
+
readonly traceContext?: MediaTraceContext;
|
|
18
|
+
/** Do not fetch a remote preview. Helpful for lazy loading */
|
|
19
|
+
readonly skipRemote?: boolean;
|
|
20
|
+
/** Define whether an animated image is acceptable to return */
|
|
21
|
+
readonly allowAnimated?: boolean;
|
|
22
|
+
/** Define the upscale strategy for this image. */
|
|
23
|
+
readonly upscale?: boolean;
|
|
24
|
+
/** Make the client receive the response with the given max-age cache control header. Minimum: 0, maximum: 9223372036854776000.
|
|
25
|
+
*/
|
|
26
|
+
readonly maxAge?: number;
|
|
27
|
+
/** On image load and on error callback from the parent. We are keeping the name same to streamline the customer experience when using these properties back to their image components */
|
|
28
|
+
readonly onLoad?: () => void;
|
|
29
|
+
readonly onError?: () => void;
|
|
30
|
+
}
|
|
31
|
+
export declare const useMediaImage: ({ identifier, resizeMode, dimensions, ssr, mediaBlobUrlAttrs, traceContext, skipRemote, allowAnimated, upscale, maxAge, onLoad: onLoadCallback, onError: onErrorCallback, }: UseMediaImageParams) => {
|
|
32
|
+
status: import("./types").MediaFilePreviewStatus;
|
|
33
|
+
error: import("./errors").MediaFilePreviewError | undefined;
|
|
34
|
+
getImgProps: () => {
|
|
35
|
+
src: string | undefined;
|
|
36
|
+
onLoad: () => void;
|
|
37
|
+
onError: () => void;
|
|
38
|
+
'data-test-file-id': string;
|
|
39
|
+
'data-test-collection': string | undefined;
|
|
40
|
+
'data-test-preview-source': import("./types").MediaFilePreviewSource | undefined;
|
|
41
|
+
};
|
|
42
|
+
getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
|
|
43
|
+
};
|
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { useFilePreview } from './useFilePreview';
|
|
2
|
+
export type { UseFilePreviewParams } from './useFilePreview';
|
|
3
|
+
export { useMediaImage } from './useMediaImage';
|
|
4
|
+
export type { UseMediaImageParams } from './useMediaImage';
|
|
2
5
|
export type { MediaFilePreview } from './types';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FileIdentifier, MediaBlobUrlAttrs, MediaStoreGetFileImageParams } from '@atlaskit/media-client';
|
|
3
|
+
import { MediaTraceContext, SSR } from '@atlaskit/media-common';
|
|
4
|
+
import { MediaFilePreviewDimensions } from './types';
|
|
5
|
+
export interface UseMediaImageParams {
|
|
6
|
+
/** Instance of file identifier. */
|
|
7
|
+
readonly identifier: FileIdentifier;
|
|
8
|
+
/** Resize the media to 'crop' | 'fit' | 'full-fit' */
|
|
9
|
+
readonly resizeMode?: MediaStoreGetFileImageParams['mode'];
|
|
10
|
+
/** Dimensions to be requested to the server. Will be scaled x2 in Retina Displays */
|
|
11
|
+
readonly dimensions?: MediaFilePreviewDimensions;
|
|
12
|
+
/** Server-Side-Rendering modes are "server" and "client" */
|
|
13
|
+
readonly ssr?: SSR;
|
|
14
|
+
/** Attributes to attach to the created Blob Url */
|
|
15
|
+
readonly mediaBlobUrlAttrs?: MediaBlobUrlAttrs;
|
|
16
|
+
/** Trace context to be passed to the backend requests */
|
|
17
|
+
readonly traceContext?: MediaTraceContext;
|
|
18
|
+
/** Do not fetch a remote preview. Helpful for lazy loading */
|
|
19
|
+
readonly skipRemote?: boolean;
|
|
20
|
+
/** Define whether an animated image is acceptable to return */
|
|
21
|
+
readonly allowAnimated?: boolean;
|
|
22
|
+
/** Define the upscale strategy for this image. */
|
|
23
|
+
readonly upscale?: boolean;
|
|
24
|
+
/** Make the client receive the response with the given max-age cache control header. Minimum: 0, maximum: 9223372036854776000.
|
|
25
|
+
*/
|
|
26
|
+
readonly maxAge?: number;
|
|
27
|
+
/** On image load and on error callback from the parent. We are keeping the name same to streamline the customer experience when using these properties back to their image components */
|
|
28
|
+
readonly onLoad?: () => void;
|
|
29
|
+
readonly onError?: () => void;
|
|
30
|
+
}
|
|
31
|
+
export declare const useMediaImage: ({ identifier, resizeMode, dimensions, ssr, mediaBlobUrlAttrs, traceContext, skipRemote, allowAnimated, upscale, maxAge, onLoad: onLoadCallback, onError: onErrorCallback, }: UseMediaImageParams) => {
|
|
32
|
+
status: import("./types").MediaFilePreviewStatus;
|
|
33
|
+
error: import("./errors").MediaFilePreviewError | undefined;
|
|
34
|
+
getImgProps: () => {
|
|
35
|
+
src: string | undefined;
|
|
36
|
+
onLoad: () => void;
|
|
37
|
+
onError: () => void;
|
|
38
|
+
'data-test-file-id': string;
|
|
39
|
+
'data-test-collection': string | undefined;
|
|
40
|
+
'data-test-preview-source': import("./types").MediaFilePreviewSource | undefined;
|
|
41
|
+
};
|
|
42
|
+
getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
|
|
43
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/* eslint-disable @atlaskit/design-system/ensure-design-token-usage */
|
|
2
|
+
/* eslint-disable @atlaskit/design-system/prefer-primitives */
|
|
3
|
+
import React, { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
type TerminalTextDisplayProps = {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export const TerminalTextDisplay: React.FC<TerminalTextDisplayProps> = ({
|
|
10
|
+
children,
|
|
11
|
+
}): React.ReactElement | null => (
|
|
12
|
+
<div
|
|
13
|
+
style={{
|
|
14
|
+
backgroundColor: '#000000',
|
|
15
|
+
color: '#33FF00',
|
|
16
|
+
borderRadius: 5,
|
|
17
|
+
// eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
|
|
18
|
+
padding: 20,
|
|
19
|
+
fontFamily: 'Courier New, monospace',
|
|
20
|
+
lineHeight: '1.4',
|
|
21
|
+
maxWidth: 600,
|
|
22
|
+
width: '100%',
|
|
23
|
+
fontSize: '1.1em',
|
|
24
|
+
whiteSpace: 'pre-wrap',
|
|
25
|
+
overflow: 'auto',
|
|
26
|
+
}}
|
|
27
|
+
>
|
|
28
|
+
{children}
|
|
29
|
+
</div>
|
|
30
|
+
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/media-file-preview",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.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",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
".": "./src/index.ts"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@atlaskit/media-client": "^26.
|
|
38
|
+
"@atlaskit/media-client": "^26.2.0",
|
|
39
39
|
"@atlaskit/media-client-react": "^2.0.1",
|
|
40
40
|
"@atlaskit/media-common": "^11.0.0",
|
|
41
|
-
"@atlaskit/media-ui": "^25.0
|
|
41
|
+
"@atlaskit/media-ui": "^25.1.0",
|
|
42
42
|
"@babel/runtime": "^7.0.0",
|
|
43
43
|
"eventemitter2": "^4.1.0",
|
|
44
44
|
"lru_map": "^0.4.1"
|