@atlaskit/media-viewer 49.2.7 → 49.3.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.
Files changed (49) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/analytics/index.js +1 -1
  3. package/dist/cjs/analytics/ufoExperiences.js +1 -1
  4. package/dist/cjs/components/media-viewer.js +4 -2
  5. package/dist/cjs/item-viewer.js +20 -3
  6. package/dist/cjs/list.js +4 -2
  7. package/dist/cjs/media-viewer.js +4 -2
  8. package/dist/cjs/viewerOptions.js +5 -0
  9. package/dist/cjs/viewers/archiveSidebar/archive.js +52 -8
  10. package/dist/cjs/viewers/customViewer/customViewer.js +55 -0
  11. package/dist/es2019/analytics/index.js +1 -1
  12. package/dist/es2019/analytics/ufoExperiences.js +1 -1
  13. package/dist/es2019/components/media-viewer.js +4 -2
  14. package/dist/es2019/item-viewer.js +18 -3
  15. package/dist/es2019/list.js +4 -2
  16. package/dist/es2019/media-viewer.js +4 -2
  17. package/dist/es2019/viewerOptions.js +1 -0
  18. package/dist/es2019/viewers/archiveSidebar/archive.js +27 -5
  19. package/dist/es2019/viewers/customViewer/customViewer.js +37 -0
  20. package/dist/esm/analytics/index.js +1 -1
  21. package/dist/esm/analytics/ufoExperiences.js +1 -1
  22. package/dist/esm/components/media-viewer.js +4 -2
  23. package/dist/esm/item-viewer.js +20 -3
  24. package/dist/esm/list.js +4 -2
  25. package/dist/esm/media-viewer.js +4 -2
  26. package/dist/esm/viewerOptions.js +1 -0
  27. package/dist/esm/viewers/archiveSidebar/archive.js +52 -8
  28. package/dist/esm/viewers/customViewer/customViewer.js +46 -0
  29. package/dist/types/components/media-viewer.d.ts +1 -1
  30. package/dist/types/components/types.d.ts +2 -0
  31. package/dist/types/errors.d.ts +2 -2
  32. package/dist/types/index.d.ts +1 -0
  33. package/dist/types/item-viewer.d.ts +4 -1
  34. package/dist/types/list.d.ts +3 -1
  35. package/dist/types/media-viewer.d.ts +2 -0
  36. package/dist/types/viewerOptions.d.ts +21 -0
  37. package/dist/types/viewers/archiveSidebar/types.d.ts +2 -0
  38. package/dist/types/viewers/customViewer/customViewer.d.ts +12 -0
  39. package/dist/types-ts4.5/components/media-viewer.d.ts +1 -1
  40. package/dist/types-ts4.5/components/types.d.ts +2 -0
  41. package/dist/types-ts4.5/errors.d.ts +2 -2
  42. package/dist/types-ts4.5/index.d.ts +1 -0
  43. package/dist/types-ts4.5/item-viewer.d.ts +4 -1
  44. package/dist/types-ts4.5/list.d.ts +3 -1
  45. package/dist/types-ts4.5/media-viewer.d.ts +2 -0
  46. package/dist/types-ts4.5/viewerOptions.d.ts +21 -0
  47. package/dist/types-ts4.5/viewers/archiveSidebar/types.d.ts +2 -0
  48. package/dist/types-ts4.5/viewers/customViewer/customViewer.d.ts +12 -0
  49. package/package.json +6 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # @atlaskit/media-viewer
2
2
 
3
+ ## 49.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`6099ac032dd30`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/6099ac032dd30) -
8
+ Added viewerOptions to override file preview renderer in media components
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+
3
14
  ## 49.2.7
4
15
 
5
16
  ### Patch Changes
@@ -10,7 +10,7 @@ exports.packageVersion = exports.packageName = void 0;
10
10
  var _analytics = require("@atlaskit/media-common/analytics");
11
11
  var componentName = exports.component = exports.componentName = 'mediaViewer';
12
12
  var packageName = exports.packageName = "@atlaskit/media-viewer";
