@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
@@ -3,6 +3,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import React, { useCallback, useEffect, useState, useRef } from 'react';
4
4
  import Loadable from 'react-loadable';
5
5
  import { isExternalImageIdentifier, isFileIdentifier } from '@atlaskit/media-client';
6
+ import { Text } from '@atlaskit/primitives';
6
7
  import { FormattedMessage } from 'react-intl-next';
7
8
  import { messages } from '@atlaskit/media-ui';
8
9
  import { isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
@@ -20,6 +21,7 @@ import { InteractiveImg } from './viewers/image/interactive-img';
20
21
  import ArchiveViewerLoader from './viewers/archiveSidebar/archiveViewerLoader';
21
22
  import { getRandomHex } from '@atlaskit/media-common';
22
23
  import { startMediaFileUfoExperience, succeedMediaFileUfoExperience } from './analytics/ufoExperiences';
24
+ import { CustomViewer } from './viewers/customViewer/customViewer';
23
25
  var ImageViewer = Loadable({
24
26
  loader: function loader() {
25
27
  return import( /* webpackChunkName: "@atlaskit-internal_imageViewer" */'./viewers/image').then(function (mod) {
@@ -97,7 +99,8 @@ export var ItemViewerBase = function ItemViewerBase(_ref) {
97
99
  onClose = _ref.onClose,
98
100
  previewCount = _ref.previewCount,
99
101
  contextId = _ref.contextId,
100
- createAnalyticsEvent = _ref.createAnalyticsEvent;
102
+ createAnalyticsEvent = _ref.createAnalyticsEvent,
103
+ viewerOptions = _ref.viewerOptions;
101
104
  // States and Refs
102
105
  var _useState = useState(Outcome.pending()),
103
106
  _useState2 = _slicedToArray(_useState, 2),
@@ -182,14 +185,28 @@ export var ItemViewerBase = function ItemViewerBase(_ref) {
182
185
  setItem(Outcome.failed(mediaViewerError, fileState));
183
186
  }, [fileState]);
184
187
  var renderItem = function renderItem(fileItem) {
188
+ var _viewerOptions$custom;
185
189
  var collectionName = isFileIdentifier(identifier) ? identifier.collectionName : undefined;
186
190
  var viewerProps = {
187
191
  mediaClient: mediaClient,
188
192
  item: fileItem,
189
193
  collectionName: collectionName,
190
194
  onClose: onClose,
191
- previewCount: previewCount
195
+ previewCount: previewCount,
196
+ viewerOptions: viewerOptions
192
197
  };
198
+ var customRenderer = viewerOptions === null || viewerOptions === void 0 || (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(function (renderer) {
199
+ return renderer.shouldUseCustomRenderer({
200
+ fileItem: fileItem
201
+ });
202
+ });
203
+ if (customRenderer) {
204
+ return /*#__PURE__*/React.createElement(CustomViewer, _extends({
205
+ customRendererConfig: customRenderer,
206
+ onError: onLoadFail,
207
+ onSuccess: onSuccess
208
+ }, viewerProps));
209
+ }
193
210
 
194
211
  // TODO: fix all of the item errors
195
212
 
@@ -266,7 +283,7 @@ export var ItemViewerBase = function ItemViewerBase(_ref) {
266
283
  fileState: _fileState,
267
284
  fileStateFlags: fileStateFlagsRef.current,
268
285
  traceContext: traceContext.current
269
- }, /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file)), renderDownloadButton(_fileState, error));
286
+ }, /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file)), renderDownloadButton(_fileState, error));
270
287
  } else {
271
288
  return /*#__PURE__*/React.createElement(ErrorMessage, {
272
289
  fileId: isFileIdentifier(identifier) ? identifier.id : 'undefined',
package/dist/esm/list.js CHANGED
@@ -15,7 +15,8 @@ export var List = function List(_ref) {
15
15
  featureFlags = _ref.featureFlags,
16
16
  isSidebarVisible = _ref.isSidebarVisible,
17
17
  onNavigationChange = _ref.onNavigationChange,
18
- items = _ref.items;
18
+ items = _ref.items,
19
+ viewerOptions = _ref.viewerOptions;
19
20
  var _useState = useState(defaultSelectedItem),
20
21
  _useState2 = _slicedToArray(_useState, 2),
21
22
  selectedItem = _useState2[0],
@@ -48,7 +49,8 @@ export var List = function List(_ref) {
48
49
  onClose: onClose,
49
50
  previewCount: previewCount,
50
51
  contextId: contextId,
51
- featureFlags: featureFlags
52
+ featureFlags: featureFlags,
53
+ viewerOptions: viewerOptions
52
54
  }), /*#__PURE__*/React.createElement(Navigation, {
53
55
  items: items,
54
56
  selectedItem: selectedItem,
@@ -22,7 +22,8 @@ var MediaViewerComponent = function MediaViewerComponent(_ref) {
22
22
  innerRef = _ref.innerRef,
23
23
  _onClose = _ref.onClose,
24
24
  selectedItem = _ref.selectedItem,
25
- intl = _ref.intl;
25
+ intl = _ref.intl,
26
+ viewerOptions = _ref.viewerOptions;
26
27
  var _useState = useState(false),
27
28
  _useState2 = _slicedToArray(_useState, 2),
28
29
  isSidebarVisible = _useState2[0],
@@ -85,7 +86,8 @@ var MediaViewerComponent = function MediaViewerComponent(_ref) {
85
86
  },
86
87
  isSidebarVisible: isSidebarVisible,
87
88
  contextId: contextId,
88
- featureFlags: featureFlags
89
+ featureFlags: featureFlags,
90
+ viewerOptions: viewerOptions
89
91
  })), renderSidebar()));
90
92
  return intl ? content : /*#__PURE__*/React.createElement(IntlProvider, {
91
93
  locale: "en"
@@ -0,0 +1 @@
1
+ export {};
@@ -17,6 +17,7 @@ import { unzip, HTTPRangeReader } from 'unzipit';
17
17
  import { FormattedMessage } from 'react-intl-next';
18
18
  import { CustomMediaPlayer, messages } from '@atlaskit/media-ui';
19
19
  import { getLanguageType, isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
20
+ import { Text } from '@atlaskit/primitives';
20
21
  import { Outcome } from '../../domain';
21
22
  import { CustomVideoPlayerWrapper, AudioPlayer, CustomAudioPlayerWrapper, DefaultCoverWrapper, ListWrapper } from '../../styleWrappers';
22
23
  import AudioIcon from '@atlaskit/icon/core/migration/audio--media-services-audio';
@@ -92,7 +93,8 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
92
93
  case 0:
93
94
  _this.setState({
94
95
  content: Outcome.successful(_objectSpread(_objectSpread({}, _this.state.content.data), {}, {
95
- selectedArchiveEntry: undefined
96
+ selectedArchiveEntry: undefined,
97
+ hasLoadedEntries: false // displays a nice loading spinner for the content viewer
96
98
  }))
97
99
  });
98
100
  src = '';
@@ -106,7 +108,7 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
106
108
  _context2.next = 8;
107
109
  return rejectAfter(function () {
108
110
  return selectedArchiveEntry.blob();
109
- });
111
+ }, 10000);
110
112
  case 8:
111
113
  blob = _context2.sent;
112
114
  src = URL.createObjectURL(blob);
@@ -136,7 +138,8 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
136
138
  isDirectory: selectedArchiveEntry.isDirectory,
137
139
  error: undefined,
138
140
  codeViewerSrc: codeViewerSrc,
139
- isCodeMimeType: isCodeMimeType
141
+ isCodeMimeType: isCodeMimeType,
142
+ hasLoadedEntries: true
140
143
  }))
