@atlaskit/media-file-preview 0.13.0 → 0.14.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,13 @@
1
1
  # @atlaskit/media-file-preview
2
2
 
3
+ ## 0.14.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`0fca09ae4fa6d`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/0fca09ae4fa6d) -
8
+ Removing the blob URL conversion and fixing the unnecessary dual fetching of images when VC fixes
9
+ are active
10
+
3
11
  ## 0.13.0
4
12
 
5
13
  ### Minor Changes
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -8,10 +7,7 @@ exports.getKey = exports.generateScriptProps = exports.GLOBAL_MEDIA_NAMESPACE =
8
7
  exports.getMediaCardSSR = getMediaCardSSR;
9
8
  exports.getMediaGlobalScope = getMediaGlobalScope;
10
9
  exports.storeDataURI = void 0;
11
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
10
  var _printScript = require("./printScript");
13
- 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; }
14
- 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; }
15
11
  // ----- WARNING -----
16
12
  // This is a very sensitive fraction of code.
17
13
  // Any changes to this file must be tested directly in product before merging.
@@ -65,34 +61,23 @@ var storeDataURI = exports.storeDataURI = function storeDataURI(key, paramDataUR
65
61
  if (img && srcSet) {
66
62
  img.srcset = srcSet;
67
63
  }
64
+ var loadPromise = new Promise(function (resolve, reject) {
65
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
66
+ img === null || img === void 0 || img.addEventListener('load', function () {
67
+ resolve(void 0);
68
+ });
68
69
 
69
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
70
- img === null || img === void 0 || img.addEventListener('load', function () {
71
- if (img.currentSrc.startsWith('blob:')) {
72
- return;
73
- }
74
- fetch(img.currentSrc).then(function (res) {
75
- return res.blob();
76
- }).then(function (blob) {
77
- return URL.createObjectURL(blob);
78
- }).then(function (blobUrl) {
79
- img.src = blobUrl;
80
- img.srcset = '';
81
- mediaCardSsr[key] = _objectSpread(_objectSpread({}, mediaCardSsr[key]), {}, {
82
- dataURI: blobUrl,
83
- srcSet: ''
84
- });
85
- }).catch(function (err) {
86
- mediaCardSsr[key] = _objectSpread(_objectSpread({}, mediaCardSsr[key]), {}, {
87
- error: err
88
- });
70
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
71
+ img === null || img === void 0 || img.addEventListener('error', function () {
72
+ reject(new Error('Failed to load image'));
89
73
  });
90
74
  });
91
75
  mediaCardSsr[key] = isPreviousImageLarger ? prevData : {
92
76
  dataURI: dataURI,
93
77
  dimensions: dimensions,
94
78
  error: error,
95
- srcSet: srcSet
79
+ srcSet: srcSet,
80
+ loadPromise: loadPromise
96
81
  };
97
82
  } else {
98
83
  mediaCardSsr[key] = {
@@ -184,6 +184,25 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
184
184
  }
185
185
  }, [preview, status, fileState, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
186
186
 
187
+ //----------------------------------------------------------------
188
+ // SSR Loading
189
+ //----------------------------------------------------------------
190
+
191
+ (0, _react.useEffect)(function () {
192
+ var _getSSRData;
193
+ if (!(0, _platformFeatureFlags.fg)('media-perf-uplift-mutation-fix')) {
194
+ return;
195
+ }
196
+ var loadPromise = (_getSSRData = (0, _globalScope.getSSRData)(identifier, resizeMode)) === null || _getSSRData === void 0 ? void 0 : _getSSRData.loadPromise;
197
+ if (preview && (0, _getPreview.isSSRDataPreview)(preview) && loadPromise) {
198
+ loadPromise.then(function () {
199
+ setStatus('complete');
200
+ }).catch(function () {
201
+ setPreview(undefined);
202
+ });
203
+ }
204
+ }, [preview, identifier, resizeMode]);
205
+
187
206
  //----------------------------------------------------------------
188
207
  // Preview Fetch Helper
189
208
  //----------------------------------------------------------------
@@ -249,8 +268,8 @@ var useFilePreview = exports.useFilePreview = function useFilePreview(_ref) {
249
268
  else if (!error && !nonCriticalError && (!preview || (0, _helpers.isBigger)(preview.dimensions, requestDimensions) ||
250
269
  // We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
251
270
  (0, _getPreview.isSSRPreview)(preview)) && !skipRemote && upfrontPreviewStatus === 'resolved' && isBackendPreviewReady) {
252
- // If the preview is SSR and it's a blob URL, we can skip the refetch
253
- if (preview && (0, _getPreview.isSSRPreview)(preview) && preview.dataURI.startsWith('blob:') && (0, _platformFeatureFlags.fg)('media-perf-uplift-mutation-fix')) {
271
+ // If the preview is SSR, we can skip the refetch as it will be handled by the global scope promise
272
+ if (preview && (0, _getPreview.isSSRPreview)(preview) && (0, _platformFeatureFlags.fg)('media-perf-uplift-mutation-fix')) {
254
273
  return;
255
274
  }
256
275
  setIsLoading(true);
@@ -45,32 +45,23 @@ export const storeDataURI = (key, paramDataURI, paramMode, paramSrcSet, dimensio
45
45
  if (img && srcSet) {
46
46
  img.srcset = srcSet;
47
47
  }
48
+ const loadPromise = new Promise((resolve, reject) => {
49
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
50
+ img === null || img === void 0 ? void 0 : img.addEventListener('load', () => {
51
+ resolve(void 0);
52
+ });
48
53
 
49
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
50
- img === null || img === void 0 ? void 0 : img.addEventListener('load', () => {
51
- if (img.currentSrc.startsWith('blob:')) {
52
- return;
53
- }
54
- fetch(img.currentSrc).then(res => res.blob()).then(blob => URL.createObjectURL(blob)).then(blobUrl => {
55
- img.src = blobUrl;
56
- img.srcset = '';
57
- mediaCardSsr[key] = {
58
- ...mediaCardSsr[key],
59
- dataURI: blobUrl,
60
- srcSet: ''
61
- };
62
- }).catch(err => {
63
- mediaCardSsr[key] = {
64
- ...mediaCardSsr[key],
65
- error: err
66
- };
54
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
55
+ img === null || img === void 0 ? void 0 : img.addEventListener('error', () => {
56
+ reject(new Error('Failed to load image'));
67
57
  });
68
58
  });
69
59
  mediaCardSsr[key] = isPreviousImageLarger ? prevData : {
70
60
  dataURI,
71
61
  dimensions,
72
62
  error,
73
- srcSet
63
+ srcSet,
64
+ loadPromise
74
65
  };
75
66
  } else {
76
67
  mediaCardSsr[key] = {
@@ -153,6 +153,25 @@ export const useFilePreview = ({
153
153
  }
154
154
  }, [preview, status, fileState, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
155
155
 
156
+ //----------------------------------------------------------------
157
+ // SSR Loading
158
+ //----------------------------------------------------------------
159
+
160
+ useEffect(() => {
161
+ var _getSSRData;
162
+ if (!fg('media-perf-uplift-mutation-fix')) {
163
+ return;
164
+ }
165
+ const loadPromise = (_getSSRData = getSSRData(identifier, resizeMode)) === null || _getSSRData === void 0 ? void 0 : _getSSRData.loadPromise;
166
+ if (preview && isSSRDataPreview(preview) && loadPromise) {
167
+ loadPromise.then(() => {
168
+ setStatus('complete');
169
+ }).catch(() => {
170
+ setPreview(undefined);
171
+ });
172
+ }
173
+ }, [preview, identifier, resizeMode]);
174
+
156
175
  //----------------------------------------------------------------
157
176
  // Preview Fetch Helper
158
177
  //----------------------------------------------------------------
@@ -220,8 +239,8 @@ export const useFilePreview = ({
220
239
  else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
221
240
  // We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
222
241
  isSSRPreview(preview)) && !skipRemote && upfrontPreviewStatus === 'resolved' && isBackendPreviewReady) {
223
- // If the preview is SSR and it's a blob URL, we can skip the refetch
224
- if (preview && isSSRPreview(preview) && preview.dataURI.startsWith('blob:') && fg('media-perf-uplift-mutation-fix')) {
242
+ // If the preview is SSR, we can skip the refetch as it will be handled by the global scope promise
243
+ if (preview && isSSRPreview(preview) && fg('media-perf-uplift-mutation-fix')) {
225
244
  return;
226
245
  }
227
246
  setIsLoading(true);
@@ -1,6 +1,3 @@
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; }
4
1
  import { printFunctionCall, printScript } from './printScript';
5
2
  // ----- WARNING -----
6
3
  // This is a very sensitive fraction of code.
@@ -55,34 +52,23 @@ export var storeDataURI = function storeDataURI(key, paramDataURI, paramMode, pa
55
52
  if (img && srcSet) {
56
53
  img.srcset = srcSet;
57
54
  }
55
+ var loadPromise = new Promise(function (resolve, reject) {
56
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
57
+ img === null || img === void 0 || img.addEventListener('load', function () {
58
+ resolve(void 0);
59
+ });
58
60
 
59
- // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
60
- img === null || img === void 0 || img.addEventListener('load', function () {
61
- if (img.currentSrc.startsWith('blob:')) {
62
- return;
63
- }
64
- fetch(img.currentSrc).then(function (res) {
65
- return res.blob();
66
- }).then(function (blob) {
67
- return URL.createObjectURL(blob);
68
- }).then(function (blobUrl) {
69
- img.src = blobUrl;
70
- img.srcset = '';
71
- mediaCardSsr[key] = _objectSpread(_objectSpread({}, mediaCardSsr[key]), {}, {
72
- dataURI: blobUrl,
73
- srcSet: ''
74
- });
75
- }).catch(function (err) {
76
- mediaCardSsr[key] = _objectSpread(_objectSpread({}, mediaCardSsr[key]), {}, {
77
- error: err
78
- });
61
+ // eslint-disable-next-line @repo/internal/dom-events/no-unsafe-event-listeners
62
+ img === null || img === void 0 || img.addEventListener('error', function () {
63
+ reject(new Error('Failed to load image'));
79
64
  });
80
65
  });
81
66
  mediaCardSsr[key] = isPreviousImageLarger ? prevData : {
82
67
  dataURI: dataURI,
83
68
  dimensions: dimensions,
84
69
  error: error,
85
- srcSet: srcSet
70
+ srcSet: srcSet,
71
+ loadPromise: loadPromise
86
72
  };
87
73
  } else {
88
74
  mediaCardSsr[key] = {
@@ -177,6 +177,25 @@ export var useFilePreview = function useFilePreview(_ref) {
177
177
  }
178
178
  }, [preview, status, fileState, isBackendPreviewReady, fileStateErrorMessage, upfrontPreviewStatus]);
179
179
 
180
+ //----------------------------------------------------------------
181
+ // SSR Loading
182
+ //----------------------------------------------------------------
183
+
184
+ useEffect(function () {
185
+ var _getSSRData;
186
+ if (!fg('media-perf-uplift-mutation-fix')) {
187
+ return;
188
+ }
189
+ var loadPromise = (_getSSRData = getSSRData(identifier, resizeMode)) === null || _getSSRData === void 0 ? void 0 : _getSSRData.loadPromise;
190
+ if (preview && isSSRDataPreview(preview) && loadPromise) {
191
+ loadPromise.then(function () {
192
+ setStatus('complete');
193
+ }).catch(function () {
194
+ setPreview(undefined);
195
+ });
196
+ }
197
+ }, [preview, identifier, resizeMode]);
198
+
180
199
  //----------------------------------------------------------------
181
200
  // Preview Fetch Helper
182
201
  //----------------------------------------------------------------
@@ -242,8 +261,8 @@ export var useFilePreview = function useFilePreview(_ref) {
242
261
  else if (!error && !nonCriticalError && (!preview || isBigger(preview.dimensions, requestDimensions) ||
243
262
  // We always refetch SSR preview to be able to browser-cache a version without the token in the query parameters
244
263
  isSSRPreview(preview)) && !skipRemote && upfrontPreviewStatus === 'resolved' && isBackendPreviewReady) {
245
- // If the preview is SSR and it's a blob URL, we can skip the refetch
246
- if (preview && isSSRPreview(preview) && preview.dataURI.startsWith('blob:') && fg('media-perf-uplift-mutation-fix')) {
264
+ // If the preview is SSR, we can skip the refetch as it will be handled by the global scope promise
265
+ if (preview && isSSRPreview(preview) && fg('media-perf-uplift-mutation-fix')) {
247
266
  return;
248
267
  }
249
268
  setIsLoading(true);
@@ -6,5 +6,6 @@ export type MediaCardSsrData = {
6
6
  error?: MediaFilePreviewErrorInfo;
7
7
  mode?: string;
8
8
  srcSet?: string;
9
+ loadPromise?: Promise<void>;
9
10
  };
10
11
  export type MediaCardSsr = Record<string, MediaCardSsrData>;
@@ -6,5 +6,6 @@ export type MediaCardSsrData = {
6
6
  error?: MediaFilePreviewErrorInfo;
7
7
  mode?: string;
8
8
  srcSet?: string;
9
+ loadPromise?: Promise<void>;
9
10
  };
10
11
  export type MediaCardSsr = Record<string, MediaCardSsrData>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-file-preview",
3
- "version": "0.13.0",
3
+ "version": "0.14.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",
@@ -51,6 +51,7 @@
51
51
  "@atlaskit/media-test-data": "^3.2.0",
52
52
  "@atlaskit/section-message": "^8.9.0",
53
53
  "@atlaskit/ssr": "workspace:^",
54
+ "@atlassian/feature-flags-test-utils": "^1.0.0",
54
55
  "@testing-library/react": "^13.4.0",
55
56
  "@testing-library/react-hooks": "^8.0.1",
56
57
  "react-dom": "^18.2.0",