@atlaskit/media-viewer 48.1.7 → 48.2.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 (54) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/cjs/analytics/index.js +2 -3
  3. package/dist/cjs/analytics/ufoExperiences.js +1 -1
  4. package/dist/cjs/components/media-viewer.js +13 -1
  5. package/dist/cjs/errorMessage.js +5 -3
  6. package/dist/cjs/item-viewer.js +5 -4
  7. package/dist/cjs/media-viewer.js +21 -17
  8. package/dist/cjs/navigation.js +5 -4
  9. package/dist/cjs/styleWrappers.js +1 -0
  10. package/dist/cjs/v2/header-v2.js +159 -0
  11. package/dist/cjs/v2/item-viewer-v2.js +322 -0
  12. package/dist/cjs/v2/list-v2.js +71 -0
  13. package/dist/cjs/v2/media-viewer-v2.js +114 -0
  14. package/dist/cjs/viewers/archiveSidebar/archive.js +5 -3
  15. package/dist/cjs/zoomControls.js +6 -4
  16. package/dist/es2019/analytics/index.js +2 -5
  17. package/dist/es2019/analytics/ufoExperiences.js +1 -1
  18. package/dist/es2019/components/media-viewer.js +13 -1
  19. package/dist/es2019/errorMessage.js +5 -3
  20. package/dist/es2019/item-viewer.js +5 -4
  21. package/dist/es2019/media-viewer.js +8 -6
  22. package/dist/es2019/navigation.js +5 -4
  23. package/dist/es2019/styleWrappers.js +1 -0
  24. package/dist/es2019/v2/header-v2.js +138 -0
  25. package/dist/es2019/v2/item-viewer-v2.js +269 -0
  26. package/dist/es2019/v2/list-v2.js +52 -0
  27. package/dist/es2019/v2/media-viewer-v2.js +95 -0
  28. package/dist/es2019/viewers/archiveSidebar/archive.js +4 -3
  29. package/dist/es2019/zoomControls.js +6 -4
  30. package/dist/esm/analytics/index.js +2 -3
  31. package/dist/esm/analytics/ufoExperiences.js +1 -1
  32. package/dist/esm/components/media-viewer.js +13 -1
  33. package/dist/esm/errorMessage.js +5 -3
  34. package/dist/esm/item-viewer.js +5 -4
  35. package/dist/esm/media-viewer.js +21 -17
  36. package/dist/esm/navigation.js +5 -4
  37. package/dist/esm/styleWrappers.js +1 -0
  38. package/dist/esm/v2/header-v2.js +149 -0
  39. package/dist/esm/v2/item-viewer-v2.js +302 -0
  40. package/dist/esm/v2/list-v2.js +61 -0
  41. package/dist/esm/v2/media-viewer-v2.js +104 -0
  42. package/dist/esm/viewers/archiveSidebar/archive.js +5 -3
  43. package/dist/esm/zoomControls.js +6 -4
  44. package/dist/types/analytics/index.d.ts +2 -2
  45. package/dist/types/v2/header-v2.d.ts +18 -0
  46. package/dist/types/v2/item-viewer-v2.d.ts +21 -0
  47. package/dist/types/v2/list-v2.d.ts +22 -0
  48. package/dist/types/v2/media-viewer-v2.d.ts +14 -0
  49. package/dist/types-ts4.5/analytics/index.d.ts +2 -2
  50. package/dist/types-ts4.5/v2/header-v2.d.ts +18 -0
  51. package/dist/types-ts4.5/v2/item-viewer-v2.d.ts +21 -0
  52. package/dist/types-ts4.5/v2/list-v2.d.ts +22 -0
  53. package/dist/types-ts4.5/v2/media-viewer-v2.d.ts +14 -0
  54. package/package.json +11 -4