13
- var packageVersion = exports.packageVersion = "49.2.7";
13
+ var packageVersion = exports.packageVersion = "49.3.0";
14
14
  function getFileAttributes(fileState) {
15
15
  if (!fileState) {
16
16
  return {
@@ -12,7 +12,7 @@ var _mediaCommon = require("@atlaskit/media-common");
12
12
  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; }
13
13
  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; }
14
14
  var packageName = "@atlaskit/media-viewer";
15
- var packageVersion = "49.2.7";
15
+ var packageVersion = "49.3.0";
16
16
  var ufoExperience;
17
17
  var getExperience = function getExperience() {
18
18
  if (!ufoExperience) {
@@ -47,7 +47,8 @@ var MediaViewerBase = exports.MediaViewerBase = function MediaViewerBase(_ref) {
47
47
  collectionName = _ref.collectionName,
48
48
  items = _ref.items,
49
49
  extensions = _ref.extensions,
50
- contextId = _ref.contextId;
50
+ contextId = _ref.contextId,
51
+ viewerOptions = _ref.viewerOptions;
51
52
  var _useMemo = (0, _react.useMemo)(function () {
52
53
  return normaliseItems(items, selectedItem, collectionName);
53
54
  }, [items, selectedItem, collectionName]),
@@ -80,7 +81,8 @@ var MediaViewerBase = exports.MediaViewerBase = function MediaViewerBase(_ref) {
80
81
  items: normalisedItems,
81
82
  featureFlags: featureFlags,
82
83
  extensions: extensions,
83
- contextId: contextId
84
+ contextId: contextId,
85
+ viewerOptions: viewerOptions
84
86
  });
85
87
  };
86
88
 
@@ -11,6 +11,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
13
13
  var _mediaClient = require("@atlaskit/media-client");
14
+ var _primitives = require("@atlaskit/primitives");
14
15
  var _reactIntlNext = require("react-intl-next");
15
16
  var _mediaUi = require("@atlaskit/media-ui");
16
17
  var _codeViewer = require("@atlaskit/media-ui/codeViewer");
@@ -28,6 +29,7 @@ var _interactiveImg = require("./viewers/image/interactive-img");
28
29
  var _archiveViewerLoader = _interopRequireDefault(require("./viewers/archiveSidebar/archiveViewerLoader"));
29
30
  var _mediaCommon = require("@atlaskit/media-common");
30
31
  var _ufoExperiences = require("./analytics/ufoExperiences");
32
+ var _customViewer = require("./viewers/customViewer/customViewer");
31
33
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
32
34
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != (0, _typeof2.default)(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
33
35
  var ImageViewer = (0, _reactLoadable.default)({
@@ -119,7 +121,8 @@ var ItemViewerBase = exports.ItemViewerBase = function ItemViewerBase(_ref) {
119
121
  onClose = _ref.onClose,
120
122
  previewCount = _ref.previewCount,
121
123
  contextId = _ref.contextId,
122
- createAnalyticsEvent = _ref.createAnalyticsEvent;
124
+ createAnalyticsEvent = _ref.createAnalyticsEvent,
125
+ viewerOptions = _ref.viewerOptions;
123
126
  // States and Refs
124
127
  var _useState = (0, _react.useState)(_domain.Outcome.pending()),
125
128
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -204,14 +207,28 @@ var ItemViewerBase = exports.ItemViewerBase = function ItemViewerBase(_ref) {
204
207
  setItem(_domain.Outcome.failed(mediaViewerError, fileState));
205
208
  }, [fileState]);
206
209
  var renderItem = function renderItem(fileItem) {
210
+ var _viewerOptions$custom;
207
211
  var collectionName = (0, _mediaClient.isFileIdentifier)(identifier) ? identifier.collectionName : undefined;
208
212
  var viewerProps = {
209
213
  mediaClient: mediaClient,
210
214
  item: fileItem,
211
215
  collectionName: collectionName,
212
216
  onClose: onClose,
213
- previewCount: previewCount
217
+ previewCount: previewCount,
218
+ viewerOptions: viewerOptions
214
219
  };
220
+ var customRenderer = viewerOptions === null || viewerOptions === void 0 || (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(function (renderer) {
221
+ return renderer.shouldUseCustomRenderer({
222
+ fileItem: fileItem
223
+ });
224
+ });
225
+ if (customRenderer) {
226
+ return /*#__PURE__*/_react.default.createElement(_customViewer.CustomViewer, (0, _extends2.default)({
227
+ customRendererConfig: customRenderer,
228
+ onError: onLoadFail,
229
+ onSuccess: onSuccess
230
+ }, viewerProps));
231
+ }
215
232
 
216
233
  // TODO: fix all of the item errors
217
234
 
@@ -288,7 +305,7 @@ var ItemViewerBase = exports.ItemViewerBase = function ItemViewerBase(_ref) {
288
305
  fileState: _fileState,
289
306
  fileStateFlags: fileStateFlagsRef.current,
290
307
  traceContext: traceContext.current
291
- }, /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _mediaUi.messages.try_downloading_file)), renderDownloadButton(_fileState, error));
308
+ }, /*#__PURE__*/_react.default.createElement(_primitives.Text, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _mediaUi.messages.try_downloading_file)), renderDownloadButton(_fileState, error));
292
309
  } else {
293
310
  return /*#__PURE__*/_react.default.createElement(_errorMessage.default, {
294
311
  fileId: (0, _mediaClient.isFileIdentifier)(identifier) ? identifier.id : 'undefined',
package/dist/cjs/list.js CHANGED
@@ -25,7 +25,8 @@ var List = exports.List = function List(_ref) {
25
25
  featureFlags = _ref.featureFlags,
26
26
  isSidebarVisible = _ref.isSidebarVisible,
27
27
  onNavigationChange = _ref.onNavigationChange,
28
- items = _ref.items;
28
+ items = _ref.items,
29
+ viewerOptions = _ref.viewerOptions;
29
30
  var _useState = (0, _react.useState)(defaultSelectedItem),
30
31
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
31
32
  selectedItem = _useState2[0],
@@ -58,7 +59,8 @@ var List = exports.List = function List(_ref) {
58
59
  onClose: onClose,
59
60
  previewCount: previewCount,
60
61
  contextId: contextId,
61
- featureFlags: featureFlags
62
+ featureFlags: featureFlags,
63
+ viewerOptions: viewerOptions
62
64
  }), /*#__PURE__*/_react.default.createElement(_navigation.Navigation, {
63
65
  items: items,
64
66
  selectedItem: selectedItem,
@@ -32,7 +32,8 @@ var MediaViewerComponent = function MediaViewerComponent(_ref) {
32
32
  innerRef = _ref.innerRef,
33
33
  _onClose = _ref.onClose,
34
34
  selectedItem = _ref.selectedItem,
35
- intl = _ref.intl;
35
+ intl = _ref.intl,
36
+ viewerOptions = _ref.viewerOptions;
36
37
  var _useState = (0, _react.useState)(false),
37
38
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
38
39
  isSidebarVisible = _useState2[0],
@@ -95,7 +96,8 @@ var MediaViewerComponent = function MediaViewerComponent(_ref) {
95
96
  },
96
97
  isSidebarVisible: isSidebarVisible,
97
98
  contextId: contextId,
98
- featureFlags: featureFlags
99
+ featureFlags: featureFlags,
100
+ viewerOptions: viewerOptions
99
101
  })), renderSidebar()));
100
102
  return intl ? content : /*#__PURE__*/_react.default.createElement(_reactIntlNext.IntlProvider, {
101
103
  locale: "en"
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -19,6 +19,7 @@ var _unzipit = require("unzipit");
19
19
  var _reactIntlNext = require("react-intl-next");
20
20
  var _mediaUi = require("@atlaskit/media-ui");
21
21
  var _codeViewer = require("@atlaskit/media-ui/codeViewer");
22
+ var _primitives = require("@atlaskit/primitives");
22
23
  var _domain = require("../../domain");
23
24
  var _styleWrappers = require("../../styleWrappers");
24
25
  var _audioMediaServicesAudio = _interopRequireDefault(require("@atlaskit/icon/core/migration/audio--media-services-audio"));
@@ -98,7 +99,8 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
98
99
  case 0:
99
100
  _this.setState({
100
101
  content: _domain.Outcome.successful(_objectSpread(_objectSpread({}, _this.state.content.data), {}, {
101
- selectedArchiveEntry: undefined
102
+ selectedArchiveEntry: undefined,
103
+ hasLoadedEntries: false // displays a nice loading spinner for the content viewer
102
104
  }))
103
105
  });
104
106
  src = '';
@@ -112,7 +114,7 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
112
114
  _context2.next = 8;
113
115
  return (0, _utils.rejectAfter)(function () {
114
116
  return selectedArchiveEntry.blob();
115
- });
117
+ }, 10000);
116
118
  case 8:
117
119
  blob = _context2.sent;
118
120
  src = URL.createObjectURL(blob);
@@ -142,7 +144,8 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
142
144
  isDirectory: selectedArchiveEntry.isDirectory,
143
145
  error: undefined,
144
146
  codeViewerSrc: codeViewerSrc,
145
- isCodeMimeType: isCodeMimeType
147
+ isCodeMimeType: isCodeMimeType,
148
+ hasLoadedEntries: true
146
149
  }))