141
144
  });
142
145
  case 20:
@@ -238,7 +241,9 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
238
241
  }, {
239
242
  key: "renderArchiveItemViewer",
240
243
  value: function renderArchiveItemViewer(content) {
241
- var item = this.props.item;
244
+ var _this$props2 = this.props,
245
+ item = _this$props2.item,
246
+ viewerOptions = _this$props2.viewerOptions;
242
247
  var src = content.src,
243
248
  name = content.name,
244
249
  isDirectory = content.isDirectory,
@@ -250,9 +255,48 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
250
255
  return this.renderPreviewError(error, selectedArchiveEntry);
251
256
  }
252
257
  if (!isDirectory && selectedArchiveEntry) {
258
+ var _viewerOptions$custom;
253
259
  if (!name || !src) {
254
260
  return this.renderPreviewError(new ArchiveViewerError('archiveviewer-missing-name-src'), selectedArchiveEntry);
255
261
  }
262
+ var customRenderer = viewerOptions === null || viewerOptions === void 0 || (_viewerOptions$custom = viewerOptions.customRenderers) === null || _viewerOptions$custom === void 0 ? void 0 : _viewerOptions$custom.find(function (renderer) {
263
+ return renderer.shouldUseCustomRenderer({
264
+ fileItem: item,
265
+ archiveFileItem: {
266
+ name: name
267
+ }
268
+ });
269
+ });
270
+ if (customRenderer) {
271
+ return /*#__PURE__*/React.createElement(ArchiveItemViewerWrapper, null, customRenderer.renderContent({
272
+ fileItem: item,
273
+ archiveFileItem: {
274
+ name: name
275
+ },
276
+ getBinaryContent: function () {
277
+ var _getBinaryContent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
278
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
279
+ while (1) switch (_context4.prev = _context4.next) {
280
+ case 0:
281
+ _context4.next = 2;
282
+ return fetch(src);
283
+ case 2:
284
+ return _context4.abrupt("return", _context4.sent.blob());
285
+ case 3:
286
+ case "end":
287
+ return _context4.stop();
288
+ }
289
+ }, _callee4);
290
+ }));
291
+ function getBinaryContent() {
292
+ return _getBinaryContent.apply(this, arguments);
293
+ }
294
+ return getBinaryContent;
295
+ }(),
296
+ onLoad: this.onViewerLoad(selectedArchiveEntry),
297
+ onError: this.onViewerError('archiveviewer-customrenderer-onerror', selectedArchiveEntry)
298
+ }));
299
+ }
256
300
  var mediaType = getMediaTypeFromFilename(name);
