@atlaskit/media-file-preview 0.3.1 → 0.4.1

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.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#71409](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/71409) [`5c76dfba92dd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/5c76dfba92dd) - Pass trace context to global scope error
8
+
9
+ ## 0.4.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#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
14
+
15
+ ### Patch Changes
16
+
17
+ - [#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
18
+
3
19
  ## 0.3.1
4
20
 
5
21
  ### Patch 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]);
@@ -80,7 +87,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
80
87
  } catch (e) {
81
88
  ssrReliabilityRef.current[ssr] = _objectSpread({
82
89
  status: 'fail'
83
- }, (0, _analytics.extractErrorInfo)(e));
90
+ }, (0, _analytics.extractErrorInfo)(e, traceContext));
84
91
  }
85
92
  } else {
86
93
  var _dimensions = ssrData.dimensions,
@@ -200,44 +207,40 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
200
207
  // RETURN
201
208
  //----------------------------------------------------------------
202
209
 
203
- var onImageError = (0, _react.useCallback)(function (newPreview) {
204
- if (newPreview) {
205
- var failedSSRObject = _objectSpread({
206
- status: 'fail'
207
- }, (0, _analytics.extractErrorInfo)(new _errors.ImageLoadError(newPreview.source)));
208
- if ((0, _getPreview.isSSRClientPreview)(newPreview)) {
209
- ssrReliabilityRef.current.client = failedSSRObject;
210
- }
211
-
212
- /*
213
- 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.
214
- */
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
+ }
215
217
 
216
- if ((0, _getPreview.isSSRDataPreview)(newPreview)) {
217
- ssrReliabilityRef.current.server = failedSSRObject;
218
- ssrReliabilityRef.current.client = failedSSRObject;
219
- }
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);
220
222
  }
221
223
 
222
224
  // If the dataURI has been replaced, we can dismiss this error
223
- 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)) {
224
226
  return;
225
227
  }
226
- var error = new _errors.ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
227
- var isLocal = newPreview && (0, _getPreview.isLocalPreview)(newPreview);
228
- var isSSR = newPreview && ((0, _getPreview.isSSRClientPreview)(newPreview) || (0, _getPreview.isSSRDataPreview)(newPreview));
229
- 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);
230
233
  if (isLocal) {
231
234
  setIsBannedLocalPreview(true);
232
- setNonCriticalError(error);
233
235
  }
234
- _getPreview.mediaFilePreviewCache.remove(identifier.id, resizeMode);
236
+ if (isRemote) {
237
+ setStatus('error');
238
+ setError(_error);
239
+ }
240
+ // Should be set after the status
235
241
  setPreview(undefined);
236
- } else {
237
- setStatus('error');
238
- setError(error);
239
242
  }
