@atlaskit/media-file-preview 0.4.0 → 0.4.2

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,17 @@
1
1
  # @atlaskit/media-file-preview
2
2
 
3
+ ## 0.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [#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
8
+
9
+ ## 0.4.1
10
+
11
+ ### Patch Changes
12
+
13
+ - [#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
14
+
3
15
  ## 0.4.0
4
16
 
5
17
  ### Minor Changes
@@ -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 wasResolvedUpfrontPreviewRef = (0, _react.useRef)(false);
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'
@@ -87,7 +90,7 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
87
90
  } catch (e) {
88
91
  ssrReliabilityRef.current[ssr] = _objectSpread({
89
92
  status: 'fail'
90
- }, (0, _analytics.extractErrorInfo)(e));
93
+ }, (0, _analytics.extractErrorInfo)(e, traceContext));
91
94
  }
92
95
  } else {
93
96
  var _dimensions = ssrData.dimensions,
@@ -100,10 +103,15 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
100
103
  }
101
104
  }
102
105
  };
103
- var _useState9 = (0, _react.useState)(previewInitializer),
104
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
105
- preview = _useState10[0],
106
- setPreview = _useState10[1];
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 || fileState && fileState.status === 'processed' && !(0, _mediaClient.isImageRepresentationReady)(fileState)) {
144
+ if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
125
145
  setStatus('complete');
126
- } else if (!preview && fileState && fileState.status === 'failed-processing' && !(0, _mediaClient.isImageRepresentationReady)(fileState)) {
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, fileState]);
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
- wasResolvedUpfrontPreviewRef.current = true;
149
- } else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
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
- wasResolvedUpfrontPreviewRef.current = true;
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 && !!fileState && 'preview' in fileState && !!fileState.preview && (0, _getPreview.isSupportedLocalPreview)(fileState.mediaType) && (0, _mediaCommon.isMimeTypeSupportedByBrowser)(fileState.mimeType)) {
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, fileState.preview, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(function (e) {
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 && wasResolvedUpfrontPreviewRef.current && !!fileState && (0, _mediaClient.isImageRepresentationReady)(fileState)) {
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, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
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]);
@@ -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 wasResolvedUpfrontPreviewRef = useRef(false);
28
+ const [upfrontPreviewStatus, setUpfrontPreviewStatus] = useState('not-resolved');
29
29
  const ssrReliabilityRef = useRef({
30
30
  server: {
31
31
  status: 'unknown'
@@ -63,7 +63,7 @@ export const useFilePreview = ({
63
63
  } catch (e) {
64
64
  ssrReliabilityRef.current[ssr] = {
65
65
  status: 'fail',
66
- ...extractErrorInfo(e)
66
+ ...extractErrorInfo(e, traceContext)
67
67
  };
68
68
  }
69
69
  } else {
@@ -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 || fileState && fileState.status === 'processed' && !isImageRepresentationReady(fileState)) {
116
+ if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
102
117
  setStatus('complete');
103
- } else if (!preview && fileState && fileState.status === 'failed-processing' && !isImageRepresentationReady(fileState)) {
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, fileState]);
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
- wasResolvedUpfrontPreviewRef.current = true;
126
- } else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
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
- wasResolvedUpfrontPreviewRef.current = true;
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 && !!fileState && 'preview' in fileState && !!fileState.preview && isSupportedLocalPreview(fileState.mediaType) && isMimeTypeSupportedByBrowser(fileState.mimeType)) {
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, fileState.preview, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(e => {
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 && wasResolvedUpfrontPreviewRef.current && !!fileState && isImageRepresentationReady(fileState)) {
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, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
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]);
@@ -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 wasResolvedUpfrontPreviewRef = useRef(false);
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'
@@ -80,7 +83,7 @@ export var useFilePreview = function useFilePreview(_ref) {
80
83
  } catch (e) {
81
84
  ssrReliabilityRef.current[ssr] = _objectSpread({
82
85
  status: 'fail'
83
- }, extractErrorInfo(e));
86
+ }, extractErrorInfo(e, traceContext));
84
87
  }
85
88
  } else {
86
89
  var _dimensions = ssrData.dimensions,
@@ -93,10 +96,15 @@ export var useFilePreview = function useFilePreview(_ref) {
93
96
  }
94
97
  }
95
98
  };
96
- var _useState9 = useState(previewInitializer),
97
- _useState10 = _slicedToArray(_useState9, 2),
98
- preview = _useState10[0],
99
- setPreview = _useState10[1];
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 || fileState && fileState.status === 'processed' && !isImageRepresentationReady(fileState)) {
137
+ if (preview || fileStatus === 'processed' && !isBackendPreviewReady) {
118
138
  setStatus('complete');
119
- } else if (!preview && fileState && fileState.status === 'failed-processing' && !isImageRepresentationReady(fileState)) {
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, fileState]);
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
- wasResolvedUpfrontPreviewRef.current = true;
142
- } else if (!preview && !wasResolvedUpfrontPreviewRef.current && !skipRemote) {
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
- wasResolvedUpfrontPreviewRef.current = true;
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 && !!fileState && 'preview' in fileState && !!fileState.preview && isSupportedLocalPreview(fileState.mediaType) && isMimeTypeSupportedByBrowser(fileState.mimeType)) {
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, fileState.preview, requestDimensions || {}, resizeMode, mediaBlobUrlAttrs).then(setPreview).catch(function (e) {
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 && wasResolvedUpfrontPreviewRef.current && !!fileState && isImageRepresentationReady(fileState)) {
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, fileState, getAndCacheRemotePreviewRef, identifier.id, resizeMode, isBannedLocalPreview, mediaBlobUrlAttrs, preview, requestDimensions, skipRemote]);
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]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-file-preview",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
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",
@@ -38,7 +38,7 @@
38
38
  "@atlaskit/media-client": "^26.1.0",
39
39
  "@atlaskit/media-client-react": "^2.0.1",
40
40
  "@atlaskit/media-common": "^11.0.0",
41
- "@atlaskit/media-ui": "^25.0.12",
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"