147
150
  });
148
151
  case 20:
@@ -244,7 +247,9 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
244
247
  }, {
245
248
  key: "renderArchiveItemViewer",
246
249
  value: function renderArchiveItemViewer(content) {
247
- var item = this.props.item;
250
+ var _this$props2 = this.props,
251
+ item = _this$props2.item,
252
+ viewerOptions = _this$props2.viewerOptions;
248
253
  var src = content.src,
249
254
  name = content.name,
250
255
  isDirectory = content.isDirectory,
@@ -256,9 +261,48 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
256
261
  return this.renderPreviewError(error, selectedArchiveEntry);
257
262
  }
258
263
  if (!isDirectory && selectedArchiveEntry) {
264
+ var _viewerOptions$custom;
259
265
  if (!name || !src) {
260
266
  return this.renderPreviewError(new _errors.ArchiveViewerError('archiveviewer-missing-name-src'), selectedArchiveEntry);
261
267
  }
268
+ var customRenderer = viewerOptions === null || viewerOptions === void 0 || (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(function (renderer) {
269
+ return renderer.shouldUseCustomRenderer({
270
+ fileItem: item,
271
+ archiveFileItem: {
272
+ name: name
273
+ }
274
+ });
275
+ });
276
+ if (customRenderer) {
277
+ return /*#__PURE__*/_react.default.createElement(_styleWrappers2.ArchiveItemViewerWrapper, null, customRenderer.renderContent({
278
+ fileItem: item,
279
+ archiveFileItem: {
280
+ name: name
281
+ },
282
+ getBinaryContent: function () {
283
+ var _getBinaryContent = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4() {
284
+ return _regenerator.default.wrap(function _callee4$(_context4) {
285
+ while (1) switch (_context4.prev = _context4.next) {
286
+ case 0:
287
+ _context4.next = 2;
288
+ return fetch(src);
289
+ case 2:
290
+ return _context4.abrupt("return", _context4.sent.blob());
291
+ case 3:
292
+ case "end":
293
+ return _context4.stop();
294
+ }
295
+ }, _callee4);
296
+ }));
297
+ function getBinaryContent() {
298
+ return _getBinaryContent.apply(this, arguments);
299
+ }
300
+ return getBinaryContent;
301
+ }(),
302
+ onLoad: this.onViewerLoad(selectedArchiveEntry),
303
+ onError: this.onViewerError('archiveviewer-customrenderer-onerror', selectedArchiveEntry)
304
+ }));
305
+ }
262
306
  var mediaType = (0, _utils.getMediaTypeFromFilename)(name);
263
307
  if (isCodeMimeType) {
264
308
  // Same code viewer logic as in Item-Viewer.tsx
@@ -330,16 +374,16 @@ var ArchiveViewerBase = exports.ArchiveViewerBase = /*#__PURE__*/function (_Base
330
374
  }, {
331
375
  key: "renderPreviewError",
332
376
  value: function renderPreviewError(error, entry) {
333
- var _this$props2 = this.props,
334
- item = _this$props2.item,
335
- createAnalyticsEvent = _this$props2.createAnalyticsEvent;
377
+ var _this$props3 = this.props,
378
+ item = _this$props3.item,
379
+ createAnalyticsEvent = _this$props3.createAnalyticsEvent;
336
380
  (0, _analytics.fireAnalytics)((0, _zipEntryLoadFailed.createZipEntryLoadFailedEvent)(item, error, entry), createAnalyticsEvent);
337
381
  return /*#__PURE__*/_react.default.createElement(_styleWrappers.ListWrapper, null, /*#__PURE__*/_react.default.createElement(_errorMessage.default, {
338
382
  fileId: item.id,
339
383
  fileState: item,
340
384
  error: error,
341
385
  supressAnalytics: true
342
- }, /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _mediaUi.messages.try_downloading_file))));
386
+ }, /*#__PURE__*/_react.default.createElement(_primitives.Text, null, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _mediaUi.messages.try_downloading_file))));
343
387
  }