257
301
  if (isCodeMimeType) {
258
302
  // Same code viewer logic as in Item-Viewer.tsx
@@ -324,16 +368,16 @@ export var ArchiveViewerBase = /*#__PURE__*/function (_BaseViewer) {
324
368
  }, {
325
369
  key: "renderPreviewError",
326
370
  value: function renderPreviewError(error, entry) {
327
- var _this$props2 = this.props,
328
- item = _this$props2.item,
329
- createAnalyticsEvent = _this$props2.createAnalyticsEvent;
371
+ var _this$props3 = this.props,
372
+ item = _this$props3.item,
373
+ createAnalyticsEvent = _this$props3.createAnalyticsEvent;
330
374
  fireAnalytics(createZipEntryLoadFailedEvent(item, error, entry), createAnalyticsEvent);
331
375
  return /*#__PURE__*/React.createElement(ListWrapper, null, /*#__PURE__*/React.createElement(ErrorMessage, {
332
376
  fileId: item.id,
333
377
  fileState: item,
334
378
  error: error,
335
379
  supressAnalytics: true
336
- }, /*#__PURE__*/React.createElement("p", null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file))));
380
+ }, /*#__PURE__*/React.createElement(Text, null, /*#__PURE__*/React.createElement(FormattedMessage, messages.try_downloading_file))));
337
381
  }
338
382
  }]);
339
383
  return ArchiveViewerBase;
@@ -0,0 +1,46 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { MediaViewerError } from '../../errors';
3
+ import { useCallback, useEffect, useState } from 'react';
4
+ import React from 'react';
5
+ import { Spinner } from '../../loading';
6
+ export var CustomViewer = function CustomViewer(_ref) {
7
+ var mediaClient = _ref.mediaClient,
8
+ item = _ref.item,
9
+ customRendererConfig = _ref.customRendererConfig,
10
+ onSuccess = _ref.onSuccess,
11
+ onError = _ref.onError;
12
+ var _useState = useState(),
13
+ _useState2 = _slicedToArray(_useState, 2),
14
+ getBinaryContent = _useState2[0],
15
+ setGetBinaryContent = _useState2[1];
16
+ useEffect(function () {
17
+ setGetBinaryContent(undefined);
18
+ var abortController = new AbortController();
19
+ // This sets the 'getBinaryContent' to an async function that fetches the binary content of the file
20
+ // The 'getBinaryContent' function has to be updated when the item changes
21
+ // This approach handles aborting in-progress request outside of the custom-renderer concern
22
+ if (item.status === 'processed' || item.status === 'failed-processing') {
23
+ setGetBinaryContent(function () {
24
+ return function () {
25
+ return mediaClient.mediaStore.getFileBinary(item.id, undefined, abortController);
26
+ };
27
+ });
28
+ }
29
+ return function () {
30
+ return abortController.abort();
31
+ };
32
+ }, [item, mediaClient]);
33
+ var onLoadFailed = useCallback(function (error) {
34
+ var mediaError = new MediaViewerError('custom-viewer-error', error);
35
+ onError(mediaError, item);
36
+ }, [item, onError]);
37
+ if (!getBinaryContent) {
38
+ return /*#__PURE__*/React.createElement(Spinner, null);
39
+ }
40
+ return /*#__PURE__*/React.createElement(React.Fragment, null, customRendererConfig.renderContent({
41
+ fileItem: item,
42
+ getBinaryContent: getBinaryContent,
43
+ onLoad: onSuccess,
44
+ onError: onLoadFailed
45
+ }));
46
+ };
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { type MediaViewerProps } from './types';
3
3
  import type { MediaViewerWithMediaClientConfigProps } from './types';
4
- export declare const MediaViewerBase: ({ featureFlags, onClose, selectedItem, collectionName, items, extensions, contextId, }: MediaViewerProps) => JSX.Element;
4
+ export declare const MediaViewerBase: ({ featureFlags, onClose, selectedItem, collectionName, items, extensions, contextId, viewerOptions, }: MediaViewerProps) => JSX.Element;
5
5
  export declare const MediaViewerWithMediaClient: (props: MediaViewerWithMediaClientConfigProps) => JSX.Element;
@@ -2,6 +2,7 @@ import { type Identifier, type MediaClient } from '@atlaskit/media-client';
2
2
  import type { WithMediaClientConfigProps } from '@atlaskit/media-client-react';
3
3
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
4
4
  import { type ReactNode } from 'react';