@@ -0,0 +1,95 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useState, useLayoutEffect, useRef } from 'react';
3
+ import { IntlProvider, injectIntl } from 'react-intl-next';
4
+ import { Shortcut } from '@atlaskit/media-ui';
5
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
6
+ import { fireAnalytics } from '../analytics';
7
+ import { createModalEvent } from '../analytics/events/screen/modal';
8
+ import { createClosedEvent } from '../analytics/events/ui/closed';
9
+ import { ListV2 } from './list-v2';
10
+ import { Content } from '../content';
11
+ import { Blanket, SidebarWrapper } from '../styleWrappers';
12
+ import { start } from 'perf-marks';
13
+ import { mediaViewerPopupClass } from '../classnames';
14
+ import ScrollLock from 'react-scrolllock';
15
+ import FocusLock from 'react-focus-lock';
16
+ const MediaViewerComponent = ({
17
+ featureFlags,
18
+ items,
19
+ extensions,
20
+ contextId,
21
+ innerRef,
22
+ onClose,
23
+ selectedItem,
24
+ intl
25
+ }) => {
26
+ const [isSidebarVisible, setIsSidebarVisible] = useState(false);
27
+ const [selectedIdentifier, setSelectedIdentifier] = useState();
28
+ const {
29
+ createAnalyticsEvent
30
+ } = useAnalyticsEvents();
31
+ const createAnalyticsEventRef = useRef(createAnalyticsEvent);
32
+ createAnalyticsEventRef.current = createAnalyticsEvent;
33
+ useLayoutEffect(() => {
34
+ fireAnalytics(createModalEvent(), createAnalyticsEventRef.current);
35
+ start('MediaViewer.SessionDuration');
36
+ }, []);
37
+ const defaultSelectedItem = selectedItem || items[0];
38
+ const renderSidebar = () => {
39
+ const sidebarSelectedIdentifier = selectedIdentifier || defaultSelectedItem;
40
+ if (sidebarSelectedIdentifier && isSidebarVisible && extensions && extensions.sidebar) {
41
+ return /*#__PURE__*/React.createElement(SidebarWrapper, {
42
+ "data-testid": "media-viewer-sidebar-content"
43
+ }, extensions.sidebar.renderer(sidebarSelectedIdentifier, {
44
+ close: () => setIsSidebarVisible(!isSidebarVisible)
45
+ }));
46
+ }
47
+ };
48
+ const content = /*#__PURE__*/React.createElement("div", {
49
+ ref: innerRef
50
+ }, /*#__PURE__*/React.createElement(Blanket, {
51
+ "data-testid": "media-viewer-popup",
52
+ className: mediaViewerPopupClass
53
+ }, /*#__PURE__*/React.createElement(Shortcut, {
54
+ code: 'Escape',
55
+ handler: () => {
56
+ fireAnalytics(createClosedEvent('escKey'), createAnalyticsEventRef.current);
57
+ onClose && onClose();
58
+ }
59
+ }), /*#__PURE__*/React.createElement(Content, {
60
+ isSidebarVisible: isSidebarVisible,
61
+ onClose: (_e, analyticsEvent) => {
62
+ var _analyticsEvent$paylo;
63
+ if ((analyticsEvent === null || analyticsEvent === void 0 ? void 0 : (_analyticsEvent$paylo = analyticsEvent.payload) === null || _analyticsEvent$paylo === void 0 ? void 0 : _analyticsEvent$paylo.actionSubject) === 'button') {
64
+ fireAnalytics(createClosedEvent('button'), createAnalyticsEventRef.current);
65
+ }
66
+ onClose && onClose();
67
+ }
68
+ }, /*#__PURE__*/React.createElement(ListV2, {
69
+ defaultSelectedItem: defaultSelectedItem || items[0],
70
+ items: items,
71
+ onClose: onClose,
72
+ extensions: extensions,
73
+ onNavigationChange: setSelectedIdentifier,
74
+ onSidebarButtonClick: () => setIsSidebarVisible(!isSidebarVisible),
75
+ isSidebarVisible: isSidebarVisible,
76
+ contextId: contextId,
77
+ featureFlags: featureFlags
78
+ })), renderSidebar()));
79
+ return intl ? content : /*#__PURE__*/React.createElement(IntlProvider, {
80
+ locale: "en"
81
+ }, content);
82
+ };
83
+ const MediaViewerWithRef = /*#__PURE__*/React.forwardRef((props, ref) => {
84
+ return /*#__PURE__*/React.createElement(MediaViewerComponent, _extends({}, props, {
85
+ innerRef: ref
86
+ }));
87
+ });
88
+ const MediaViewerWithScrollLock = props => {
89
+ return /*#__PURE__*/React.createElement(FocusLock, {
90
+ autoFocus: true
91
+ }, /*#__PURE__*/React.createElement(ScrollLock, null), /*#__PURE__*/React.createElement(MediaViewerWithRef, props));
92
+ };
93
+ export const MediaViewerV2 = injectIntl(MediaViewerWithScrollLock, {
94
+ enforceContext: false
95
+ });
@@ -88,7 +88,7 @@ export class ArchiveViewerBase extends BaseViewer {
88
88
  });