344
388
  }]);
345
389
  return ArchiveViewerBase;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.CustomViewer = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _errors = require("../../errors");
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _loading = require("../../loading");
13
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
14
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
15
+ var CustomViewer = exports.CustomViewer = function CustomViewer(_ref) {
16
+ var mediaClient = _ref.mediaClient,
17
+ item = _ref.item,
18
+ customRendererConfig = _ref.customRendererConfig,
19
+ onSuccess = _ref.onSuccess,
20
+ onError = _ref.onError;
21
+ var _useState = (0, _react.useState)(),
22
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
23
+ getBinaryContent = _useState2[0],
24
+ setGetBinaryContent = _useState2[1];
25
+ (0, _react.useEffect)(function () {
26
+ setGetBinaryContent(undefined);
27
+ var abortController = new AbortController();
28
+ // This sets the 'getBinaryContent' to an async function that fetches the binary content of the file
29
+ // The 'getBinaryContent' function has to be updated when the item changes
30
+ // This approach handles aborting in-progress request outside of the custom-renderer concern
31
+ if (item.status === 'processed' || item.status === 'failed-processing') {
32
+ setGetBinaryContent(function () {
33
+ return function () {
34
+ return mediaClient.mediaStore.getFileBinary(item.id, undefined, abortController);
35
+ };
36
+ });
37
+ }
38
+ return function () {
39
+ return abortController.abort();
40
+ };
41
+ }, [item, mediaClient]);
42
+ var onLoadFailed = (0, _react.useCallback)(function (error) {
43
+ var mediaError = new _errors.MediaViewerError('custom-viewer-error', error);
44
+ onError(mediaError, item);
45
+ }, [item, onError]);
46
+ if (!getBinaryContent) {
47
+ return /*#__PURE__*/_react.default.createElement(_loading.Spinner, null);
48
+ }
49
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, customRendererConfig.renderContent({
50
+ fileItem: item,
51
+ getBinaryContent: getBinaryContent,
52
+ onLoad: onSuccess,
53
+ onError: onLoadFailed
54
+ }));
55
+ };
@@ -1,7 +1,7 @@
1
1
  import { ANALYTICS_MEDIA_CHANNEL, sanitiseAnalyticsPayload } from '@atlaskit/media-common/analytics';