240
- }, [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]);
241
244
  var onImageLoad = (0, _react.useCallback)(function (newPreview) {
242
245
  if (newPreview) {
243
246
  if ((0, _getPreview.isSSRClientPreview)(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -279,17 +282,9 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
279
282
  status: status,
280
283
  error: error,
281
284
  nonCriticalError: nonCriticalError,
282
- ssrReliabilityRef: ssrReliabilityRef,
285
+ ssrReliability: ssrReliabilityRef.current,
283
286
  onImageError: onImageError,
284
287
  onImageLoad: onImageLoad,
285
288
  getSsrScriptProps: getSsrScriptProps
286
289
  };
287
- };
288
- var initialSsrReliability = {
289
- server: {
290
- status: 'unknown'
291
- },
292
- client: {
293
- status: 'unknown'
294
- }
295
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';
5
+ import { createFailedSSRObject, extractErrorInfo } from './analytics';
6
6
  import { ensureMediaFilePreviewError, ImageLoadError, MediaFilePreviewError } from './errors';
7
- import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
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 = {
@@ -56,7 +63,7 @@ export const useFilePreview = ({
56
63
  } catch (e) {
57
64
  ssrReliabilityRef.current[ssr] = {
58
65
  status: 'fail',
59
- ...extractErrorInfo(e)
66
+ ...extractErrorInfo(e, traceContext)
60
67
  };
61
68
  }
62
69
  } else {
@@ -179,45 +186,40 @@ export const useFilePreview = ({
179
186
  // RETURN
180
187
  //----------------------------------------------------------------
181
188
 
182
- const onImageError = useCallback(newPreview => {
183
- if (newPreview) {
184
- const failedSSRObject = {
185
- status: 'fail',
186
- ...extractErrorInfo(new ImageLoadError(newPreview.source))
187
- };
188
- if (isSSRClientPreview(newPreview)) {
189
- ssrReliabilityRef.current.client = failedSSRObject;
190
- }
191
-
192
- /*
193
- 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.
194
- */
189
+ const onImageError = useCallback(failedPreview => {
190
+ if (!failedPreview) {
191
+ return;
192
+ }
193
+ if (isSSRClientPreview(failedPreview)) {
194
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
195
+ }
195
196
 
196
- if (isSSRDataPreview(newPreview)) {
197
- ssrReliabilityRef.current.server = failedSSRObject;
198
- ssrReliabilityRef.current.client = failedSSRObject;
199
- }
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);
200
201
  }
201
202
 
202
203
  // If the dataURI has been replaced, we can dismiss this error
203
- 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)) {
204
205
  return;
205
206
  }
206
- const error = new ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
207
- const isLocal = newPreview && isLocalPreview(newPreview);
208
- const isSSR = newPreview && (isSSRClientPreview(newPreview) || isSSRDataPreview(newPreview));
209
- 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);
210
212
  if (isLocal) {
211
213
  setIsBannedLocalPreview(true);
212
- setNonCriticalError(error);
213
214
  }
214
- mediaFilePreviewCache.remove(identifier.id, resizeMode);
215
+ if (isRemote) {
216
+ setStatus('error');
217
+ setError(error);
218
+ }
219
+ // Should be set after the status
215
220
  setPreview(undefined);
216
- } else {
217
- setStatus('error');
218
- setError(error);
219
221
  }
220
- }, [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]);
221
223
  const onImageLoad = useCallback(newPreview => {
222
224
  if (newPreview) {
223
225
  if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -259,17 +261,9 @@ export const useFilePreview = ({
259
261
  status,
260
262
  error,
261
263
  nonCriticalError,
262
- ssrReliabilityRef,
264
+ ssrReliability: ssrReliabilityRef.current,
263
265
  onImageError,
264
266
  onImageLoad,
265
267
  getSsrScriptProps
266
268
  };
267
- };
268
- const initialSsrReliability = {
269
- server: {
270
- status: 'unknown'
271
- },
272
- client: {
273
- status: 'unknown'
274
- }
275
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';
9
+ import { createFailedSSRObject, extractErrorInfo } from './analytics';
10
10
  import { ensureMediaFilePreviewError, ImageLoadError, MediaFilePreviewError } from './errors';
11
- import { getAndCacheLocalPreview, getAndCacheRemotePreview, getSSRPreview, isLocalPreview, isSSRClientPreview, isSSRDataPreview, isSSRPreview, isSupportedLocalPreview, mediaFilePreviewCache } from './getPreview';
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]);
@@ -73,7 +80,7 @@ export var useFilePreview = function useFilePreview(_ref) {
73
80
  } catch (e) {
74
81
  ssrReliabilityRef.current[ssr] = _objectSpread({
75
82
  status: 'fail'
76
- }, extractErrorInfo(e));
83
+ }, extractErrorInfo(e, traceContext));
77
84
  }
78
85
  } else {
79
86
  var _dimensions = ssrData.dimensions,
@@ -193,44 +200,40 @@ export var useFilePreview = function useFilePreview(_ref) {
193
200
  // RETURN
194
201
  //----------------------------------------------------------------
195
202
 
196
- var onImageError = useCallback(function (newPreview) {
197
- if (newPreview) {
198
- var failedSSRObject = _objectSpread({
199
- status: 'fail'
200
- }, extractErrorInfo(new ImageLoadError(newPreview.source)));
201
- if (isSSRClientPreview(newPreview)) {
202
- ssrReliabilityRef.current.client = failedSSRObject;
203
- }
204
-
205
- /*
206
- 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.
207
- */
203
+ var onImageError = useCallback(function (failedPreview) {
204
+ if (!failedPreview) {
205
+ return;
206
+ }
207
+ if (isSSRClientPreview(failedPreview)) {
208
+ ssrReliabilityRef.current.client = createFailedSSRObject(failedPreview, traceContext);
209
+ }
208
210
 
209
- if (isSSRDataPreview(newPreview)) {
210
- ssrReliabilityRef.current.server = failedSSRObject;
211
- ssrReliabilityRef.current.client = failedSSRObject;
212
- }
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);
213
215
  }
214
216
 
215
217
  // If the dataURI has been replaced, we can dismiss this error
216
- 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)) {
217
219
  return;
218
220
  }
219
- var error = new ImageLoadError(newPreview === null || newPreview === void 0 ? void 0 : newPreview.source);
220
- var isLocal = newPreview && isLocalPreview(newPreview);
221
- var isSSR = newPreview && (isSSRClientPreview(newPreview) || isSSRDataPreview(newPreview));
222
- 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);
223
226
  if (isLocal) {
224
227
  setIsBannedLocalPreview(true);
225
- setNonCriticalError(error);
226
228
  }
227
- mediaFilePreviewCache.remove(identifier.id, resizeMode);
229
+ if (isRemote) {
230
+ setStatus('error');
231
+ setError(_error);
232
+ }
233
+ // Should be set after the status
228
234
  setPreview(undefined);
229
- } else {
230
- setStatus('error');
231
- setError(error);
232
235
  }
233
- }, [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]);
234
237
  var onImageLoad = useCallback(function (newPreview) {
235
238
  if (newPreview) {
236
239
  if (isSSRClientPreview(newPreview) && ssrReliabilityRef.current.client.status === 'unknown') {
@@ -272,17 +275,9 @@ export var useFilePreview = function useFilePreview(_ref) {
272
275
  status: status,
273
276
  error: error,
274
277
  nonCriticalError: nonCriticalError,
275
- ssrReliabilityRef: ssrReliabilityRef,
278
+ ssrReliability: ssrReliabilityRef.current,
276
279
  onImageError: onImageError,
277
280
  onImageLoad: onImageLoad,
278
281
  getSsrScriptProps: getSsrScriptProps
279
282
  };
280
- };
281
- var initialSsrReliability = {
282
- server: {
283
- status: 'unknown'
284
- },
285
- client: {
286
- status: 'unknown'
287
- }
288
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 {};
@@ -6,7 +6,7 @@ import { MediaFilePreview } from './types';
6
6
  * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
7
7
  */
8
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' | 'unknown-uri';
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 {};
@@ -6,7 +6,7 @@ import { MediaFilePreview } from './types';
6
6
  * Make sure all the values are whitelisted in Measure -> Event Regitry -> "mediaCardRender failed" event
7
7
  */
8
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' | 'unknown-uri';
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.1",
3
+ "version": "0.4.1",
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",