@atlaskit/media-file-preview 0.3.0 → 0.4.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 CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/media-file-preview
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#70446](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/70446) [`48eae199c6fa`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/48eae199c6fa) - Breaking: return ref object ssrReliabilityRef is replaced by object ssrReliability
8
+
9
+ ### Patch Changes
10
+
11
+ - [#70446](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/70446) [`0ff07ca94009`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/0ff07ca94009) - Better support for onImageError callback
12
+
13
+ ## 0.3.1
14
+
15
+ ### Patch Changes
16
+
17
+ - [#70361](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/70361) [`6bcee8c57dac`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/6bcee8c57dac) - Support for files failed to process
18
+
3
19
  ## 0.3.0
4
20
 
5
21
  ### Minor Changes
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.getRenderErrorFailReason = exports.getRenderErrorErrorReason = exports.getRenderErrorErrorDetail = exports.getErrorTraceContext = exports.extractErrorInfo = void 0;
7
+ exports.getRenderErrorFailReason = exports.getRenderErrorErrorReason = exports.getRenderErrorErrorDetail = exports.getErrorTraceContext = exports.extractErrorInfo = exports.createFailedSSRObject = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
7
9
  var _mediaClient = require("@atlaskit/media-client");
8
10
  var _errors = require("./errors");
11
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
12
+ 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) { (0, _defineProperty2.default)(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; }
9
13
  var getErrorTraceContext = exports.getErrorTraceContext = function getErrorTraceContext(error) {
10
14
  if ((0, _errors.isMediaFilePreviewError)(error) && !!error.secondaryError) {
11
15
  if ((0, _mediaClient.isRequestError)(error.secondaryError)) {
@@ -47,4 +51,9 @@ var extractErrorInfo = exports.extractErrorInfo = function extractErrorInfo(erro
47
51
  errorDetail: getRenderErrorErrorDetail(error),
48
52
  metadataTraceContext: metadataTraceContext !== null && metadataTraceContext !== void 0 ? metadataTraceContext : getErrorTraceContext(error)
49
53
  };
54
+ };
55
+ var createFailedSSRObject = exports.createFailedSSRObject = function createFailedSSRObject(preview, metadataTraceContext) {
56
+ return _objectSpread({
57
+ status: 'fail'
58
+ }, extractErrorInfo(new _errors.ImageLoadError(preview.source), metadataTraceContext));
50
59
  };
@@ -95,6 +95,11 @@ var getImageLoadPrimaryReason = function getImageLoadPrimaryReason(source) {
95
95
  return 'local-uri';
96
96
  case 'remote':
97
97
  return 'remote-uri';
98
+ case 'ssr-client':
99
+ return 'ssr-client-uri';
100
+ case 'ssr-server':
101
+ case 'ssr-data':
102
+ return 'ssr-server-uri';
98
103
  // This fail reason will come from a bug, most likely.
99
104
  default:
100
105
  return "unknown-uri";
@@ -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.isSSRPreview = exports.isSSRDataPreview = exports.isSSRClientPreview = exports.isLocalPreview = exports.getSSRPreview = exports.getAndCacheRemotePreview = exports.getAndCacheLocalPreview = void 0;
7
+ exports.isSSRPreview = exports.isSSRDataPreview = exports.isSSRClientPreview = exports.isRemotePreview = 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"));
@@ -58,6 +58,10 @@ var isLocalPreview = exports.isLocalPreview = function isLocalPreview(preview) {
58
58
  var localSources = ['local', 'cache-local'];
59
59
  return localSources.includes(preview.source);
60
60
  };
61
+ var isRemotePreview = exports.isRemotePreview = function isRemotePreview(preview) {
62
+ var remoteSources = ['remote', 'cache-remote'];
63
+ return remoteSources.includes(preview.source);
64
+ };
61
65
  var isSSRClientPreview = exports.isSSRClientPreview = function isSSRClientPreview(preview) {
62
66
  return preview.source === 'ssr-client';
63
67
  };
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "isLocalPreview", {
27
27
  return _getPreview.isLocalPreview;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "isRemotePreview", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _getPreview.isRemotePreview;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "isSSRClientPreview", {
31
37
  enumerable: true,
32
38
  get: function get() {
@@ -49,7 +49,14 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
49
49
  isBannedLocalPreview = _useState8[0],
50
50
  setIsBannedLocalPreview = _useState8[1];
51
51
  var wasResolvedUpfrontPreviewRef = (0, _react.useRef)(false);
52
- var ssrReliabilityRef = (0, _react.useRef)(initialSsrReliability);
52
+ var ssrReliabilityRef = (0, _react.useRef)({
53
+ server: {
54
+ status: 'unknown'
55
+ },
56
+ client: {
57
+ status: 'unknown'
58
+ }
59
+ });
53
60
  var requestDimensions = (0, _react.useMemo)(function () {
54
61
  return dimensions ? (0, _helpers.createRequestDimensions)(dimensions) : undefined;
55
62
  }, [dimensions]);
@@ -114,10 +121,13 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
114
121
  }, [identifier]);
115
122
  (0, _react.useEffect)(function () {
116
123
  if (status !== 'error') {
117
- if (!preview && (!fileState || fileState.status === 'processing' || fileState.status === 'uploading')) {
118
- setStatus('loading');
119
- } else {
124
+ if (preview || fileState && fileState.status === 'processed' && !(0, _mediaClient.isImageRepresentationReady)(fileState)) {
120
125
  setStatus('complete');
126
+ } else if (!preview && fileState && fileState.status === 'failed-processing' && !(0, _mediaClient.isImageRepresentationReady)(fileState)) {
127
+ setStatus('error');
128
+ setError(new _errors.MediaFilePreviewError('failed-processing'));
129
+ } else {
130
+ setStatus('loading');
121
131
  }
122
132
  }
123
133
  }, [preview, status, fileState]);
@@ -197,44 +207,40 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
197
207
  // RETURN
198
208
  //----------------------------------------------------------------
199
209
 
200
- var onImageError = (0, _react.useCallback)(function (newPreview) {
201
- if (newPreview) {
202
- var failedSSRObject = _objectSpread({
203
- status: 'fail'
204
- }, (0, _analytics.extractErrorInfo)(new _errors.ImageLoadError(newPreview.source)));
205
- if ((0, _getPreview.isSSRClientPreview)(newPreview)) {
206
- ssrReliabilityRef.current.client = failedSSRObject;
207
- }
208
-
209
- /*
210
- 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.
211
- */
210
+ var onImageError = (0, _react.useCallback)(function (failedPreview) {
211
+ if (!failedPreview) {
212
+ return;
213
+ }
214
+ if ((0, _getPreview.isSSRClientPreview)(failedPreview)) {
215
+ ssrReliabilityRef.current.client = (0, _analytics.createFailedSSRObject)(failedPreview, traceContext);
216
+ }
212
217
 
213
- if ((0, _getPreview.isSSRDataPreview)(newPreview)) {
214
- ssrReliabilityRef.current.server = failedSSRObject;
215
- ssrReliabilityRef.current.client = failedSSRObject;
216
- }
218
+ // 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.
219
+ if ((0, _getPreview.isSSRDataPreview)(failedPreview)) {
220
+ ssrReliabilityRef.current.server = (0, _analytics.createFailedSSRObject)(failedPreview, traceContext);
221
+ ssrReliabilityRef.current.client = (0, _analytics.createFailedSSRObject)(failedPreview, traceContext);
217
222
  }
218
223
 
219
224
  // If the dataURI has been replaced, we can dismiss this error
220
- if ((newPreview === null || newPreview === void 0 ? void 0 : newPreview.dataURI) !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
225
+ if (failedPreview.dataURI !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
221
226
  return;
222
227
  }
223
- var error = new _errors.ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
224
- var isLocal = newPreview && (0, _getPreview.isLocalPreview)(newPreview);
225
- var isSSR = newPreview && ((0, _getPreview.isSSRClientPreview)(newPreview) || (0, _getPreview.isSSRDataPreview)(newPreview));
226
- if (isLocal || isSSR) {
228
+ var isLocal = (0, _getPreview.isLocalPreview)(failedPreview);
229
+ var isRemote = (0, _getPreview.isRemotePreview)(failedPreview);
230
+ if (isLocal || isRemote) {
231
+ var _error = new _errors.ImageLoadError(failedPreview === null || failedPreview === void 0 ? void 0 : failedPreview.source);
232
+ _getPreview.mediaFilePreviewCache.remove(identifier.id, resizeMode);
227
233
  if (isLocal) {
228
234
  setIsBannedLocalPreview(true);
229
- setNonCriticalError(error);
230
235
  }
231
- _getPreview.mediaFilePreviewCache.remove(identifier.id, resizeMode);
236
+ if (isRemote) {
237
+ setStatus('error');
238
+ setError(_error);
239
+ }
240
+ // Should be set after the status
232
241
  setPreview(undefined);
233
- } else {
234
- setStatus('error');
235
- setError(error);
236
242
  }
237
- }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
243
+ }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
238
244
  var onImageLoad = (0, _react.useCallback)(function (newPreview) {
239
245
  if (newPreview) {
240
246
  if ((0, _getPreview.isSSRClientPreview)(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -276,17 +282,9 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
276
282
  status: status,
277
283
  error: error,
278
284
  nonCriticalError: nonCriticalError,
279
- ssrReliabilityRef: ssrReliabilityRef,
285
+ ssrReliability: ssrReliabilityRef.current,
280
286
  onImageError: onImageError,
281
287
  onImageLoad: onImageLoad,
282
288
  getSsrScriptProps: getSsrScriptProps
283
289
  };
284
- };
285
- var initialSsrReliability = {
286
- server: {
287
- status: 'unknown'
288
- },
289
- client: {
290
- status: 'unknown'
291
- }
292
290
  };
@@ -1,5 +1,5 @@
1
1
  import { getMediaClientErrorReason, isRequestError } from '@atlaskit/media-client';
2
- import { getFileStateErrorReason, isMediaFilePreviewError, isMediaFileStateError } from './errors';
2
+ import { getFileStateErrorReason, ImageLoadError, isMediaFilePreviewError, isMediaFileStateError } from './errors';
3
3
  export const getErrorTraceContext = error => {
4
4
  if (isMediaFilePreviewError(error) && !!error.secondaryError) {
5
5
  if (isRequestError(error.secondaryError)) {
@@ -41,4 +41,8 @@ export const extractErrorInfo = (error, metadataTraceContext) => {
41
41
  errorDetail: getRenderErrorErrorDetail(error),
42
42
  metadataTraceContext: metadataTraceContext !== null && metadataTraceContext !== void 0 ? metadataTraceContext : getErrorTraceContext(error)
43
43
  };
44
- };
44
+ };
45
+ export const createFailedSSRObject = (preview, metadataTraceContext) => ({
46
+ status: 'fail',
47
+ ...extractErrorInfo(new ImageLoadError(preview.source), metadataTraceContext)
48
+ });
@@ -52,6 +52,11 @@ const getImageLoadPrimaryReason = source => {
52
52
  return 'local-uri';
53
53
  case 'remote':
54
54
  return 'remote-uri';
55
+ case 'ssr-client':
56
+ return 'ssr-client-uri';
57
+ case 'ssr-server':
58
+ case 'ssr-data':
59
+ return 'ssr-server-uri';
55
60
  // This fail reason will come from a bug, most likely.
56
61
  default:
57
62
  return `unknown-uri`;
@@ -48,6 +48,10 @@ export const isLocalPreview = preview => {
48
48
  const localSources = ['local', 'cache-local'];
49
49
  return localSources.includes(preview.source);
50
50
  };
51
+ export const isRemotePreview = preview => {
52
+ const remoteSources = ['remote', 'cache-remote'];
53
+ return remoteSources.includes(preview.source);
54
+ };
51
55
  export const isSSRClientPreview = preview => preview.source === 'ssr-client';
52
56
  export const isSSRDataPreview = preview => preview.source === 'ssr-data';
53
57
  export const isSSRPreview = preview => {
@@ -1,3 +1,3 @@
1
1
  export { mediaFilePreviewCache } from './cache';
2
- export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
2
+ export { getSSRPreview, isLocalPreview, isRemotePreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
3
3
  export { isSupportedLocalPreview } from './helpers';
@@ -2,9 +2,9 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { isImageRepresentationReady } from '@atlaskit/media-client';
3
3
  import { useFileState, useMediaClient } from '@atlaskit/media-client-react';
4
4
  import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
5
- import { extractErrorInfo } from './analytics';
6
- import { ensureMediaFilePreviewError, ImageLoadError } from './errors';
7
- import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
5
+ import { createFailedSSRObject, extractErrorInfo } from './analytics';
6
+ import { ensureMediaFilePreviewError, ImageLoadError, MediaFilePreviewError } from './errors';
7
+ import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isRemotePreview, 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 = ({
@@ -26,7 +26,14 @@ export const useFilePreview = ({
26
26
  const [nonCriticalError, setNonCriticalError] = useState();
27
27
  const [isBannedLocalPreview, setIsBannedLocalPreview] = useState(false);
28
28
  const wasResolvedUpfrontPreviewRef = useRef(false);
29
- const ssrReliabilityRef = useRef(initialSsrReliability);
29
+ const ssrReliabilityRef = useRef({
30
+ server: {
31
+ status: 'unknown'
32
+ },
33
+ client: {
34
+ status: 'unknown'
35
+ }
36
+ });
30
37
  const requestDimensions = useMemo(() => dimensions ? createRequestDimensions(dimensions) : undefined, [dimensions]);
31
38
  const requestDimensionsRef = useCurrentValueRef(requestDimensions);
32
39
  const imageURLParams = {
@@ -91,10 +98,13 @@ export const useFilePreview = ({
91
98
  }, [identifier]);
92
99
  useEffect(() => {
93
100
  if (status !== 'error') {
94
- if (!preview && (!fileState || fileState.status === 'processing' || fileState.status === 'uploading')) {
95
- setStatus('loading');
96
- } else {
101
+ if (preview || fileState && fileState.status === 'processed' && !isImageRepresentationReady(fileState)) {
97
102
  setStatus('complete');
103
+ } else if (!preview && fileState && fileState.status === 'failed-processing' && !isImageRepresentationReady(fileState)) {
104
+ setStatus('error');
105
+ setError(new MediaFilePreviewError('failed-processing'));
106
+ } else {
107
+ setStatus('loading');
98
108
  }
99
109
  }
100
110
  }, [preview, status, fileState]);
@@ -176,45 +186,40 @@ export const useFilePreview = ({
176
186
  // RETURN
177
187
  //----------------------------------------------------------------
178
188
 
179
- const onImageError = useCallback(newPreview => {
180
- if (newPreview) {
181
- const failedSSRObject = {
182
- status: 'fail',
183
- ...extractErrorInfo(new ImageLoadError(newPreview.source))
184
- };
185
- if (isSSRClientPreview(newPreview)) {
186
- ssrReliabilityRef.current.client = failedSSRObject;
187
- }
188
-
189
- /*
190
- 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.
191
- */
189
+ const onImageError = useCallback(failedPreview => {
190
+ if (!failedPreview) {
191
+ return;
192
+ }
193
+ if (isSSRClientPreview(failedPreview)) {
194
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
195
+ }
192
196
 
193
- if (isSSRDataPreview(newPreview)) {
194
- ssrReliabilityRef.current.server = failedSSRObject;
195
- ssrReliabilityRef.current.client = failedSSRObject;
196
- }
197
+ // 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.
198
+ if (isSSRDataPreview(failedPreview)) {
199
+ ssrReliabilityRef.current.server = createFailedSSRObject(failedPreview, traceContext);
200
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
197
201
  }
198
202
 
199
203
  // If the dataURI has been replaced, we can dismiss this error
200
- if ((newPreview === null || newPreview === void 0 ? void 0 : newPreview.dataURI) !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
204
+ if (failedPreview.dataURI !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
201
205
  return;
202
206
  }
203
- const error = new ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
204
- const isLocal = newPreview && isLocalPreview(newPreview);
205
- const isSSR = newPreview && (isSSRClientPreview(newPreview) || isSSRDataPreview(newPreview));
206
- if (isLocal || isSSR) {
207
+ const isLocal = isLocalPreview(failedPreview);
208
+ const isRemote = isRemotePreview(failedPreview);
209
+ if (isLocal || isRemote) {
210
+ const error = new ImageLoadError(failedPreview === null || failedPreview === void 0 ? void 0 : failedPreview.source);
211
+ mediaFilePreviewCache.remove(identifier.id, resizeMode);
207
212
  if (isLocal) {
208
213
  setIsBannedLocalPreview(true);
209
- setNonCriticalError(error);
210
214
  }
211
- mediaFilePreviewCache.remove(identifier.id, resizeMode);
215
+ if (isRemote) {
216
+ setStatus('error');
217
+ setError(error);
218
+ }
219
+ // Should be set after the status
212
220
  setPreview(undefined);
213
- } else {
214
- setStatus('error');
215
- setError(error);
216
221
  }
217
- }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
222
+ }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
218
223
  const onImageLoad = useCallback(newPreview => {
219
224
  if (newPreview) {
220
225
  if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -256,17 +261,9 @@ export const useFilePreview = ({
256
261
  status,
257
262
  error,
258
263
  nonCriticalError,
259
- ssrReliabilityRef,
264
+ ssrReliability: ssrReliabilityRef.current,
260
265
  onImageError,
261
266
  onImageLoad,
262
267
  getSsrScriptProps
263
268
  };
264
- };
265
- const initialSsrReliability = {
266
- server: {
267
- status: 'unknown'
268
- },
269
- client: {
270
- status: 'unknown'
271
- }
272
269
  };
@@ -1,5 +1,8 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ 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; }
1
4
  import { getMediaClientErrorReason, isRequestError } from '@atlaskit/media-client';
2
- import { getFileStateErrorReason, isMediaFilePreviewError, isMediaFileStateError } from './errors';
5
+ import { getFileStateErrorReason, ImageLoadError, isMediaFilePreviewError, isMediaFileStateError } from './errors';
3
6
  export var getErrorTraceContext = function getErrorTraceContext(error) {
4
7
  if (isMediaFilePreviewError(error) && !!error.secondaryError) {
5
8
  if (isRequestError(error.secondaryError)) {
@@ -41,4 +44,9 @@ export var extractErrorInfo = function extractErrorInfo(error, metadataTraceCont
41
44
  errorDetail: getRenderErrorErrorDetail(error),
42
45
  metadataTraceContext: metadataTraceContext !== null && metadataTraceContext !== void 0 ? metadataTraceContext : getErrorTraceContext(error)
43
46
  };
47
+ };
48
+ export var createFailedSSRObject = function createFailedSSRObject(preview, metadataTraceContext) {
49
+ return _objectSpread({
50
+ status: 'fail'
51
+ }, extractErrorInfo(new ImageLoadError(preview.source), metadataTraceContext));
44
52
  };
@@ -85,6 +85,11 @@ var getImageLoadPrimaryReason = function getImageLoadPrimaryReason(source) {
85
85
  return 'local-uri';
86
86
  case 'remote':
87
87
  return 'remote-uri';
88
+ case 'ssr-client':
89
+ return 'ssr-client-uri';
90
+ case 'ssr-server':
91
+ case 'ssr-data':
92
+ return 'ssr-server-uri';
88
93
  // This fail reason will come from a bug, most likely.
89
94
  default:
90
95
  return "unknown-uri";
@@ -51,6 +51,10 @@ export var isLocalPreview = function isLocalPreview(preview) {
51
51
  var localSources = ['local', 'cache-local'];
52
52
  return localSources.includes(preview.source);
53
53
  };
54
+ export var isRemotePreview = function isRemotePreview(preview) {
55
+ var remoteSources = ['remote', 'cache-remote'];
56
+ return remoteSources.includes(preview.source);
57
+ };
54
58
  export var isSSRClientPreview = function isSSRClientPreview(preview) {
55
59
  return preview.source === 'ssr-client';
56
60
  };
@@ -1,3 +1,3 @@
1
1
  export { mediaFilePreviewCache } from './cache';
2
- export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
2
+ export { getSSRPreview, isLocalPreview, isRemotePreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview } from './getPreview';
3
3
  export { isSupportedLocalPreview } from './helpers';
@@ -6,9 +6,9 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
6
6
  import { isImageRepresentationReady } from '@atlaskit/media-client';
7
7
  import { useFileState, useMediaClient } from '@atlaskit/media-client-react';
8
8
  import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
9
- import { extractErrorInfo } from './analytics';
10
- import { ensureMediaFilePreviewError, ImageLoadError } from './errors';
11
- import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
9
+ import { createFailedSSRObject, extractErrorInfo } from './analytics';
10
+ import { ensureMediaFilePreviewError, ImageLoadError, MediaFilePreviewError } from './errors';
11
+ import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isRemotePreview, 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) {
@@ -42,7 +42,14 @@ export var useFilePreview = function useFilePreview(_ref) {
42
42
  isBannedLocalPreview = _useState8[0],
43
43
  setIsBannedLocalPreview = _useState8[1];
44
44
  var wasResolvedUpfrontPreviewRef = useRef(false);
45
- var ssrReliabilityRef = useRef(initialSsrReliability);
45
+ var ssrReliabilityRef = useRef({
46
+ server: {
47
+ status: 'unknown'
48
+ },
49
+ client: {
50
+ status: 'unknown'
51
+ }
52
+ });
46
53
  var requestDimensions = useMemo(function () {
47
54
  return dimensions ? createRequestDimensions(dimensions) : undefined;
48
55
  }, [dimensions]);
@@ -107,10 +114,13 @@ export var useFilePreview = function useFilePreview(_ref) {
107
114
  }, [identifier]);
108
115
  useEffect(function () {
109
116
  if (status !== 'error') {
110
- if (!preview && (!fileState || fileState.status === 'processing' || fileState.status === 'uploading')) {
111
- setStatus('loading');
112
- } else {
117
+ if (preview || fileState && fileState.status === 'processed' && !isImageRepresentationReady(fileState)) {
113
118
  setStatus('complete');
119
+ } else if (!preview && fileState && fileState.status === 'failed-processing' && !isImageRepresentationReady(fileState)) {
120
+ setStatus('error');
121
+ setError(new MediaFilePreviewError('failed-processing'));
122
+ } else {
123
+ setStatus('loading');
114
124
  }
115
125
  }
116
126
  }, [preview, status, fileState]);
@@ -190,44 +200,40 @@ export var useFilePreview = function useFilePreview(_ref) {
190
200
  // RETURN
191
201
  //----------------------------------------------------------------
192
202
 
193
- var onImageError = useCallback(function (newPreview) {
194
- if (newPreview) {
195
- var failedSSRObject = _objectSpread({
196
- status: 'fail'
197
- }, extractErrorInfo(new ImageLoadError(newPreview.source)));
198
- if (isSSRClientPreview(newPreview)) {
199
- ssrReliabilityRef.current.client = failedSSRObject;
200
- }
201
-
202
- /*
203
- 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.
204
- */
203
+ var onImageError = useCallback(function (failedPreview) {
204
+ if (!failedPreview) {
205
+ return;
206
+ }
207
+ if (isSSRClientPreview(failedPreview)) {
208
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
209
+ }
205
210
 
206
- if (isSSRDataPreview(newPreview)) {
207
- ssrReliabilityRef.current.server = failedSSRObject;
208
- ssrReliabilityRef.current.client = failedSSRObject;
209
- }
211
+ // 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.
212
+ if (isSSRDataPreview(failedPreview)) {
213
+ ssrReliabilityRef.current.server = createFailedSSRObject(failedPreview, traceContext);
214
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
210
215
  }
211
216
 
212
217
  // If the dataURI has been replaced, we can dismiss this error
213
- if ((newPreview === null || newPreview === void 0 ? void 0 : newPreview.dataURI) !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
218
+ if (failedPreview.dataURI !== (preview === null || preview === void 0 ? void 0 : preview.dataURI)) {
214
219
  return;
215
220
  }
216
- var error = new ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
217
- var isLocal = newPreview && isLocalPreview(newPreview);
218
- var isSSR = newPreview && (isSSRClientPreview(newPreview) || isSSRDataPreview(newPreview));
219
- if (isLocal || isSSR) {
221
+ var isLocal = isLocalPreview(failedPreview);
222
+ var isRemote = isRemotePreview(failedPreview);
223
+ if (isLocal || isRemote) {
224
+ var _error = new ImageLoadError(failedPreview === null || failedPreview === void 0 ? void 0 : failedPreview.source);
225
+ mediaFilePreviewCache.remove(identifier.id, resizeMode);
220
226
  if (isLocal) {
221
227
  setIsBannedLocalPreview(true);
222
- setNonCriticalError(error);
223
228
  }
224
- mediaFilePreviewCache.remove(identifier.id, resizeMode);
229
+ if (isRemote) {
230
+ setStatus('error');
231
+ setError(_error);
232
+ }
233
+ // Should be set after the status
225
234
  setPreview(undefined);
226
- } else {
227
- setStatus('error');
228
- setError(error);
229
235
  }
230
- }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode]);
236
+ }, [identifier.id, preview === null || preview === void 0 ? void 0 : preview.dataURI, resizeMode, traceContext]);
231
237
  var onImageLoad = useCallback(function (newPreview) {
232
238
  if (newPreview) {
233
239
  if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -269,17 +275,9 @@ export var useFilePreview = function useFilePreview(_ref) {
269
275
  status: status,
270
276
  error: error,
271
277
  nonCriticalError: nonCriticalError,
272
- ssrReliabilityRef: ssrReliabilityRef,
278
+ ssrReliability: ssrReliabilityRef.current,
273
279
  onImageError: onImageError,
274
280
  onImageLoad: onImageLoad,
275
281
  getSsrScriptProps: getSsrScriptProps
276
282
  };
277
- };
278
- var initialSsrReliability = {
279
- server: {
280
- status: 'unknown'
281
- },
282
- client: {
283
- status: 'unknown'
284
- }
285
283
  };
@@ -1,6 +1,7 @@
1
1
  import { MediaClientErrorReason } from '@atlaskit/media-client';
2
2
  import { MediaTraceContext, SuccessAttributes } from '@atlaskit/media-common';
3
3
  import { MediaFilePreviewError, MediaFilePreviewErrorPrimaryReason } from './errors';
4
+ import { MediaFilePreview } from './types';
4
5
  export type FailedErrorFailReason = MediaFilePreviewErrorPrimaryReason | 'nativeError';
5
6
  export type MediaFilePreviewErrorInfo = {
6
7
  failReason: FailedErrorFailReason;
@@ -25,4 +26,5 @@ export declare const getRenderErrorFailReason: (error: MediaFilePreviewError) =>
25
26
  export declare const getRenderErrorErrorReason: (error: MediaFilePreviewError) => MediaClientErrorReason | 'nativeError';
26
27
  export declare const getRenderErrorErrorDetail: (error: MediaFilePreviewError) => string;
27
28
  export declare const extractErrorInfo: (error: MediaFilePreviewError, metadataTraceContext?: MediaTraceContext) => MediaFilePreviewErrorInfo;
29
+ export declare const createFailedSSRObject: (preview: MediaFilePreview, metadataTraceContext?: MediaTraceContext) => SSRStatusFail;
28
30
  export {};
@@ -5,8 +5,8 @@ import { MediaFilePreview } from './types';
5
5
  * Primary reason is logged through Data Portal.
6
6
  * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
7
7
  */
8
- export type MediaFilePreviewErrorPrimaryReason = 'upload' | 'metadata-fetch' | 'error-file-state' | RemotePreviewPrimaryReason | LocalPreviewPrimaryReason | ImageLoadPrimaryReason | SsrPreviewPrimaryReason | 'missing-error-data' | 'preview-fetch';
9
- export type ImageLoadPrimaryReason = 'cache-remote-uri' | 'cache-local-uri' | 'local-uri' | 'remote-uri' | 'external-uri' | 'unknown-uri';
8
+ export type MediaFilePreviewErrorPrimaryReason = 'upload' | 'metadata-fetch' | 'error-file-state' | 'failed-processing' | RemotePreviewPrimaryReason | LocalPreviewPrimaryReason | ImageLoadPrimaryReason | SsrPreviewPrimaryReason | 'missing-error-data' | 'preview-fetch';
9
+ export type ImageLoadPrimaryReason = 'cache-remote-uri' | 'cache-local-uri' | 'local-uri' | 'remote-uri' | 'external-uri' | 'ssr-client-uri' | 'ssr-server-uri' | 'unknown-uri';
10
10
  export type RemotePreviewPrimaryReason = 'remote-preview-fetch' | 'remote-preview-not-ready' | 'remote-preview-fetch-ssr';
11
11
  export type LocalPreviewPrimaryReason = 'local-preview-get' | 'local-preview-unsupported' | 'local-preview-rejected' | 'local-preview-image' | 'local-preview-video';
12
12
  export type SsrPreviewPrimaryReason = 'ssr-client-uri' | 'ssr-client-load' | 'ssr-server-uri' | 'ssr-server-load';
@@ -3,6 +3,7 @@ import { MediaTraceContext, SSR } from '@atlaskit/media-common';
3
3
  import { MediaFilePreview, MediaFilePreviewDimensions } from '../types';
4
4
  export declare const getSSRPreview: (ssr: SSR, mediaClient: MediaClient, id: string, params: MediaStoreGetFileImageParams, mediaBlobUrlAttrs?: MediaBlobUrlAttrs) => MediaFilePreview;
5
5
  export declare const isLocalPreview: (preview: MediaFilePreview) => boolean;
6
+ export declare const isRemotePreview: (preview: MediaFilePreview) => boolean;
6
7
  export declare const isSSRClientPreview: (preview: MediaFilePreview) => boolean;
7
8
  export declare const isSSRDataPreview: (preview: MediaFilePreview) => boolean;
8
9
  export declare const isSSRPreview: (preview: MediaFilePreview) => boolean;
@@ -1,3 +1,3 @@
1
1
  export { mediaFilePreviewCache } from './cache';
2
- export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
2
+ export { getSSRPreview, isLocalPreview, isRemotePreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
3
3
  export { isSupportedLocalPreview } from './helpers';
@@ -32,8 +32,8 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
32
32
  status: MediaFilePreviewStatus;
33
33
  error: MediaFilePreviewError | undefined;
34
34
  nonCriticalError: MediaFilePreviewError | undefined;
35
- ssrReliabilityRef: import("react").MutableRefObject<SSRStatus>;
36
- onImageError: (newPreview?: MediaFilePreview) => void;
35
+ ssrReliability: SSRStatus;
36
+ onImageError: (failedPreview?: MediaFilePreview) => void;
37
37
  onImageLoad: (newPreview?: MediaFilePreview) => void;
38
38
  getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
39
39
  };
@@ -1,6 +1,7 @@
1
1
  import { MediaClientErrorReason } from '@atlaskit/media-client';
2
2
  import { MediaTraceContext, SuccessAttributes } from '@atlaskit/media-common';
3
3
  import { MediaFilePreviewError, MediaFilePreviewErrorPrimaryReason } from './errors';
4
+ import { MediaFilePreview } from './types';
4
5
  export type FailedErrorFailReason = MediaFilePreviewErrorPrimaryReason | 'nativeError';
5
6
  export type MediaFilePreviewErrorInfo = {
6
7
  failReason: FailedErrorFailReason;
@@ -25,4 +26,5 @@ export declare const getRenderErrorFailReason: (error: MediaFilePreviewError) =>
25
26
  export declare const getRenderErrorErrorReason: (error: MediaFilePreviewError) => MediaClientErrorReason | 'nativeError';
26
27
  export declare const getRenderErrorErrorDetail: (error: MediaFilePreviewError) => string;
27
28
  export declare const extractErrorInfo: (error: MediaFilePreviewError, metadataTraceContext?: MediaTraceContext) => MediaFilePreviewErrorInfo;
29
+ export declare const createFailedSSRObject: (preview: MediaFilePreview, metadataTraceContext?: MediaTraceContext) => SSRStatusFail;
28
30
  export {};
@@ -5,8 +5,8 @@ import { MediaFilePreview } from './types';
5
5
  * Primary reason is logged through Data Portal.
6
6
  * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
7
7
  */
8
- export type MediaFilePreviewErrorPrimaryReason = 'upload' | 'metadata-fetch' | 'error-file-state' | RemotePreviewPrimaryReason | LocalPreviewPrimaryReason | ImageLoadPrimaryReason | SsrPreviewPrimaryReason | 'missing-error-data' | 'preview-fetch';
9
- export type ImageLoadPrimaryReason = 'cache-remote-uri' | 'cache-local-uri' | 'local-uri' | 'remote-uri' | 'external-uri' | 'unknown-uri';
8
+ export type MediaFilePreviewErrorPrimaryReason = 'upload' | 'metadata-fetch' | 'error-file-state' | 'failed-processing' | RemotePreviewPrimaryReason | LocalPreviewPrimaryReason | ImageLoadPrimaryReason | SsrPreviewPrimaryReason | 'missing-error-data' | 'preview-fetch';
9
+ export type ImageLoadPrimaryReason = 'cache-remote-uri' | 'cache-local-uri' | 'local-uri' | 'remote-uri' | 'external-uri' | 'ssr-client-uri' | 'ssr-server-uri' | 'unknown-uri';
10
10
  export type RemotePreviewPrimaryReason = 'remote-preview-fetch' | 'remote-preview-not-ready' | 'remote-preview-fetch-ssr';
11
11
  export type LocalPreviewPrimaryReason = 'local-preview-get' | 'local-preview-unsupported' | 'local-preview-rejected' | 'local-preview-image' | 'local-preview-video';
12
12
  export type SsrPreviewPrimaryReason = 'ssr-client-uri' | 'ssr-client-load' | 'ssr-server-uri' | 'ssr-server-load';
@@ -3,6 +3,7 @@ import { MediaTraceContext, SSR } from '@atlaskit/media-common';
3
3
  import { MediaFilePreview, MediaFilePreviewDimensions } from '../types';
4
4
  export declare const getSSRPreview: (ssr: SSR, mediaClient: MediaClient, id: string, params: MediaStoreGetFileImageParams, mediaBlobUrlAttrs?: MediaBlobUrlAttrs) => MediaFilePreview;
5
5
  export declare const isLocalPreview: (preview: MediaFilePreview) => boolean;
6
+ export declare const isRemotePreview: (preview: MediaFilePreview) => boolean;
6
7
  export declare const isSSRClientPreview: (preview: MediaFilePreview) => boolean;
7
8
  export declare const isSSRDataPreview: (preview: MediaFilePreview) => boolean;
8
9
  export declare const isSSRPreview: (preview: MediaFilePreview) => boolean;
@@ -1,3 +1,3 @@
1
1
  export { mediaFilePreviewCache } from './cache';
2
- export { getSSRPreview, isLocalPreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
2
+ export { getSSRPreview, isLocalPreview, isRemotePreview, isSSRPreview, isSSRClientPreview, isSSRDataPreview, getAndCacheRemotePreview, getAndCacheLocalPreview, } from './getPreview';
3
3
  export { isSupportedLocalPreview } from './helpers';
@@ -32,8 +32,8 @@ export declare const useFilePreview: ({ resizeMode, identifier, ssr, dimensions,
32
32
  status: MediaFilePreviewStatus;
33
33
  error: MediaFilePreviewError | undefined;
34
34
  nonCriticalError: MediaFilePreviewError | undefined;
35
- ssrReliabilityRef: import("react").MutableRefObject<SSRStatus>;
36
- onImageError: (newPreview?: MediaFilePreview) => void;
35
+ ssrReliability: SSRStatus;
36
+ onImageError: (failedPreview?: MediaFilePreview) => void;
37
37
  onImageLoad: (newPreview?: MediaFilePreview) => void;
38
38
  getSsrScriptProps: (() => import("react").ScriptHTMLAttributes<HTMLScriptElement>) | undefined;
39
39
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-file-preview",
3
- "version": "0.3.0",
3
+ "version": "0.4.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",