2
2
  const componentName = 'mediaViewer';
3
3
  const packageName = "@atlaskit/media-viewer";
4
- const packageVersion = "49.2.7";
4
+ const packageVersion = "49.3.0";
5
5
  export { packageName, packageVersion, componentName, componentName as component };
6
6
  export function getFileAttributes(fileState) {
7
7
  if (!fileState) {
@@ -2,7 +2,7 @@ import { UFOExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atl
2
2
  import { getMediaEnvironment, getMediaRegion } from '@atlaskit/media-client';
3
3
  import { getFeatureFlagKeysAllProducts } from '@atlaskit/media-common';
4
4
  const packageName = "@atlaskit/media-viewer";
5
- const packageVersion = "49.2.7";
5
+ const packageVersion = "49.3.0";
6
6
  let ufoExperience;
7
7
  const getExperience = () => {
8
8
  if (!ufoExperience) {
@@ -32,7 +32,8 @@ export const MediaViewerBase = ({
32
32
  collectionName,
33
33
  items,
34
34
  extensions,
35
- contextId
35
+ contextId,
36
+ viewerOptions
36
37
  }) => {
37
38
  const {
38
39
  items: normalisedItems,
@@ -65,7 +66,8 @@ export const MediaViewerBase = ({
65
66
  items: normalisedItems,
66
67
  featureFlags: featureFlags,
67
68
  extensions: extensions,
68
- contextId: contextId
69
+ contextId: contextId,
70
+ viewerOptions: viewerOptions
69
71
  });
70
72
  };
71
73
 
@@ -2,6 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useCallback, useEffect, useState, useRef } from 'react';
3
3
  import Loadable from 'react-loadable';
4
4
  import { isExternalImageIdentifier, isFileIdentifier } from '@atlaskit/media-client';
5
+ import { Text } from '@atlaskit/primitives';
5
6
  import { FormattedMessage } from 'react-intl-next';
6
7
  import { messages } from '@atlaskit/media-ui';
7
8
  import { isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
@@ -19,6 +20,7 @@ import { InteractiveImg } from './viewers/image/interactive-img';
19
20
  import ArchiveViewerLoader from './viewers/archiveSidebar/archiveViewerLoader';
20
21
  import { getRandomHex } from '@atlaskit/media-common';
21
22
  import { startMediaFileUfoExperience, succeedMediaFileUfoExperience } from './analytics/ufoExperiences';
23
+ import { CustomViewer } from './viewers/customViewer/customViewer';
22
24
  const ImageViewer = Loadable({
23
25
  loader: () => import( /* webpackChunkName: "@atlaskit-internal_imageViewer" */'./viewers/image').then(mod => mod.ImageViewer),
24
26
  loading: () => /*#__PURE__*/React.createElement(Spinner, null)
@@ -55,7 +57,8 @@ export const ItemViewerBase = ({
55
57
  onClose,
56
58
  previewCount,
57
59
  contextId,
58
- createAnalyticsEvent
60
+ createAnalyticsEvent,
61
+ viewerOptions
59
62
  }) => {
60
63
  // States and Refs
61
64
  const [item, setItem] = useState(Outcome.pending());
@@ -141,14 +144,26 @@ export const ItemViewerBase = ({
141
144
  setItem(Outcome.failed(mediaViewerError, fileState));
142
145
  }, [fileState]);
143
146
  const renderItem = fileItem => {
147
+ var _viewerOptions$custom;
144
148
  const collectionName = isFileIdentifier(identifier) ? identifier.collectionName : undefined;
145
149
  const viewerProps = {
146
150
  mediaClient,
147
151
  item: fileItem,
148
152
  collectionName,
149
153
  onClose,
150
- previewCount
154
+ previewCount,
155
+ viewerOptions
151
156
  };
157
+ const customRenderer = viewerOptions === null || viewerOptions === void 0 ? void 0 : (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(renderer => renderer.shouldUseCustomRenderer({
158
+ fileItem
159
+ }));
160
+ if (customRenderer) {
161
+ return /*#__PURE__*/React.createElement(CustomViewer, _extends({
162
+ customRendererConfig: customRenderer,
163
+ onError: onLoadFail,
164
+ onSuccess: onSuccess
165
+ }, viewerProps));
166
+ }
152
167
 
153
168
  // TODO: fix all of the item errors
154
169
 
@@ -227,7 +242,7 @@ export const ItemViewerBase = ({
227
242
  fileState: fileState,
228
243
  fileStateFlags: fileStateFlagsRef.current,
229
244
  traceContext: traceContext.current
230
- }, /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file)), renderDownloadButton(fileState, error));
245
+ }, /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file)), renderDownloadButton(fileState, error));
231
246
  } else {
232
247
  return /*#__PURE__*/React.createElement(ErrorMessage, {
233
248
  fileId: isFileIdentifier(identifier) ? identifier.id : 'undefined',
@@ -14,7 +14,8 @@ export const List = ({
14
14
  featureFlags,
15
15
  isSidebarVisible,
16
16
  onNavigationChange,
17
- items
17
+ items,
18
+ viewerOptions
18
19
  }) => {
19
20
  const [selectedItem, setSelectedItem] = useState(defaultSelectedItem);
20
21
  const [previewCount, setPreviewCount] = useState(0);
@@ -39,7 +40,8 @@ export const List = ({
39
40
  onClose: onClose,
40
41
  previewCount: previewCount,
41
42
  contextId: contextId,
42
- featureFlags: featureFlags
43
+ featureFlags: featureFlags,
44
+ viewerOptions: viewerOptions
43
45
  }), /*#__PURE__*/React.createElement(Navigation, {
44
46
  items: items,
45
47
  selectedItem: selectedItem,
@@ -21,7 +21,8 @@ const MediaViewerComponent = ({
21
21
  innerRef,
22
22
  onClose,
23
23
  selectedItem,
24
- intl
24
+ intl,
25
+ viewerOptions
25
26
  }) => {
26
27
  const [isSidebarVisible, setIsSidebarVisible] = useState(false);
27
28
  const [selectedIdentifier, setSelectedIdentifier] = useState();
@@ -76,7 +77,8 @@ const MediaViewerComponent = ({
76
77
  onSidebarButtonClick: () => setIsSidebarVisible(!isSidebarVisible),
77
78
  isSidebarVisible: isSidebarVisible,
78
79
  contextId: contextId,
79
- featureFlags: featureFlags
80
+ featureFlags: featureFlags,
81
+ viewerOptions: viewerOptions
80
82
  })), renderSidebar()));
81
83
  return intl ? content : /*#__PURE__*/React.createElement(IntlProvider, {
82
84
  locale: "en"
@@ -0,0 +1 @@
1
+ export {};
@@ -5,6 +5,7 @@ import { unzip, HTTPRangeReader } from 'unzipit';
5
5
  import { FormattedMessage } from 'react-intl-next';
6
6
  import { CustomMediaPlayer, messages } from '@atlaskit/media-ui';
7
7
  import { getLanguageType, isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
8
+ import { Text } from '@atlaskit/primitives';
8
9
  import { Outcome } from '../../domain';
9
10
  import { CustomVideoPlayerWrapper, AudioPlayer, CustomAudioPlayerWrapper, DefaultCoverWrapper, ListWrapper } from '../../styleWrappers';
10
11
  import AudioIcon from '@atlaskit/icon/core/migration/audio--media-services-audio';
@@ -48,7 +49,8 @@ export class ArchiveViewerBase extends BaseViewer {
48
49
  this.setState({
49
50
  content: Outcome.successful({
50
51
  ...this.state.content.data,
51
- selectedArchiveEntry: undefined
52
+ selectedArchiveEntry: undefined,
53
+ hasLoadedEntries: false // displays a nice loading spinner for the content viewer
52
54
  })
53
55
  });
54
56
  let src = '';
@@ -56,7 +58,7 @@ export class ArchiveViewerBase extends BaseViewer {
56
58
  const isCodeMimeType = isCodeViewerItem(selectedArchiveEntry.name, getMimeTypeFromFilename(selectedArchiveEntry.name));
57
59
  if (!selectedArchiveEntry.isDirectory) {
58
60
  try {
59
- const blob = await rejectAfter(() => selectedArchiveEntry.blob());
61
+ const blob = await rejectAfter(() => selectedArchiveEntry.blob(), 10000);
60
62
  src = URL.createObjectURL(blob);
61
63
  if (isCodeMimeType) {
62
64
  codeViewerSrc = await rejectAfter(() => blob.text());
@@ -74,7 +76,8 @@ export class ArchiveViewerBase extends BaseViewer {
74
76
  isDirectory: selectedArchiveEntry.isDirectory,
75
77
  error: undefined,
76
78
  codeViewerSrc,
77
- isCodeMimeType
79
+ isCodeMimeType,
80
+ hasLoadedEntries: true
78
81
  })
79
82
  });
80
83
  });
@@ -145,7 +148,8 @@ export class ArchiveViewerBase extends BaseViewer {
145
148
  }
146
149
  renderArchiveItemViewer(content) {
147
150
  const {
148
- item
151
+ item,
152
+ viewerOptions
149
153
  } = this.props;
150
154
  const {
151
155
  src,
@@ -160,9 +164,27 @@ export class ArchiveViewerBase extends BaseViewer {
160
164
  return this.renderPreviewError(error, selectedArchiveEntry);
161
165
  }
162
166
  if (!isDirectory && selectedArchiveEntry) {
167
+ var _viewerOptions$custom;
163
168
  if (!name || !src) {
164
169
  return this.renderPreviewError(new ArchiveViewerError('archiveviewer-missing-name-src'), selectedArchiveEntry);
165
170
  }
171
+ const customRenderer = viewerOptions === null || viewerOptions === void 0 ? void 0 : (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(renderer => renderer.shouldUseCustomRenderer({
172
+ fileItem: item,
173
+ archiveFileItem: {
174
+ name
175
+ }
176
+ }));
177
+ if (customRenderer) {
178
+ return /*#__PURE__*/React.createElement(ArchiveItemViewerWrapper, null, customRenderer.renderContent({
179
+ fileItem: item,
180
+ archiveFileItem: {
181
+ name
182
+ },
183
+ getBinaryContent: async () => (await fetch(src)).blob(),
184
+ onLoad: this.onViewerLoad(selectedArchiveEntry),
185
+ onError: this.onViewerError('archiveviewer-customrenderer-onerror', selectedArchiveEntry)
186
+ }));
187
+ }
166
188
  const mediaType = getMediaTypeFromFilename(name);
167
189
  if (isCodeMimeType) {
168
190
  // Same code viewer logic as in Item-Viewer.tsx
@@ -242,7 +264,7 @@ export class ArchiveViewerBase extends BaseViewer {
242
264
  fileState: item,
243
265
  error: error,
244
266
  supressAnalytics: true
245
- }, /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file))));
267
+ }, /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file))));
246
268
  }
247
269
  }
248
270
  export const ArchiveViewer = withAnalyticsEvents()(ArchiveViewerBase);
@@ -0,0 +1,37 @@
1
+ import { MediaViewerError } from '../../errors';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import React from 'react';
4
+ import { Spinner } from '../../loading';
5
+ export const CustomViewer = ({
6
+ mediaClient,
7
+ item,
8
+ customRendererConfig,
9
+ onSuccess,
10
+ onError
11
+ }) => {
12
+ const [getBinaryContent, setGetBinaryContent] = useState();
13
+ useEffect(() => {
14
+ setGetBinaryContent(undefined);
15
+ const abortController = new AbortController();
16
+ // This sets the 'getBinaryContent' to an async function that fetches the binary content of the file
17
+ // The 'getBinaryContent' function has to be updated when the item changes
18
+ // This approach handles aborting in-progress request outside of the custom-renderer concern
19
+ if (item.status === 'processed' || item.status === 'failed-processing') {
20
+ setGetBinaryContent(() => () => mediaClient.mediaStore.getFileBinary(item.id, undefined, abortController));
21
+ }
22
+ return () => abortController.abort();
23
+ }, [item, mediaClient]);
24
+ const onLoadFailed = useCallback(error => {
25
+ const mediaError = new MediaViewerError('custom-viewer-error', error);
26
+ onError(mediaError, item);
27
+ }, [item, onError]);
28
+ if (!getBinaryContent) {
29
+ return /*#__PURE__*/React.createElement(Spinner, null);
30
+ }
31
+ return /*#__PURE__*/React.createElement(React.Fragment, null, customRendererConfig.renderContent({
32
+ fileItem: item,
33
+ getBinaryContent,
34
+ onLoad: onSuccess,
35
+ onError: onLoadFailed
36
+ }));
37
+ };
@@ -1,7 +1,7 @@
1
1
  import { ANALYTICS_MEDIA_CHANNEL, sanitiseAnalyticsPayload } from '@atlaskit/media-common/analytics';
2
2
  var componentName = 'mediaViewer';
3
3
  var packageName = "@atlaskit/media-viewer";
4
- var packageVersion = "49.2.7";
4
+ var packageVersion = "49.3.0";
5
5
  export { packageName, packageVersion, componentName, componentName as component };
6
6
  export function getFileAttributes(fileState) {
7
7
  if (!fileState) {
@@ -5,7 +5,7 @@ import { UFOExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atl
5
5
  import { getMediaEnvironment, getMediaRegion } from '@atlaskit/media-client';
6
6
  import { getFeatureFlagKeysAllProducts } from '@atlaskit/media-common';
7
7
  var packageName = "@atlaskit/media-viewer";
8
- var packageVersion = "49.2.7";
8
+ var packageVersion = "49.3.0";
9
9
  var ufoExperience;
10
10
  var getExperience = function getExperience() {
11
11
  if (!ufoExperience) {
@@ -37,7 +37,8 @@ export var MediaViewerBase = function MediaViewerBase(_ref) {
37
37
  collectionName = _ref.collectionName,
38
38
  items = _ref.items,
39
39
  extensions = _ref.extensions,
40
- contextId = _ref.contextId;
40
+ contextId = _ref.contextId,
41
+ viewerOptions = _ref.viewerOptions;
41
42
  var _useMemo = useMemo(function () {
42
43
  return normaliseItems(items, selectedItem, collectionName);
43
44
  }, [items, selectedItem, collectionName]),
@@ -70,7 +71,8 @@ export var MediaViewerBase = function MediaViewerBase(_ref) {
70
71
  items: normalisedItems,
71
72
  featureFlags: featureFlags,
72
73
  extensions: extensions,
73
- contextId: contextId
74
+ contextId: contextId,
75
+ viewerOptions: viewerOptions
74
76
  });
75
77
  };
76
78