89
89
  });
90
90
  _defineProperty(this, "onViewerLoad", selectedArchiveEntry => () => {
91
- fireAnalytics(createZipEntryLoadSucceededEvent(this.props.item, selectedArchiveEntry), this.props);
91
+ fireAnalytics(createZipEntryLoadSucceededEvent(this.props.item, selectedArchiveEntry), this.props.createAnalyticsEvent);
92
92
  });
93
93
  _defineProperty(this, "onViewerError", (primaryErrorReason, selectedArchiveEntry) => error => error && isMediaViewerError(error) ? this.onError(new ArchiveViewerError(primaryErrorReason, error.secondaryError, selectedArchiveEntry)) : this.onError(new ArchiveViewerError(primaryErrorReason, error, selectedArchiveEntry)));
94
94
  _defineProperty(this, "onSidebarLoaded", () => {
@@ -229,9 +229,10 @@ export class ArchiveViewerBase extends BaseViewer {
229
229
  }
230
230
  renderPreviewError(error, entry) {
231
231
  const {
232
- item
232
+ item,
233
+ createAnalyticsEvent
233
234
  } = this.props;
234
- fireAnalytics(createZipEntryLoadFailedEvent(this.props.item, error, entry), this.props);
235
+ fireAnalytics(createZipEntryLoadFailedEvent(item, error, entry), createAnalyticsEvent);
235
236
  return /*#__PURE__*/React.createElement(ListWrapper, null, /*#__PURE__*/React.createElement(ErrorMessage, {
236
237
  fileId: item.id,
237
238
  fileState: item,
@@ -17,22 +17,24 @@ export class ZoomControlsBase extends Component {
17
17
  _defineProperty(this, "zoomIn", () => {
18
18
  const {
19
19
  onChange,
20
- zoomLevel
20
+ zoomLevel,
21
+ createAnalyticsEvent
21
22
  } = this.props;
22
23
  if (zoomLevel.canZoomIn) {
23
24
  const zoom = zoomLevel.zoomIn();
24
- fireAnalytics(createZoomInButtonClickEvent(zoom.value), this.props);
25
+ fireAnalytics(createZoomInButtonClickEvent(zoom.value), createAnalyticsEvent);
25
26
  onChange(zoom);
26
27
  }
27
28
  });
28
29
  _defineProperty(this, "zoomOut", () => {
29
30
  const {
30
31
  onChange,
31
- zoomLevel
32
+ zoomLevel,
33
+ createAnalyticsEvent
32
34
  } = this.props;
33
35
  if (zoomLevel.canZoomOut) {
34
36
  const zoom = zoomLevel.zoomOut();
35
- fireAnalytics(createZoomOutButtonClickedEvent(zoom.value), this.props);
37
+ fireAnalytics(createZoomOutButtonClickedEvent(zoom.value), createAnalyticsEvent);
36
38
  onChange(zoom);
37
39
  }
38
40
  });
@@ -1,7 +1,7 @@
1
1
  import { ANALYTICS_MEDIA_CHANNEL } from '@atlaskit/media-common';
2
2
  var componentName = 'mediaViewer';
3
3
  var packageName = "@atlaskit/media-viewer";
4
- var packageVersion = "48.1.7";
4
+ var packageVersion = "48.2.0";
5
5
  export { packageName, packageVersion, componentName, componentName as component };
6
6
  export function getFileAttributes(fileState) {
7
7
  if (!fileState) {
@@ -33,8 +33,7 @@ export function getFileAttributes(fileState) {
33
33
 
34
34
  /** This type takes FailureAttributes and redefines `failReason` to be the strong media-viewer type */
35
35
 
36
- export function fireAnalytics(payload, props) {
37
- var createAnalyticsEvent = props.createAnalyticsEvent;
36
+ export function fireAnalytics(payload, createAnalyticsEvent) {
38
37
  if (createAnalyticsEvent) {
39
38
  var ev = createAnalyticsEvent(payload);
40
39
  ev.fire(ANALYTICS_MEDIA_CHANNEL);
@@ -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 = "48.1.7";
8
+ var packageVersion = "48.2.0";
9
9
  var ufoExperience;
10
10
  var getExperience = function getExperience() {
11
11
  if (!ufoExperience) {
@@ -3,9 +3,11 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  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; }
4
4
  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; }
5
5
  import React, { useEffect, useMemo } from 'react';
6
+ import { MediaViewerV2 as MediaViewerNextGenV2 } from '../v2/media-viewer-v2';
6
7
  import { MediaViewer as MediaViewerNextGen } from '../media-viewer';
7
8
  import { isSameIdentifier } from '../utils';
8
9
  import { isFileIdentifier } from '@atlaskit/media-client';
10
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
9
11
  var ensureCollectionName = function ensureCollectionName(identifier, collectionName) {
10
12
  return isFileIdentifier(identifier) ? _objectSpread(_objectSpread({}, identifier), {}, {
11
13
  collectionName: identifier.collectionName || collectionName
@@ -26,6 +28,9 @@ var normaliseItems = function normaliseItems(items, selectedItem, collectionName
26
28
  selectedItem: selectedItemWithCollectionName
27
29
  };
28
30
  };
31
+
32
+ // TODO: This component will be removed in https://product-fabric.atlassian.net/browse/CXP-2722
33
+
29
34
  export var MediaViewer = function MediaViewer(_ref) {
30
35
  var featureFlags = _ref.featureFlags,
31
36
  onClose = _ref.onClose,
@@ -61,7 +66,14 @@ export var MediaViewer = function MediaViewer(_ref) {
61
66
  parent.postMessage(closingMsg, '*');
62
67
  };
63
68
  }, []);
64
- return /*#__PURE__*/React.createElement(MediaViewerNextGen, {
69
+ return getBooleanFF('platform.media-experience.media-viewer-v2_hgsii') ? /*#__PURE__*/React.createElement(MediaViewerNextGenV2, {
70
+ selectedItem: normalisedSelectedItem,
71
+ onClose: onClose,
72
+ items: normalisedItems,
73
+ featureFlags: featureFlags,
74
+ extensions: extensions,
75
+ contextId: contextId
76
+ }) : /*#__PURE__*/React.createElement(MediaViewerNextGen, {
65
77
  mediaClient: mediaClient,
66
78
  selectedItem: normalisedSelectedItem,
67
79
  onClose: onClose,
@@ -63,12 +63,14 @@ export var ErrorMessage = /*#__PURE__*/function (_React$Component) {
63
63
  error = props.error,
64
64
  fileState = props.fileState,
65
65
  fileId = props.fileId,
66
- traceContext = props.traceContext;
66
+ traceContext = props.traceContext,
67
+ createAnalyticsEvent = props.createAnalyticsEvent,
68
+ fileStateFlags = props.fileStateFlags;
67
69
  if (supressAnalytics !== true) {
68
70
  var payload = ErrorMessage.getEventPayload(error, fileId, fileState, traceContext);
69
- fireAnalytics(payload, props);
71
+ fireAnalytics(payload, createAnalyticsEvent);
70
72
  var rawPayload = _objectSpread(_objectSpread({}, payload === null || payload === void 0 ? void 0 : payload.attributes), {}, {
71
- fileStateFlags: props.fileStateFlags
73
+ fileStateFlags: fileStateFlags
72
74
  });
73
75
  if (Object.keys(rawPayload).includes('status')) {
74
76
  delete rawPayload['status'];
@@ -111,7 +111,7 @@ export var ItemViewerBase = /*#__PURE__*/function (_React$Component) {
111
111
  item.whenSuccessful(function (fileItem) {
112
112
  if (isFileStateItem(fileItem)) {
113
113
  var fileAttributes = getFileAttributes(fileItem);
114
- fireAnalytics(createLoadSucceededEvent(fileAttributes, _this.traceContext), _this.props);
114
+ fireAnalytics(createLoadSucceededEvent(fileAttributes, _this.traceContext), _this.props.createAnalyticsEvent);
115
115
  succeedMediaFileUfoExperience({
116
116
  fileAttributes: fileAttributes,
117
117
  fileStateFlags: _this.fileStateFlags
@@ -127,7 +127,7 @@ export var ItemViewerBase = /*#__PURE__*/function (_React$Component) {
127
127
  _defineProperty(_assertThisInitialized(_this), "onExternalImgSuccess", function () {
128
128
  fireAnalytics(createLoadSucceededEvent({
129
129
  fileId: 'external-image'
130
- }), _this.props);
130
+ }), _this.props.createAnalyticsEvent);
131
131
  succeedMediaFileUfoExperience({
132
132
  fileAttributes: {
133
133
  fileId: 'external-image'
@@ -332,7 +332,8 @@ export var ItemViewerBase = /*#__PURE__*/function (_React$Component) {
332
332
  value: function init(props) {
333
333
  var _this3 = this;
334
334
  var mediaClient = props.mediaClient,
335
- identifier = props.identifier;
335
+ identifier = props.identifier,
336
+ createAnalyticsEvent = props.createAnalyticsEvent;
336
337
  if (isExternalImageIdentifier(identifier)) {
337
338
  // external images do not need to talk to our backend,
338
339
  // so therefore no need for media-client subscriptions.
@@ -343,7 +344,7 @@ export var ItemViewerBase = /*#__PURE__*/function (_React$Component) {
343
344
  return;
344
345
  }
345
346
  var id = identifier.id;
346
- fireAnalytics(createCommencedEvent(id, this.traceContext), this.props);
347
+ fireAnalytics(createCommencedEvent(id, this.traceContext), createAnalyticsEvent);
347
348
  startMediaFileUfoExperience();
348
349
  this.subscription = mediaClient.file.getFileState(id, {
349
350
  collectionName: identifier.collectionName
@@ -37,16 +37,20 @@ export var MediaViewerComponent = /*#__PURE__*/function (_React$Component) {
37
37
  isSidebarVisible: false
38
38
  });
39
39
  _defineProperty(_assertThisInitialized(_this), "onShortcutClosed", function () {
40
- fireAnalytics(createClosedEvent('escKey'), _this.props);
41
- var onClose = _this.props.onClose;
40
+ var _this$props = _this.props,
41
+ onClose = _this$props.onClose,
42
+ createAnalyticsEvent = _this$props.createAnalyticsEvent;
43
+ fireAnalytics(createClosedEvent('escKey'), createAnalyticsEvent);
42
44
  if (onClose) {
43
45
  onClose();
44
46
  }
45
47
  });
46
48
  _defineProperty(_assertThisInitialized(_this), "onContentClose", function (_e, analyticsEvent) {
47
- var onClose = _this.props.onClose;
49
+ var _this$props2 = _this.props,
50
+ onClose = _this$props2.onClose,
51
+ createAnalyticsEvent = _this$props2.createAnalyticsEvent;
48
52
  if (analyticsEvent && analyticsEvent.payload && analyticsEvent.payload.actionSubject === 'button') {
49
- fireAnalytics(createClosedEvent('button'), _this.props);
53
+ fireAnalytics(createClosedEvent('button'), createAnalyticsEvent);
50
54
  }
51
55
  if (onClose) {
52
56
  onClose();
@@ -81,29 +85,29 @@ export var MediaViewerComponent = /*#__PURE__*/function (_React$Component) {
81
85
  _createClass(MediaViewerComponent, [{
82
86
  key: "UNSAFE_componentWillMount",
83
87
  value: function UNSAFE_componentWillMount() {
84
- fireAnalytics(createModalEvent(), this.props);
88
+ fireAnalytics(createModalEvent(), this.props.createAnalyticsEvent);
85
89
  start('MediaViewer.SessionDuration');
86
90
  }
87
91
  }, {
88
92
  key: "defaultSelectedItem",
89
93
  get: function get() {
90
- var _this$props = this.props,
91
- items = _this$props.items,
92
- selectedItem = _this$props.selectedItem;
94
+ var _this$props3 = this.props,
95
+ items = _this$props3.items,
96
+ selectedItem = _this$props3.selectedItem;
93
97
  var firstItem = items[0];
94
98
  return selectedItem || firstItem;
95
99
  }
96
100
  }, {
97
101
  key: "render",
98
102
  value: function render() {
99
- var _this$props2 = this.props,
100
- mediaClient = _this$props2.mediaClient,
101
- onClose = _this$props2.onClose,
102
- items = _this$props2.items,
103
- extensions = _this$props2.extensions,
104
- contextId = _this$props2.contextId,
105
- featureFlags = _this$props2.featureFlags,
106
- innerRef = _this$props2.innerRef;
103
+ var _this$props4 = this.props,
104
+ mediaClient = _this$props4.mediaClient,
105
+ onClose = _this$props4.onClose,
106
+ items = _this$props4.items,
107
+ extensions = _this$props4.extensions,
108
+ contextId = _this$props4.contextId,
109
+ featureFlags = _this$props4.featureFlags,
110
+ innerRef = _this$props4.innerRef;
107
111
  var isSidebarVisible = this.state.isSidebarVisible;
108
112
  var content = /*#__PURE__*/React.createElement("div", {
109
113
  ref: innerRef
@@ -111,7 +115,7 @@ export var MediaViewerComponent = /*#__PURE__*/function (_React$Component) {
111
115
  "data-testid": "media-viewer-popup",
112
116
  className: mediaViewerPopupClass
113
117
  }, /*#__PURE__*/React.createElement(Shortcut, {
114
- keyCode: 27,
118
+ code: 'Escape',
115
119
  handler: this.onShortcutClosed
116
120
  }), /*#__PURE__*/React.createElement(Content, {
117
121
  isSidebarVisible: isSidebarVisible,
@@ -34,11 +34,12 @@ export var NavigationBase = /*#__PURE__*/function (_Component) {
34
34
  return function () {
35
35
  var _this$props = _this.props,
36
36
  onChange = _this$props.onChange,
37
- items = _this$props.items;
37
+ items = _this$props.items,
38
+ createAnalyticsEvent = _this$props.createAnalyticsEvent;
38
39
  var selectedIndex = _this.selectedIndex;
39
40
  var newItem = direction === 'next' ? items[selectedIndex + 1] : items[selectedIndex - 1];
40
41
  if (newItem) {
41
- fireAnalytics(createNavigatedEvent(direction, source, newItem), _this.props);
42
+ fireAnalytics(createNavigatedEvent(direction, source, newItem), createAnalyticsEvent);
42
43
  onChange(newItem);
43
44
  }
44
45
  };
@@ -75,7 +76,7 @@ export var NavigationBase = /*#__PURE__*/function (_Component) {
75
76
  }, isLeftVisible ? /*#__PURE__*/React.createElement(Arrow, {
76
77
  className: hideControlsClassName
77
78
  }, /*#__PURE__*/React.createElement(Shortcut, {
78
- keyCode: 37,
79
+ code: 'ArrowLeft',
79
80
  handler: prev('keyboard')
80
81
  }), /*#__PURE__*/React.createElement(Button, {
81
82
  testId: prevNavButtonId,
@@ -93,7 +94,7 @@ export var NavigationBase = /*#__PURE__*/function (_Component) {
93
94
  })) : null), /*#__PURE__*/React.createElement(RightWrapper, null, isRightVisible ? /*#__PURE__*/React.createElement(Arrow, {
94
95
  className: hideControlsClassName
95
96
  }, /*#__PURE__*/React.createElement(Shortcut, {
96
- keyCode: 39,
97
+ code: 'ArrowRight',
97
98
  handler: next('keyboard')
98
99
  }), /*#__PURE__*/React.createElement(Button, {
99
100
  testId: nextNavButtonId,
@@ -5,6 +5,7 @@ import { forwardRef, useMemo } from 'react';
5
5
  import { arrowStyles, arrowsWrapperStyles, audioCoverStyles, audioPlayerStyles, audioStyles, baselineExtendStyles, blanketStyles, closeButtonWrapperStyles, contentWrapperStyles, customAudioPlayerWrapperStyles, customVideoPlayerWrapperStyles, defaultCoverWrapperStyles, downloadButtonWrapperStyles, errorImageStyles, errorMessageWrapperStyles, formattedMessageWrapperStyles, hdIconGroupWrapperStyles, hdIconWrapperStyles, headerStyles, headerWrapperStyles, imageWrapperStyles, imgStyles, leftHeaderStyles, leftWrapperStyles, listWrapperStyles, medatadataTextWrapperStyles, metadataFileNameStyles, metadataIconWrapperStyles, metadataSubTextStyles, metadataWrapperStyles, pdfWrapperStyles, rightHeaderStyles, rightWrapperStyles, sidebarWrapperStyles, spinnerWrapperStyles, videoStyles, zoomControlsWrapperStyles, zoomLevelIndicatorStyles, zoomWrapperStyles } from './styles';
6
6
  import { TouchScrollable } from 'react-scrolllock';
7
7
  import { useMergeRefs } from 'use-callback-ref';
8
+ // We are keeping this data-testid since JIRA is still using it in their codebase to perform checks. Before removing this, we need to ensure this 'media-viewer-popup' test id is not being used anywhere else in other codebases
8
9
  export var Blanket = function Blanket(_ref) {
9
10
  var datatestId = _ref['data-testid'],
10
11
  className = _ref.className,
@@ -0,0 +1,149 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { useEffect, useRef, useState } from 'react';
3
+ import { isExternalImageIdentifier, isErrorFileState } from '@atlaskit/media-client';
4
+ import { hideControlsClassName, messages, toHumanReadableMediaSize, MediaButton } from '@atlaskit/media-ui';
5
+ import { getLanguageType, getExtension, isCodeViewerItem } from '@atlaskit/media-ui/codeViewer';
6
+ import { FormattedMessage, injectIntl } from 'react-intl-next';
7
+ import { Outcome } from '../domain';
8
+ import { Header as HeaderWrapper, LeftHeader, RightHeader, MetadataWrapper, MetadataSubText, MedatadataTextWrapper, MetadataIconWrapper, MetadataFileName, FormattedMessageWrapper } from '../styleWrappers';
9
+ import { ToolbarDownloadButton, DisabledToolbarDownloadButton } from '../download';
10
+ import { MediaFileStateError, useFileState, useMediaClient } from '@atlaskit/media-client-react';
11
+ import { MimeTypeIcon } from '@atlaskit/media-ui/mime-type-icon';
12
+ import { getFormat } from '../viewers/codeViewer/util';
13
+ import { MediaViewerError } from '../errors';
14
+ export var HeaderV2 = function HeaderV2(_ref) {
15
+ var _ref$isArchiveSideBar = _ref.isArchiveSideBarVisible,
16
+ isArchiveSideBarVisible = _ref$isArchiveSideBar === void 0 ? false : _ref$isArchiveSideBar,
17
+ extensions = _ref.extensions,
18
+ isSidebarVisible = _ref.isSidebarVisible,
19
+ onSidebarButtonClick = _ref.onSidebarButtonClick,
20
+ identifier = _ref.identifier,
21
+ onSetArchiveSideBarVisible = _ref.onSetArchiveSideBarVisible;
22
+ // States
23
+ var _useState = useState(Outcome.pending()),
24
+ _useState2 = _slicedToArray(_useState, 2),
25
+ item = _useState2[0],
26
+ setItem = _useState2[1];
27
+
28
+ // Refs and Hooks
29
+ var mediaClient = useMediaClient();
30
+ var _ref2 = identifier,
31
+ id = _ref2.id,
32
+ collectionName = _ref2.collectionName,
33
+ occurrenceKey = _ref2.occurrenceKey;
34
+ var _useFileState = useFileState(id, {
35
+ collectionName: collectionName,
36
+ occurrenceKey: occurrenceKey
37
+ }),
38
+ fileState = _useFileState.fileState;
39
+ var onSetArchiveSideBarVisibleRef = useRef(onSetArchiveSideBarVisible);
40
+ onSetArchiveSideBarVisibleRef.current = onSetArchiveSideBarVisible;
41
+
42
+ // previous values
43
+ useEffect(function () {
44
+ if (isExternalImageIdentifier(identifier)) {
45
+ var _identifier$name = identifier.name,
46
+ name = _identifier$name === void 0 ? identifier.dataURI : _identifier$name;
47
+
48
+ // Simulate a processing file state to render right metadata
49
+ var _fileState = {
50
+ status: 'processing',
51
+ id: name,
52
+ mediaType: 'image',
53
+ mimeType: 'image/',
54
+ name: name,
55
+ representations: {},
56
+ size: 0
57
+ };
58
+ setItem(Outcome.successful(_fileState));
59
+ return;
60
+ }
61
+ if (!fileState) {
62
+ return;
63
+ }
64
+ if (fileState.status !== 'error') {
65
+ var _onSetArchiveSideBarV;
66
+ (_onSetArchiveSideBarV = onSetArchiveSideBarVisibleRef.current) === null || _onSetArchiveSideBarV === void 0 || _onSetArchiveSideBarV.call(onSetArchiveSideBarVisibleRef, !isErrorFileState(fileState) && fileState.mediaType === 'archive');
67
+ setItem(Outcome.successful(fileState));
68
+ } else {
69
+ var error = new MediaFileStateError(fileState.id, fileState.reason, fileState.message, fileState.details);
70
+ setItem(Outcome.failed(new MediaViewerError('header-fetch-metadata', error)));
71
+ }
72
+ }, [fileState, identifier]);
73
+ var renderFileTypeText = function renderFileTypeText(item) {
74
+ // render appropriate header if its a code/email item and the feature flag is enabled
75
+ if (isCodeViewerItem(item.name, item.mimeType)) {
76
+ // gather language and extension
77
+ // i.e test.py would have a language of 'python' and an extension of 'py'
78
+ var language = getLanguageType(item.name, item.mimeType);
79
+ var ext = getExtension(item.name);
80
+
81
+ // specific cases for if we want a certain word translated in other languages
82
+ switch (ext) {
83
+ case 'msg':
84
+ return /*#__PURE__*/React.createElement(FormattedMessage, messages.email);
85
+ case 'txt':
86
+ return /*#__PURE__*/React.createElement(FormattedMessage, messages.text);
87
+ }
88
+
89
+ // no need for translations in other languages
90
+ return /*#__PURE__*/React.createElement(React.Fragment, null, getFormat(language || 'unknown', ext));
91
+ }
92
+ var mediaType = item.mediaType;
93
+ var mediaTypeTranslationMap = {
94
+ doc: messages.document,
95
+ audio: messages.audio,
96
+ video: messages.video,
97
+ image: messages.image,
98
+ archive: messages.archive,
99
+ unknown: messages.unknown
100
+ };
101
+ var message = mediaTypeTranslationMap[mediaType || 'unknown'];
102
+
103
+ // Defaulting to unknown again since backend has more mediaTypes than the current supported ones
104
+ return /*#__PURE__*/React.createElement(FormattedMessage, message || messages.unknown);
105
+ };
106
+ return /*#__PURE__*/React.createElement(HeaderWrapper, {
107
+ isArchiveSideBarVisible: isArchiveSideBarVisible,
108
+ className: hideControlsClassName
109
+ }, /*#__PURE__*/React.createElement(LeftHeader, null, item.match({
110
+ successful: function successful(item) {
111
+ return !isErrorFileState(item) && /*#__PURE__*/React.createElement(MetadataWrapper, null, /*#__PURE__*/React.createElement(MetadataIconWrapper, null, /*#__PURE__*/React.createElement(MimeTypeIcon, {
112
+ testId: 'media-viewer-file-type-icon',
113
+ mediaType: item.mediaType,
114
+ mimeType: item.mimeType,
115
+ name: item.name
116
+ })), /*#__PURE__*/React.createElement(MedatadataTextWrapper, null, /*#__PURE__*/React.createElement(MetadataFileName, {
117
+ "data-testid": "media-viewer-file-name"
118
+ }, item.name || /*#__PURE__*/React.createElement(FormattedMessage, messages.unknown)), /*#__PURE__*/React.createElement(MetadataSubText, {
119
+ "data-testid": "media-viewer-file-metadata-text"
120
+ }, /*#__PURE__*/React.createElement(FormattedMessageWrapper, null, renderFileTypeText(item)), item.size ? ' · ' + toHumanReadableMediaSize(item.size) : '')));
121
+ },
122
+ pending: function pending() {
123
+ return null;
124
+ },
125
+ failed: function failed() {
126
+ return null;
127
+ }
128
+ })), /*#__PURE__*/React.createElement(RightHeader, null, (extensions === null || extensions === void 0 ? void 0 : extensions.sidebar) && /*#__PURE__*/React.createElement(MediaButton, {
129
+ isSelected: isSidebarVisible,
130
+ testId: "media-viewer-sidebar-button",
131
+ onClick: onSidebarButtonClick,
132
+ iconBefore: extensions.sidebar.icon
133
+ }), item.match({
134
+ pending: function pending() {
135
+ return DisabledToolbarDownloadButton;
136
+ },
137
+ failed: function failed() {
138
+ return DisabledToolbarDownloadButton;
139
+ },
140
+ successful: function successful(item) {
141
+ return /*#__PURE__*/React.createElement(ToolbarDownloadButton, {
142
+ state: item,
143
+ identifier: identifier,
144
+ mediaClient: mediaClient
145
+ });
146
+ }
147
+ })));
148
+ };
149
+ export default injectIntl(HeaderV2);