5
+ import { type ViewerOptionsProps } from '../viewerOptions';
5
6
  export type FileStateFlags = {
6
7
  wasStatusProcessing: boolean;
7
8
  wasStatusUploading: boolean;
@@ -24,6 +25,7 @@ export interface MediaViewerProps {
24
25
  readonly featureFlags?: MediaFeatureFlags;
25
26
  readonly extensions?: MediaViewerExtensions;
26
27
  readonly contextId?: string;
28
+ readonly viewerOptions?: ViewerOptionsProps;
27
29
  }
28
30
  export type MediaMessage = {
29
31
  source: 'media';
@@ -13,8 +13,8 @@ export declare class ArchiveViewerError extends MediaViewerError {
13
13
  constructor(primaryReason: ArchiveViewerErrorReason, secondaryError?: Error | undefined, zipEntry?: ZipEntry | undefined);
14
14
  }
15
15
  export declare function isArchiveViewerError(err: Error): err is ArchiveViewerError;
16
- export type MediaViewerErrorReason = 'collection-fetch-metadata' | 'header-fetch-metadata' | 'itemviewer-onerror' | 'itemviewer-fetch-metadata' | 'itemviewer-file-error-status' | 'itemviewer-file-failed-processing-status' | 'imageviewer-external-onerror' | 'imageviewer-fetch-url' | 'imageviewer-src-onerror' | 'audioviewer-fetch-url' | 'audioviewer-missing-artefact' | 'audioviewer-playback' | 'videoviewer-fetch-url' | 'videoviewer-missing-artefact' | 'videoviewer-playback' | 'docviewer-fetch-url' | 'docviewer-fetch-pdf' | 'codeviewer-fetch-src' | 'codeviewer-load-src' | 'codeviewer-file-size-exceeds' | 'codeviewer-parse-email' | 'svg-img-error' | 'svg-binary-fetch' | 'svg-unknown-error' | 'unsupported';
17
- export type ArchiveViewerErrorReason = 'archiveviewer-bundle-loader' | 'archiveviewer-read-binary' | 'archiveviewer-create-url' | 'archiveviewer-imageviewer-onerror' | 'archiveviewer-videoviewer-onerror' | 'archiveviewer-audioviewer-onerror' | 'archiveviewer-docviewer-onerror' | 'archiveviewer-codeviewer-onerror' | 'archiveviewer-codeviewer-file-size-exceeds' | 'archiveviewer-missing-name-src' | 'archiveviewer-unsupported' | 'archiveviewer-encrypted-entry';
16
+ export type MediaViewerErrorReason = 'collection-fetch-metadata' | 'header-fetch-metadata' | 'itemviewer-onerror' | 'itemviewer-fetch-metadata' | 'itemviewer-file-error-status' | 'itemviewer-file-failed-processing-status' | 'imageviewer-external-onerror' | 'imageviewer-fetch-url' | 'imageviewer-src-onerror' | 'audioviewer-fetch-url' | 'audioviewer-missing-artefact' | 'audioviewer-playback' | 'videoviewer-fetch-url' | 'videoviewer-missing-artefact' | 'videoviewer-playback' | 'docviewer-fetch-url' | 'docviewer-fetch-pdf' | 'codeviewer-fetch-src' | 'codeviewer-load-src' | 'codeviewer-file-size-exceeds' | 'codeviewer-parse-email' | 'svg-img-error' | 'svg-binary-fetch' | 'svg-unknown-error' | 'unsupported' | 'custom-viewer-error';
17
+ export type ArchiveViewerErrorReason = 'archiveviewer-bundle-loader' | 'archiveviewer-read-binary' | 'archiveviewer-create-url' | 'archiveviewer-imageviewer-onerror' | 'archiveviewer-videoviewer-onerror' | 'archiveviewer-audioviewer-onerror' | 'archiveviewer-docviewer-onerror' | 'archiveviewer-codeviewer-onerror' | 'archiveviewer-codeviewer-file-size-exceeds' | 'archiveviewer-missing-name-src' | 'archiveviewer-unsupported' | 'archiveviewer-encrypted-entry' | 'archiveviewer-customrenderer-onerror';
18
18
  export type PrimaryErrorReason = MediaViewerErrorReason | ArchiveViewerErrorReason;
19
19
  export type SecondaryErrorReason = MediaClientErrorReason | 'unknown' | 'nativeError' | undefined;
20
20
  export declare function getPrimaryErrorReason(error: MediaViewerError): PrimaryErrorReason;
@@ -1,2 +1,3 @@
1
1
  export { default as MediaViewer } from './components/media-viewer-loader';
2
2
  export type { MediaViewerExtensions, MediaViewerExtensionsActions, MediaViewerProps, MediaMessage, } from './components/types';
3
+ export type { ViewerOptionsProps, CustomRendererConfig, CustomRendererStateProps, CustomRendererProps, ArchiveFileItem, } from './viewerOptions';
@@ -5,23 +5,26 @@ import { Outcome } from './domain';
5
5
  import { MediaViewerError } from './errors';
6
6
  import { type WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
7
7
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
8
+ import { type ViewerOptionsProps } from './viewerOptions';
8
9
  export type Props = Readonly<{
9
10
  identifier: Identifier;
10
11
  onClose?: () => void;
11
12
  previewCount: number;
12
13
  contextId?: string;
13
14
  featureFlags?: MediaFeatureFlags;
15
+ viewerOptions?: ViewerOptionsProps;
14
16
  }> & WithAnalyticsEventsProps & WithShowControlMethodProp;
15
17
  export type FileItem = FileState | 'external-image';
16
18
  export type State = Outcome<FileItem, MediaViewerError>;
17
19
  export declare const isExternalImageItem: (fileItem: FileItem) => fileItem is "external-image";
18
20
  export declare const isFileStateItem: (fileItem: FileItem) => fileItem is FileState;
19
21
  export declare const MAX_FILE_SIZE_SUPPORTED_BY_CODEVIEWER: number;
20
- export declare const ItemViewerBase: ({ identifier, showControls, onClose, previewCount, contextId, createAnalyticsEvent, }: Props) => React.ReactElement | null;
22
+ export declare const ItemViewerBase: ({ identifier, showControls, onClose, previewCount, contextId, createAnalyticsEvent, viewerOptions, }: Props) => React.ReactElement | null;
21
23
  export declare const ItemViewer: React.ForwardRefExoticComponent<Omit<Readonly<{
22
24
  identifier: Identifier;
23
25
  onClose?: (() => void) | undefined;
24
26
  previewCount: number;
25
27
  contextId?: string | undefined;
26
28
  featureFlags?: MediaFeatureFlags | undefined;
29
+ viewerOptions?: ViewerOptionsProps | undefined;
27
30
  }> & WithShowControlMethodProp, keyof WithAnalyticsEventsProps> & React.RefAttributes<any>>;
@@ -3,6 +3,7 @@ import { type Identifier } from '@atlaskit/media-client';
3
3
  import { type WithShowControlMethodProp } from '@atlaskit/media-ui';
4
4
  import { type MediaViewerExtensions } from './components/types';
5
5
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
6
+ import { type ViewerOptionsProps } from './viewerOptions';
6
7
  export type Props = Readonly<{
7
8
  onClose?: () => void;
8
9
  onNavigationChange?: (selectedItem: Identifier) => void;
@@ -13,10 +14,11 @@ export type Props = Readonly<{
13
14
  isSidebarVisible?: boolean;
14
15
  contextId?: string;
15
16
  featureFlags?: MediaFeatureFlags;
17
+ viewerOptions?: ViewerOptionsProps;
16
18
  } & WithShowControlMethodProp>;
17
19
  export type State = {
18
20
  selectedItem: Identifier;
19
21
  previewCount: number;
20
22
  isArchiveSideBarVisible: boolean;
21
23
  };
22
- export declare const List: ({ defaultSelectedItem, onClose, showControls, extensions, onSidebarButtonClick, contextId, featureFlags, isSidebarVisible, onNavigationChange, items, }: Props) => JSX.Element;
24
+ export declare const List: ({ defaultSelectedItem, onClose, showControls, extensions, onSidebarButtonClick, contextId, featureFlags, isSidebarVisible, onNavigationChange, items, viewerOptions, }: Props) => JSX.Element;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { type Identifier } from '@atlaskit/media-client';
3
3
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
4
4
  import { type MediaViewerExtensions } from './components/types';
5
+ import { type ViewerOptionsProps } from './viewerOptions';
5
6
  export type Props = {
6
7
  onClose?: () => void;
7
8
  selectedItem?: Identifier;
@@ -10,5 +11,6 @@ export type Props = {
10
11
  extensions?: MediaViewerExtensions;
11
12
  contextId?: string;
12
13
  innerRef?: React.Ref<HTMLDivElement>;
14
+ viewerOptions?: ViewerOptionsProps;
13
15
  };
14
16
  export declare const MediaViewer: React.ComponentType<Props>;
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { type NonErrorFileState } from '@atlaskit/media-client';
3
+ export interface ViewerOptionsProps {
4
+ customRenderers?: CustomRendererConfig[];
5
+ }
6
+ export interface CustomRendererConfig {
7
+ shouldUseCustomRenderer: (props: CustomRendererStateProps) => boolean;
8
+ renderContent: (props: CustomRendererProps) => React.ReactNode;
9
+ }
10
+ export interface CustomRendererStateProps {
11
+ fileItem: NonErrorFileState;
12
+ archiveFileItem?: ArchiveFileItem;
13
+ }
14
+ export interface CustomRendererProps extends CustomRendererStateProps {
15
+ getBinaryContent: () => Promise<Blob>;
16
+ onLoad: () => void;
17
+ onError: (error: Error) => void;
18
+ }
19
+ export interface ArchiveFileItem {
20
+ name: string;
21
+ }
@@ -1,9 +1,11 @@
1
1
  import { type MediaClient, type FileState, type ErrorFileState } from '@atlaskit/media-client';
2
2
  import { type ArchiveViewerError } from '../../errors';
3
+ import { type ViewerOptionsProps } from '../../viewerOptions';
3
4
  export type ArchiveViewerProps = {
4
5
  item: Exclude<FileState, ErrorFileState>;
5
6
  mediaClient: MediaClient;
6
7
  collectionName?: string;
7
8
  onError: (error: ArchiveViewerError) => void;
8
9
  onSuccess: () => void;
10
+ viewerOptions?: ViewerOptionsProps;
9
11
  };
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { FileState, MediaClient, NonErrorFileState } from '@atlaskit/media-client';
3
+ import { MediaViewerError } from '../../errors';
4
+ import type { CustomRendererConfig } from '../../viewerOptions';
5
+ export type Props = {
6
+ mediaClient: MediaClient;
7
+ item: NonErrorFileState;
8
+ customRendererConfig: CustomRendererConfig;
9
+ onError: (error: MediaViewerError, fileItem?: FileState) => void;
10
+ onSuccess: () => void;
11
+ };
12
+ export declare const CustomViewer: ({ mediaClient, item, customRendererConfig, onSuccess, onError, }: Props) => JSX.Element;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { type MediaViewerProps } from './types';
3
3
  import type { MediaViewerWithMediaClientConfigProps } from './types';
4
- export declare const MediaViewerBase: ({ featureFlags, onClose, selectedItem, collectionName, items, extensions, contextId, }: MediaViewerProps) => JSX.Element;
4
+ export declare const MediaViewerBase: ({ featureFlags, onClose, selectedItem, collectionName, items, extensions, contextId, viewerOptions, }: MediaViewerProps) => JSX.Element;
5
5
  export declare const MediaViewerWithMediaClient: (props: MediaViewerWithMediaClientConfigProps) => JSX.Element;
@@ -2,6 +2,7 @@ import { type Identifier, type MediaClient } from '@atlaskit/media-client';
2
2
  import type { WithMediaClientConfigProps } from '@atlaskit/media-client-react';
3
3
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
4
4
  import { type ReactNode } from 'react';
5
+ import { type ViewerOptionsProps } from '../viewerOptions';
5
6
  export type FileStateFlags = {
6
7
  wasStatusProcessing: boolean;
7
8
  wasStatusUploading: boolean;
@@ -24,6 +25,7 @@ export interface MediaViewerProps {
24
25
  readonly featureFlags?: MediaFeatureFlags;
25
26
  readonly extensions?: MediaViewerExtensions;
26
27
  readonly contextId?: string;
28
+ readonly viewerOptions?: ViewerOptionsProps;
27
29
  }
28
30
  export type MediaMessage = {
29
31
  source: 'media';
@@ -13,8 +13,8 @@ export declare class ArchiveViewerError extends MediaViewerError {
13
13
  constructor(primaryReason: ArchiveViewerErrorReason, secondaryError?: Error | undefined, zipEntry?: ZipEntry | undefined);
14
14
  }
15
15
  export declare function isArchiveViewerError(err: Error): err is ArchiveViewerError;
16
- export type MediaViewerErrorReason = 'collection-fetch-metadata' | 'header-fetch-metadata' | 'itemviewer-onerror' | 'itemviewer-fetch-metadata' | 'itemviewer-file-error-status' | 'itemviewer-file-failed-processing-status' | 'imageviewer-external-onerror' | 'imageviewer-fetch-url' | 'imageviewer-src-onerror' | 'audioviewer-fetch-url' | 'audioviewer-missing-artefact' | 'audioviewer-playback' | 'videoviewer-fetch-url' | 'videoviewer-missing-artefact' | 'videoviewer-playback' | 'docviewer-fetch-url' | 'docviewer-fetch-pdf' | 'codeviewer-fetch-src' | 'codeviewer-load-src' | 'codeviewer-file-size-exceeds' | 'codeviewer-parse-email' | 'svg-img-error' | 'svg-binary-fetch' | 'svg-unknown-error' | 'unsupported';
17
- export type ArchiveViewerErrorReason = 'archiveviewer-bundle-loader' | 'archiveviewer-read-binary' | 'archiveviewer-create-url' | 'archiveviewer-imageviewer-onerror' | 'archiveviewer-videoviewer-onerror' | 'archiveviewer-audioviewer-onerror' | 'archiveviewer-docviewer-onerror' | 'archiveviewer-codeviewer-onerror' | 'archiveviewer-codeviewer-file-size-exceeds' | 'archiveviewer-missing-name-src' | 'archiveviewer-unsupported' | 'archiveviewer-encrypted-entry';
16
+ export type MediaViewerErrorReason = 'collection-fetch-metadata' | 'header-fetch-metadata' | 'itemviewer-onerror' | 'itemviewer-fetch-metadata' | 'itemviewer-file-error-status' | 'itemviewer-file-failed-processing-status' | 'imageviewer-external-onerror' | 'imageviewer-fetch-url' | 'imageviewer-src-onerror' | 'audioviewer-fetch-url' | 'audioviewer-missing-artefact' | 'audioviewer-playback' | 'videoviewer-fetch-url' | 'videoviewer-missing-artefact' | 'videoviewer-playback' | 'docviewer-fetch-url' | 'docviewer-fetch-pdf' | 'codeviewer-fetch-src' | 'codeviewer-load-src' | 'codeviewer-file-size-exceeds' | 'codeviewer-parse-email' | 'svg-img-error' | 'svg-binary-fetch' | 'svg-unknown-error' | 'unsupported' | 'custom-viewer-error';
17
+ export type ArchiveViewerErrorReason = 'archiveviewer-bundle-loader' | 'archiveviewer-read-binary' | 'archiveviewer-create-url' | 'archiveviewer-imageviewer-onerror' | 'archiveviewer-videoviewer-onerror' | 'archiveviewer-audioviewer-onerror' | 'archiveviewer-docviewer-onerror' | 'archiveviewer-codeviewer-onerror' | 'archiveviewer-codeviewer-file-size-exceeds' | 'archiveviewer-missing-name-src' | 'archiveviewer-unsupported' | 'archiveviewer-encrypted-entry' | 'archiveviewer-customrenderer-onerror';
18
18
  export type PrimaryErrorReason = MediaViewerErrorReason | ArchiveViewerErrorReason;
19
19
  export type SecondaryErrorReason = MediaClientErrorReason | 'unknown' | 'nativeError' | undefined;
20
20
  export declare function getPrimaryErrorReason(error: MediaViewerError): PrimaryErrorReason;
@@ -1,2 +1,3 @@
1
1
  export { default as MediaViewer } from './components/media-viewer-loader';
2
2
  export type { MediaViewerExtensions, MediaViewerExtensionsActions, MediaViewerProps, MediaMessage, } from './components/types';
3
+ export type { ViewerOptionsProps, CustomRendererConfig, CustomRendererStateProps, CustomRendererProps, ArchiveFileItem, } from './viewerOptions';
@@ -5,23 +5,26 @@ import { Outcome } from './domain';
5
5
  import { MediaViewerError } from './errors';
6
6
  import { type WithAnalyticsEventsProps } from '@atlaskit/analytics-next';
7
7
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
8
+ import { type ViewerOptionsProps } from './viewerOptions';
8
9
  export type Props = Readonly<{
9
10
  identifier: Identifier;
10
11
  onClose?: () => void;
11
12
  previewCount: number;
12
13
  contextId?: string;
13
14
  featureFlags?: MediaFeatureFlags;
15
+ viewerOptions?: ViewerOptionsProps;
14
16
  }> & WithAnalyticsEventsProps & WithShowControlMethodProp;
15
17
  export type FileItem = FileState | 'external-image';
16
18
  export type State = Outcome<FileItem, MediaViewerError>;
17
19
  export declare const isExternalImageItem: (fileItem: FileItem) => fileItem is "external-image";
18
20
  export declare const isFileStateItem: (fileItem: FileItem) => fileItem is FileState;
19
21
  export declare const MAX_FILE_SIZE_SUPPORTED_BY_CODEVIEWER: number;
20
- export declare const ItemViewerBase: ({ identifier, showControls, onClose, previewCount, contextId, createAnalyticsEvent, }: Props) => React.ReactElement | null;
22
+ export declare const ItemViewerBase: ({ identifier, showControls, onClose, previewCount, contextId, createAnalyticsEvent, viewerOptions, }: Props) => React.ReactElement | null;
21
23
  export declare const ItemViewer: React.ForwardRefExoticComponent<Omit<Readonly<{
22
24
  identifier: Identifier;
23
25
  onClose?: (() => void) | undefined;
24
26
  previewCount: number;
25
27
  contextId?: string | undefined;
26
28
  featureFlags?: MediaFeatureFlags | undefined;
29
+ viewerOptions?: ViewerOptionsProps | undefined;
27
30
  }> & WithShowControlMethodProp, keyof WithAnalyticsEventsProps> & React.RefAttributes<any>>;
@@ -3,6 +3,7 @@ import { type Identifier } from '@atlaskit/media-client';
3
3
  import { type WithShowControlMethodProp } from '@atlaskit/media-ui';
4
4
  import { type MediaViewerExtensions } from './components/types';
5
5
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
6
+ import { type ViewerOptionsProps } from './viewerOptions';
6
7
  export type Props = Readonly<{
7
8
  onClose?: () => void;
8
9
  onNavigationChange?: (selectedItem: Identifier) => void;
@@ -13,10 +14,11 @@ export type Props = Readonly<{
13
14
  isSidebarVisible?: boolean;
14
15
  contextId?: string;
15
16
  featureFlags?: MediaFeatureFlags;
17
+ viewerOptions?: ViewerOptionsProps;
16
18
  } & WithShowControlMethodProp>;
17
19
  export type State = {
18
20
  selectedItem: Identifier;
19
21
  previewCount: number;
20
22
  isArchiveSideBarVisible: boolean;
21
23
  };
22
- export declare const List: ({ defaultSelectedItem, onClose, showControls, extensions, onSidebarButtonClick, contextId, featureFlags, isSidebarVisible, onNavigationChange, items, }: Props) => JSX.Element;
24
+ export declare const List: ({ defaultSelectedItem, onClose, showControls, extensions, onSidebarButtonClick, contextId, featureFlags, isSidebarVisible, onNavigationChange, items, viewerOptions, }: Props) => JSX.Element;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { type Identifier } from '@atlaskit/media-client';
3
3
  import { type MediaFeatureFlags } from '@atlaskit/media-common';
4
4
  import { type MediaViewerExtensions } from './components/types';
5
+ import { type ViewerOptionsProps } from './viewerOptions';
5
6
  export type Props = {
6
7
  onClose?: () => void;
7
8
  selectedItem?: Identifier;
@@ -10,5 +11,6 @@ export type Props = {
10
11
  extensions?: MediaViewerExtensions;
11
12
  contextId?: string;
12
13
  innerRef?: React.Ref<HTMLDivElement>;
14
+ viewerOptions?: ViewerOptionsProps;
13
15
  };
14
16
  export declare const MediaViewer: React.ComponentType<Props>;
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { type NonErrorFileState } from '@atlaskit/media-client';
3
+ export interface ViewerOptionsProps {
4
+ customRenderers?: CustomRendererConfig[];
5
+ }
6
+ export interface CustomRendererConfig {
7
+ shouldUseCustomRenderer: (props: CustomRendererStateProps) => boolean;
8
+ renderContent: (props: CustomRendererProps) => React.ReactNode;
9
+ }
10
+ export interface CustomRendererStateProps {
11
+ fileItem: NonErrorFileState;
12
+ archiveFileItem?: ArchiveFileItem;
13
+ }
14
+ export interface CustomRendererProps extends CustomRendererStateProps {
15
+ getBinaryContent: () => Promise<Blob>;
16
+ onLoad: () => void;
17
+ onError: (error: Error) => void;
18
+ }
19
+ export interface ArchiveFileItem {
20
+ name: string;
21
+ }
@@ -1,9 +1,11 @@
1
1
  import { type MediaClient, type FileState, type ErrorFileState } from '@atlaskit/media-client';
2
2
  import { type ArchiveViewerError } from '../../errors';
3
+ import { type ViewerOptionsProps } from '../../viewerOptions';
3
4
  export type ArchiveViewerProps = {
4
5
  item: Exclude<FileState, ErrorFileState>;
5
6
  mediaClient: MediaClient;
6
7
  collectionName?: string;
7
8
  onError: (error: ArchiveViewerError) => void;
8
9
  onSuccess: () => void;
10
+ viewerOptions?: ViewerOptionsProps;
9
11
  };
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { FileState, MediaClient, NonErrorFileState } from '@atlaskit/media-client';
3
+ import { MediaViewerError } from '../../errors';
4
+ import type { CustomRendererConfig } from '../../viewerOptions';
5
+ export type Props = {
6
+ mediaClient: MediaClient;
7
+ item: NonErrorFileState;
8
+ customRendererConfig: CustomRendererConfig;
9
+ onError: (error: MediaViewerError, fileItem?: FileState) => void;
10
+ onSuccess: () => void;
11
+ };
12
+ export declare const CustomViewer: ({ mediaClient, item, customRendererConfig, onSuccess, onError, }: Props) => JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/media-viewer",
3
- "version": "49.2.7",
3
+ "version": "49.3.0",
4
4
  "description": "MediaViewer is Atlassian's powerful solution for viewing files on the web. It's both powerful and extendable yet easy-to-integrate",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -40,14 +40,14 @@
40
40
  "@atlaskit/form": "^10.5.0",
41
41
  "@atlaskit/icon": "^22.24.0",
42
42
  "@atlaskit/icon-file-type": "^6.7.0",
43
- "@atlaskit/media-client": "^28.0.0",
43
+ "@atlaskit/media-client": "^28.2.0",
44
44
  "@atlaskit/media-client-react": "^2.3.0",
45
45
  "@atlaskit/media-common": "^11.7.0",
46
46
  "@atlaskit/media-svg": "^0.2.0",
47
- "@atlaskit/media-ui": "^26.0.0",
47
+ "@atlaskit/media-ui": "^26.1.0",
48
48
  "@atlaskit/platform-feature-flags": "^0.3.0",
49
- "@atlaskit/primitives": "^13.0.0",
50
- "@atlaskit/side-navigation": "^3.5.0",
49
+ "@atlaskit/primitives": "^13.1.0",
50
+ "@atlaskit/side-navigation": "^3.6.0",
51
51
  "@atlaskit/spinner": "^16.3.0",
52
52
  "@atlaskit/textfield": "^6.5.0",
53
53
  "@atlaskit/theme": "^14.0.0",
@@ -79,7 +79,7 @@
79
79
  "@atlaskit/media-integration-test-helpers": "^3.1.0",
80
80
  "@atlaskit/media-state": "^1.1.0",
81
81
  "@atlaskit/media-test-data": "^2.6.0",
82
- "@atlaskit/media-test-helpers": "^34.5.0",
82
+ "@atlaskit/media-test-helpers": "^34.6.0",
83
83
  "@atlaskit/ssr": "*",
84
84
  "@atlaskit/toggle": "13.4.7",
85
85
  "@atlaskit/visual-regression": "*",