@atlaskit/editor-plugin-media 1.36.4 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 1.37.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#154775](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154775)
8
+ [`1b353693c3119`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/1b353693c3119) -
9
+ [ED-25348] Refactor Media Group React Class component into Function Component
10
+
11
+ ### Patch Changes
12
+
13
+ - [#154186](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154186)
14
+ [`5c316170d29dd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/5c316170d29dd) -
15
+ Bump @atlaskit/adf-schema to 42.3.1
16
+ - Updated dependencies
17
+
18
+ ## 1.36.5
19
+
20
+ ### Patch Changes
21
+
22
+ - [#154581](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154581)
23
+ [`27d560bd2b6b6`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/27d560bd2b6b6) -
24
+ [ux] ED-25201 Enable double click to open media viewer in editor
25
+
3
26
  ## 1.36.4
4
27
 
5
28
  ### Patch Changes
@@ -24,8 +24,10 @@ var _utils = require("@atlaskit/editor-common/utils");
24
24
  var _close = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/close"));
25
25
  var _mediaCommon = require("@atlaskit/media-common");
26
26
  var _mediaFilmstrip = require("@atlaskit/media-filmstrip");
27
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
27
28
  var _useMediaProvider = require("../hooks/useMediaProvider");
28
29
  var _pluginKey = require("../pm-plugins/plugin-key");
30
+ var _mediaGroupNext = require("./mediaGroupNext");
29
31
  var _mediaNodeUpdater = require("./mediaNodeUpdater");
30
32
  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; }
31
33
  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; }
@@ -346,6 +348,23 @@ var MediaGroupNodeView = /*#__PURE__*/function (_ReactNodeView) {
346
348
  if (!mediaProvider) {
347
349
  return null;
348
350
  }
351
+ if ((0, _platformFeatureFlags.fg)('platform_editor_react18_phase2__media_single')) {
352
+ return /*#__PURE__*/_react.default.createElement(_mediaGroupNext.MediaGroupNext, {
353
+ node: _this3.node,
354
+ getPos: getPos,
355
+ view: _this3.view,
356
+ forwardRef: forwardRef,
357
+ disabled: (editorDisabledPlugin || {}).editorDisabled,
358
+ allowLazyLoading: mediaOptions.allowLazyLoading,
359
+ mediaProvider: mediaProvider,
360
+ contextIdentifierProvider: contextIdentifierProvider,
361
+ isCopyPasteEnabled: mediaOptions.isCopyPasteEnabled,
362
+ anchorPos: _this3.view.state.selection.$anchor.pos,
363
+ headPos: _this3.view.state.selection.$head.pos,
364
+ mediaOptions: mediaOptions,
365
+ editorViewMode: (editorViewModePlugin === null || editorViewModePlugin === void 0 ? void 0 : editorViewModePlugin.mode) === 'view'
366
+ });
367
+ }
349
368
  return /*#__PURE__*/_react.default.createElement(IntlMediaGroup, {
350
369
  node: _this3.node,
351
370
  getPos: getPos,
@@ -0,0 +1,295 @@
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.MediaGroupNext = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var _react = _interopRequireWildcard(require("react"));
14
+ var _reactIntlNext = require("react-intl-next");
15
+ var _hooks = require("@atlaskit/editor-common/hooks");
16
+ var _media = require("@atlaskit/editor-common/media");
17
+ var _utils = require("@atlaskit/editor-common/utils");
18
+ var _close = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/close"));
19
+ var _mediaCommon = require("@atlaskit/media-common");
20
+ var _mediaFilmstrip = require("@atlaskit/media-filmstrip");
21
+ var _pluginKey = require("../pm-plugins/plugin-key");
22
+ var _mediaNodeUpdater = require("./mediaNodeUpdater");
23
+ 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); }
24
+ 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; }
25
+ 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; }
26
+ 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; }
27
+ var getIdentifier = function getIdentifier(item) {
28
+ if (item.attrs.type === 'external') {
29
+ return {
30
+ mediaItemType: 'external-image',
31
+ dataURI: item.attrs.url
32
+ };
33
+ }
34
+ return {
35
+ id: item.attrs.id,
36
+ mediaItemType: 'file',
37
+ collectionName: item.attrs.collection
38
+ };
39
+ };
40
+ var isNodeSelected = function isNodeSelected(props) {
41
+ return function (mediaItemPos, mediaGroupPos) {
42
+ var selected = (0, _utils.isNodeSelectedOrInRange)(props.anchorPos, props.headPos, mediaGroupPos, props.nodeSize);
43
+ if (selected === _utils.SelectedState.selectedInRange) {
44
+ return true;
45
+ }
46
+ if (selected === _utils.SelectedState.selectedInside && props.anchorPos === mediaItemPos) {
47
+ return true;
48
+ }
49
+ return false;
50
+ };
51
+ };
52
+ var prepareFilmstripItem = function prepareFilmstripItem(_ref) {
53
+ var allowLazyLoading = _ref.allowLazyLoading,
54
+ enableDownloadButton = _ref.enableDownloadButton,
55
+ handleMediaNodeRemoval = _ref.handleMediaNodeRemoval,
56
+ getPos = _ref.getPos,
57
+ intl = _ref.intl,
58
+ isMediaItemSelected = _ref.isMediaItemSelected,
59
+ setMediaGroupNodeSelection = _ref.setMediaGroupNodeSelection,
60
+ featureFlags = _ref.featureFlags;
61
+ return function (item, idx) {
62
+ // We declared this to get a fresh position every time
63
+ var getNodePos = function getNodePos() {
64
+ var pos = getPos();
65
+ if (typeof pos !== 'number') {
66
+ // That may seems weird, but the previous type wasn't match with the real ProseMirror code. And a lot of Media API was built expecting a number
67
+ // Because the original code would return NaN on runtime
68
+ // We are just make it explict now.
69
+ // We may run a deep investagation on Media code to figure out a better fix. But, for now, we want to keep the current behavior.
70
+ // TODO: ED-13910 prosemirror-bump leftovers
71
+ return NaN;
72
+ }
73
+ return pos + idx + 1;
74
+ };
75
+
76
+ // Media Inline creates a floating toolbar with the same options, excludes these options if enabled
77
+ var mediaInlineOptions = function mediaInlineOptions() {
78
+ var allowMediaInline = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
79
+ if (!allowMediaInline) {
80
+ return {
81
+ shouldEnableDownloadButton: enableDownloadButton,
82
+ actions: [{
83
+ handler: handleMediaNodeRemoval.bind(null, undefined, getNodePos),
84
+ icon: /*#__PURE__*/_react.default.createElement(_close.default, {
85
+ label: intl.formatMessage(_media.nodeViewsMessages.mediaGroupDeleteLabel)
86
+ })
87
+ }]
88
+ };
89
+ }
90
+ };
91
+ var mediaGroupPos = getPos();
92
+ return _objectSpread({
93
+ identifier: getIdentifier(item),
94
+ isLazy: allowLazyLoading,
95
+ selected: isMediaItemSelected(getNodePos(), typeof mediaGroupPos === 'number' ? mediaGroupPos : NaN),
96
+ onClick: function onClick() {
97
+ setMediaGroupNodeSelection(getNodePos());
98
+ }
99
+ }, mediaInlineOptions((0, _mediaCommon.getMediaFeatureFlag)('mediaInline', featureFlags)));
100
+ };
101
+ };
102
+
103
+ /**
104
+ * Keep returning the same ProseMirror Node, unless the node content changed.
105
+ *
106
+ * React uses shallow comparation with `Object.is`,
107
+ * but that can cause multiple re-renders when the same node is given in a different instance.
108
+ *
109
+ * To avoid unnecessary re-renders, this hook uses the `Node.eq` from ProseMirror API to compare
110
+ * previous and new values.
111
+ */
112
+ var useLatestMediaGroupNode = function useLatestMediaGroupNode(nextMediaNode) {
113
+ var previousMediaNode = (0, _hooks.usePreviousState)(nextMediaNode);
114
+ var _React$useState = _react.default.useState(nextMediaNode),
115
+ _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
116
+ mediaNode = _React$useState2[0],
117
+ setMediaNode = _React$useState2[1];
118
+ _react.default.useEffect(function () {
119
+ if (!previousMediaNode) {
120
+ return;
121
+ }
122
+ if (!previousMediaNode.eq(nextMediaNode)) {
123
+ setMediaNode(nextMediaNode);
124
+ }
125
+ }, [previousMediaNode, nextMediaNode]);
126
+ return mediaNode;
127
+ };
128
+ var runMediaNodeUpdate = /*#__PURE__*/function () {
129
+ var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref2) {
130
+ var mediaNodeUpdater, getPos, node, updateAttrs, contextId, hasDifferentContextId;
131
+ return _regenerator.default.wrap(function _callee$(_context) {
132
+ while (1) switch (_context.prev = _context.next) {
133
+ case 0:
134
+ mediaNodeUpdater = _ref2.mediaNodeUpdater, getPos = _ref2.getPos, node = _ref2.node, updateAttrs = _ref2.updateAttrs;
135
+ if (!updateAttrs) {
136
+ _context.next = 4;
137
+ break;
138
+ }
139
+ _context.next = 4;
140
+ return mediaNodeUpdater.updateNodeAttrs(getPos);
141
+ case 4:
142
+ contextId = mediaNodeUpdater.getNodeContextId();
143
+ if (contextId) {
144
+ _context.next = 8;
145
+ break;
146
+ }
147
+ _context.next = 8;
148
+ return mediaNodeUpdater.updateNodeContextId(getPos);
149
+ case 8:
150
+ _context.next = 10;
151
+ return mediaNodeUpdater.hasDifferentContextId();
152
+ case 10:
153
+ hasDifferentContextId = _context.sent;
154
+ if (!hasDifferentContextId) {
155
+ _context.next = 14;
156
+ break;
157
+ }
158
+ _context.next = 14;
159
+ return mediaNodeUpdater.copyNodeFromPos(getPos, {
160
+ traceId: node.attrs.__mediaTraceId
161
+ });
162
+ case 14:
163
+ case "end":
164
+ return _context.stop();
165
+ }
166
+ }, _callee);
167
+ }));
168
+ return function runMediaNodeUpdate(_x) {
169
+ return _ref3.apply(this, arguments);
170
+ };
171
+ }();
172
+ var noop = function noop() {};
173
+ var MediaGroupNext = exports.MediaGroupNext = (0, _reactIntlNext.injectIntl)( /*#__PURE__*/_react.default.memo(function (props) {
174
+ var _props$mediaOptions = props.mediaOptions,
175
+ allowLazyLoading = _props$mediaOptions.allowLazyLoading,
176
+ enableDownloadButton = _props$mediaOptions.enableDownloadButton,
177
+ featureFlags = _props$mediaOptions.featureFlags,
178
+ intl = props.intl,
179
+ _getPos = props.getPos,
180
+ anchorPos = props.anchorPos,
181
+ headPos = props.headPos,
182
+ view = props.view,
183
+ disabled = props.disabled,
184
+ editorViewMode = props.editorViewMode,
185
+ mediaProvider = props.mediaProvider,
186
+ contextIdentifierProvider = props.contextIdentifierProvider,
187
+ isCopyPasteEnabled = props.isCopyPasteEnabled;
188
+ var mediaGroupNode = useLatestMediaGroupNode(props.node);
189
+ var mediaPluginState = (0, _react.useMemo)(function () {
190
+ return _pluginKey.stateKey.getState(view.state);
191
+ }, [view.state]);
192
+ var mediaClientConfig = mediaPluginState === null || mediaPluginState === void 0 ? void 0 : mediaPluginState.mediaClientConfig;
193
+ var handleMediaGroupUpdate = mediaPluginState === null || mediaPluginState === void 0 ? void 0 : mediaPluginState.handleMediaGroupUpdate;
194
+ var _useState = (0, _react.useState)(undefined),
195
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
196
+ viewMediaClientConfig = _useState2[0],
197
+ setViewMediaClientConfig = _useState2[1];
198
+ var nodeSize = mediaGroupNode.nodeSize;
199
+ var mediaNodesWithOffsets = (0, _react.useMemo)(function () {
200
+ var result = [];
201
+ mediaGroupNode.forEach(function (item, childOffset) {
202
+ result.push({
203
+ node: item,
204
+ offset: childOffset
205
+ });
206
+ });
207
+ return result;
208
+ }, [mediaGroupNode]);
209
+ var previousMediaNodesWithOffsets = (0, _hooks.usePreviousState)(mediaNodesWithOffsets);
210
+ var handleMediaNodeRemoval = (0, _react.useMemo)(function () {
211
+ return disabled || !mediaPluginState ? noop : mediaPluginState.handleMediaNodeRemoval;
212
+ }, [disabled, mediaPluginState]);
213
+ var setMediaGroupNodeSelection = (0, _react.useCallback)(function (pos) {
214
+ (0, _utils.setNodeSelection)(view, pos);
215
+ }, [view]);
216
+ var isMediaItemSelected = (0, _react.useMemo)(function () {
217
+ return isNodeSelected({
218
+ anchorPos: anchorPos,
219
+ headPos: headPos,
220
+ nodeSize: nodeSize
221
+ });
222
+ }, [anchorPos, headPos, nodeSize]);
223
+ var filmstripItem = (0, _react.useMemo)(function () {
224
+ return prepareFilmstripItem({
225
+ allowLazyLoading: allowLazyLoading,
226
+ enableDownloadButton: enableDownloadButton,
227
+ handleMediaNodeRemoval: handleMediaNodeRemoval,
228
+ getPos: _getPos,
229
+ intl: intl,
230
+ isMediaItemSelected: isMediaItemSelected,
231
+ setMediaGroupNodeSelection: setMediaGroupNodeSelection,
232
+ featureFlags: featureFlags
233
+ });
234
+ }, [allowLazyLoading, enableDownloadButton, handleMediaNodeRemoval, _getPos, intl, isMediaItemSelected, setMediaGroupNodeSelection, featureFlags]);
235
+ var items = (0, _react.useMemo)(function () {
236
+ return mediaNodesWithOffsets.map(function (_ref4) {
237
+ var node = _ref4.node,
238
+ offset = _ref4.offset;
239
+ return filmstripItem(node, offset);
240
+ });
241
+ }, [mediaNodesWithOffsets, filmstripItem]);
242
+ (0, _react.useEffect)(function () {
243
+ setViewMediaClientConfig(mediaClientConfig);
244
+ }, [mediaClientConfig]);
245
+ (0, _react.useEffect)(function () {
246
+ mediaNodesWithOffsets.forEach(function (_ref5) {
247
+ var node = _ref5.node,
248
+ offset = _ref5.offset;
249
+ var mediaNodeUpdater = (0, _mediaNodeUpdater.createMediaNodeUpdater)({
250
+ view: view,
251
+ mediaProvider: mediaProvider,
252
+ contextIdentifierProvider: contextIdentifierProvider,
253
+ node: node,
254
+ isMediaSingle: false
255
+ });
256
+ var updateAttrs = isCopyPasteEnabled || isCopyPasteEnabled === undefined;
257
+ runMediaNodeUpdate({
258
+ mediaNodeUpdater: mediaNodeUpdater,
259
+ node: node,
260
+ updateAttrs: updateAttrs,
261
+ getPos: function getPos() {
262
+ var pos = _getPos();
263
+ if (typeof pos !== 'number') {
264
+ return undefined;
265
+ }
266
+ return pos + offset + 1;
267
+ }
268
+ });
269
+ });
270
+ }, [view, contextIdentifierProvider, _getPos, mediaProvider, mediaNodesWithOffsets, isCopyPasteEnabled]);
271
+ (0, _react.useEffect)(function () {
272
+ if (!handleMediaGroupUpdate || !previousMediaNodesWithOffsets) {
273
+ return;
274
+ }
275
+ var old = previousMediaNodesWithOffsets.map(function (_ref6) {
276
+ var node = _ref6.node;
277
+ return node;
278
+ });
279
+ var next = mediaNodesWithOffsets.map(function (_ref7) {
280
+ var node = _ref7.node;
281
+ return node;
282
+ });
283
+ handleMediaGroupUpdate(old, next);
284
+ return function () {
285
+ handleMediaGroupUpdate(next, []);
286
+ };
287
+ }, [handleMediaGroupUpdate, mediaNodesWithOffsets, previousMediaNodesWithOffsets]);
288
+ return /*#__PURE__*/_react.default.createElement(_mediaFilmstrip.Filmstrip, {
289
+ items: items,
290
+ mediaClientConfig: viewMediaClientConfig,
291
+ featureFlags: featureFlags,
292
+ shouldOpenMediaViewer: editorViewMode
293
+ });
294
+ }));
295
+ MediaGroupNext.displayName = 'MediaGroup';
@@ -779,8 +779,6 @@ var hasPrivateAttrsChanged = function hasPrivateAttrsChanged(currentAttrs, newAt
779
779
  return currentAttrs.__fileName !== newAttrs.__fileName || currentAttrs.__fileMimeType !== newAttrs.__fileMimeType || currentAttrs.__fileSize !== newAttrs.__fileSize || currentAttrs.__contextId !== newAttrs.__contextId;
780
780
  };
781
781
  var createMediaNodeUpdater = exports.createMediaNodeUpdater = function createMediaNodeUpdater(props) {
782
- var updaterProps = _objectSpread(_objectSpread({}, props), {}, {
783
- isMediaSingle: true
784
- });
782
+ var updaterProps = _objectSpread({}, props);
785
783
  return new MediaNodeUpdater(updaterProps);
786
784
  };
@@ -924,6 +924,24 @@ var createPlugin = exports.createPlugin = function createPlugin(_schema, options
924
924
  }
925
925
  return false;
926
926
  },
927
+ handleDoubleClickOn: function handleDoubleClickOn(view) {
928
+ var _pluginInjectionApi$e;
929
+ if (!(0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') || !(0, _platformFeatureFlags.fg)('platform_editor_media_interaction_improvements') || (pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$e = pluginInjectionApi.editorViewMode) === null || _pluginInjectionApi$e === void 0 || (_pluginInjectionApi$e = _pluginInjectionApi$e.sharedState.currentState()) === null || _pluginInjectionApi$e === void 0 ? void 0 : _pluginInjectionApi$e.mode) === 'view') {
930
+ return;
931
+ }
932
+
933
+ // Double Click support for Media Viewer Nodes
934
+ var maybeMediaNode = (0, _mediaCommon2.getMediaFromSupportedMediaNodesFromSelection)(view.state);
935
+ if (maybeMediaNode) {
936
+ // If media type is video, do not open media viewer
937
+ if ((0, _mediaSingle2.isVideo)(maybeMediaNode.attrs.__fileMimeType)) {
938
+ return false;
939
+ }
940
+ pluginInjectionApi === null || pluginInjectionApi === void 0 || pluginInjectionApi.core.actions.execute(pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.media.commands.showMediaViewer(maybeMediaNode.attrs));
941
+ return true;
942
+ }
943
+ return false;
944
+ },
927
945
  handleDOMEvents: {
928
946
  keydown: function keydown(view, event) {
929
947
  var selection = view.state.selection;
@@ -128,6 +128,7 @@ var generateMediaCardFloatingToolbar = function generateMediaCardFloatingToolbar
128
128
  type: 'separator'
129
129
  }, (0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') ? {
130
130
  id: 'editor.media.viewer',
131
+ testId: 'file-preview-toolbar-button',
131
132
  type: 'button',
132
133
  icon: _maximize.default,
133
134
  iconFallback: _filePreview.default,
@@ -138,7 +139,8 @@ var generateMediaCardFloatingToolbar = function generateMediaCardFloatingToolbar
138
139
  mediaPluginState: mediaPluginState,
139
140
  api: pluginInjectionApi
140
141
  })) !== null && _handleShowMediaViewe !== void 0 ? _handleShowMediaViewe : false;
141
- }
142
+ },
143
+ supportsViewMode: true
142
144
  } : generateFilePreviewItem(mediaPluginState, intl), {
143
145
  type: 'separator'
144
146
  }, {
@@ -480,6 +482,7 @@ var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToo
480
482
  if (!(0, _mediaSingle2.isVideo)(mediaNode === null || mediaNode === void 0 || (_mediaNode$attrs = mediaNode.attrs) === null || _mediaNode$attrs === void 0 ? void 0 : _mediaNode$attrs.__fileMimeType)) {
481
483
  toolbarButtons.push((0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') ? {
482
484
  id: 'editor.media.viewer',
485
+ testId: 'file-preview-toolbar-button',
483
486
  type: 'button',
484
487
  icon: _maximize.default,
485
488
  iconFallback: _filePreview.default,
@@ -490,7 +493,8 @@ var generateMediaSingleFloatingToolbar = function generateMediaSingleFloatingToo
490
493
  api: pluginInjectionApi,
491
494
  mediaPluginState: pluginState
492
495
  })) !== null && _handleShowMediaViewe2 !== void 0 ? _handleShowMediaViewe2 : false;
493
- }
496
+ },
497
+ supportsViewMode: true
494
498
  } : generateFilePreviewItem(pluginState, intl), {
495
499
  type: 'separator',
496
500
  supportsViewMode: true
@@ -27,7 +27,6 @@ var _currentMediaNode = require("../utils/current-media-node");
27
27
  var _isType = require("../utils/is-type");
28
28
  var _altText = require("./alt-text");
29
29
  var _commands = require("./commands");
30
- var _filePreviewItem = require("./filePreviewItem");
31
30
  var _imageBorder = require("./imageBorder");
32
31
  var _linkingToolbarAppearance = require("./linking-toolbar-appearance");
33
32
  var _utils = require("./utils");
@@ -73,17 +72,20 @@ var generateMediaInlineFloatingToolbar = exports.generateMediaInlineFloatingTool
73
72
  className: 'thumbnail-appearance' // a11y. uses to force focus on item
74
73
  }, {
75
74
  type: 'separator'
76
- }, {
77
- type: 'custom',
78
- fallback: [],
79
- render: function render() {
80
- return /*#__PURE__*/_react.default.createElement(_filePreviewItem.FilePreviewItem, {
81
- key: "editor.media.card.preview",
75
+ }, (0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') ? {
76
+ id: 'editor.media.viewer',
77
+ testId: 'file-preview-toolbar-button',
78
+ type: 'button',
79
+ icon: _filePreview.default,
80
+ title: intl.formatMessage(_mediaUi.messages.preview),
81
+ onClick: function onClick() {
82
+ var _handleShowMediaViewe;
83
+ return (_handleShowMediaViewe = (0, _index.handleShowMediaViewer)({
82
84
  mediaPluginState: mediaPluginState,
83
- intl: intl
84
- });
85
+ api: pluginInjectionApi
86
+ })) !== null && _handleShowMediaViewe !== void 0 ? _handleShowMediaViewe : false;
85
87
  }
86
- }, {
88
+ } : (0, _index.generateFilePreviewItem)(mediaPluginState, intl), {
87
89
  type: 'separator'
88
90
  }, {
89
91
  id: 'editor.media.card.download',
@@ -243,16 +245,18 @@ var getMediaInlineImageToolbar = function getMediaInlineImageToolbar(state, intl
243
245
  if (options.allowImagePreview) {
244
246
  inlineImageItems.push((0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') ? {
245
247
  id: 'editor.media.viewer',
248
+ testId: 'file-preview-toolbar-button',
246
249
  type: 'button',
247
250
  icon: _filePreview.default,
248
251
  title: intl.formatMessage(_mediaUi.messages.preview),
249
252
  onClick: function onClick() {
250
- var _handleShowMediaViewe;
251
- return (_handleShowMediaViewe = (0, _index.handleShowMediaViewer)({
253
+ var _handleShowMediaViewe2;
254
+ return (_handleShowMediaViewe2 = (0, _index.handleShowMediaViewer)({
252
255
  mediaPluginState: mediaPluginState,
253
256
  api: pluginInjectionApi
254
- })) !== null && _handleShowMediaViewe !== void 0 ? _handleShowMediaViewe : false;
255
- }
257
+ })) !== null && _handleShowMediaViewe2 !== void 0 ? _handleShowMediaViewe2 : false;
258
+ },
259
+ supportsViewMode: true
256
260
  } : (0, _index.generateFilePreviewItem)(mediaPluginState, intl), {
257
261
  type: 'separator',
258
262
  supportsViewMode: true
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.splitMediaGroup = exports.removeMediaNode = exports.posOfPrecedingMediaGroup = exports.posOfParentMediaGroup = exports.posOfMediaGroupNearby = exports.isSelectionNonMediaBlockNode = exports.isSelectionMediaSingleNode = exports.isMediaSingleOrInlineNodeSelected = exports.isMediaBlobUrlFromAttrs = exports.isInsidePotentialEmptyParagraph = exports.getMediaSingleOrInlineNodeFromSelection = exports.getMediaNodeFromSelection = exports.copyOptionalAttrsFromMediaState = void 0;
6
+ exports.splitMediaGroup = exports.removeMediaNode = exports.posOfPrecedingMediaGroup = exports.posOfParentMediaGroup = exports.posOfMediaGroupNearby = exports.isSelectionNonMediaBlockNode = exports.isSelectionMediaSingleNode = exports.isMediaSingleOrInlineNodeSelected = exports.isMediaBlobUrlFromAttrs = exports.isInsidePotentialEmptyParagraph = exports.getMediaSingleOrInlineNodeFromSelection = exports.getMediaNodeFromSelection = exports.getMediaFromSupportedMediaNodesFromSelection = exports.copyOptionalAttrsFromMediaState = void 0;
7
7
  var _selection = require("@atlaskit/editor-common/selection");
8
8
  var _utils = require("@atlaskit/editor-common/utils");
9
9
  var _commands = require("@atlaskit/editor-prosemirror/commands");
@@ -204,4 +204,18 @@ var getMediaSingleOrInlineNodeFromSelection = exports.getMediaSingleOrInlineNode
204
204
  allowInlineImages = _getMediaPluginState2.allowInlineImages;
205
205
  var mediaNode = getMediaNodeFromSelection(state) || allowInlineImages && getMediaInlineNodeFromSelection(state);
206
206
  return mediaNode || null;
207
+ };
208
+ var getMediaFromSupportedMediaNodesFromSelection = exports.getMediaFromSupportedMediaNodesFromSelection = function getMediaFromSupportedMediaNodesFromSelection(state) {
209
+ var _ref4 = state.selection,
210
+ node = _ref4.node;
211
+ switch (node.type) {
212
+ case node.type.schema.nodes.media:
213
+ case node.type.schema.nodes.mediaInline:
214
+ return node;
215
+ case node.type.schema.nodes.mediaSingle:
216
+ case node.type.schema.nodes.mediaGroup:
217
+ return node.firstChild;
218
+ default:
219
+ return null;
220
+ }
207
221
  };
@@ -9,8 +9,10 @@ import { isNodeSelectedOrInRange, SelectedState, setNodeSelection } from '@atlas
9
9
  import EditorCloseIcon from '@atlaskit/icon/glyph/editor/close';
10
10
  import { getMediaFeatureFlag } from '@atlaskit/media-common';
11
11
  import { Filmstrip } from '@atlaskit/media-filmstrip';
12
+ import { fg } from '@atlaskit/platform-feature-flags';
12
13
  import { useMediaProvider } from '../hooks/useMediaProvider';
13
14
  import { stateKey as mediaStateKey } from '../pm-plugins/plugin-key';
15
+ import { MediaGroupNext } from './mediaGroupNext';
14
16
  import { MediaNodeUpdater } from './mediaNodeUpdater';
15
17
  const isMediaGroupSelectedFromProps = props => {
16
18
  /**
@@ -290,6 +292,23 @@ class MediaGroupNodeView extends ReactNodeView {
290
292
  if (!mediaProvider) {
291
293
  return null;
292
294
  }
295
+ if (fg('platform_editor_react18_phase2__media_single')) {
296
+ return /*#__PURE__*/React.createElement(MediaGroupNext, {
297
+ node: this.node,
298
+ getPos: getPos,
299
+ view: this.view,
300
+ forwardRef: forwardRef,
301
+ disabled: (editorDisabledPlugin || {}).editorDisabled,
302
+ allowLazyLoading: mediaOptions.allowLazyLoading,
303
+ mediaProvider: mediaProvider,
304
+ contextIdentifierProvider: contextIdentifierProvider,
305
+ isCopyPasteEnabled: mediaOptions.isCopyPasteEnabled,
306
+ anchorPos: this.view.state.selection.$anchor.pos,
307
+ headPos: this.view.state.selection.$head.pos,
308
+ mediaOptions: mediaOptions,
309
+ editorViewMode: (editorViewModePlugin === null || editorViewModePlugin === void 0 ? void 0 : editorViewModePlugin.mode) === 'view'
310
+ });
311
+ }
293
312
  return /*#__PURE__*/React.createElement(IntlMediaGroup, {
294
313
  node: this.node,
295
314
  getPos: getPos,