@atlaskit/editor-plugin-media 1.36.5 → 1.37.1

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,29 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 1.37.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#155195](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/155195)
8
+ [`086e77aecf6e5`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/086e77aecf6e5) -
9
+ [ux] ED-25202 Support Preview in media files
10
+ - Updated dependencies
11
+
12
+ ## 1.37.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [#154775](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154775)
17
+ [`1b353693c3119`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/1b353693c3119) -
18
+ [ED-25348] Refactor Media Group React Class component into Function Component
19
+
20
+ ### Patch Changes
21
+
22
+ - [#154186](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/154186)
23
+ [`5c316170d29dd`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/5c316170d29dd) -
24
+ Bump @atlaskit/adf-schema to 42.3.1
25
+ - Updated dependencies
26
+
3
27
  ## 1.36.5
4
28
 
5
29
  ### 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
  };
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.mediaPlugin = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
+ var _react = _interopRequireWildcard(require("react"));
9
10
  var _analytics = require("@atlaskit/editor-common/analytics");
10
11
  var _hooks = require("@atlaskit/editor-common/hooks");
11
12
  var _messages = require("@atlaskit/editor-common/messages");
@@ -35,7 +36,10 @@ var _toolbar = require("./toolbar");
35
36
  var _MediaPicker = require("./ui/MediaPicker");
36
37
  var _PortalWrapper = require("./ui/MediaViewer/PortalWrapper");
37
38
  var _ToolbarMedia = _interopRequireDefault(require("./ui/ToolbarMedia"));
39
+ var _mediaCommon2 = require("./utils/media-common");
38
40
  var _mediaSingle2 = require("./utils/media-single");
41
+ 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); }
42
+ 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; }
39
43
  var MediaPickerFunctionalComponent = function MediaPickerFunctionalComponent(_ref) {
40
44
  var api = _ref.api,
41
45
  editorDomElement = _ref.editorDomElement,
@@ -53,10 +57,22 @@ var MediaPickerFunctionalComponent = function MediaPickerFunctionalComponent(_re
53
57
  });
54
58
  };
55
59
  var MediaViewerFunctionalComponent = function MediaViewerFunctionalComponent(_ref2) {
56
- var api = _ref2.api;
60
+ var api = _ref2.api,
61
+ editorView = _ref2.editorView;
57
62
  var _useSharedPluginState2 = (0, _hooks.useSharedPluginState)(api, ['media']),
58
63
  mediaState = _useSharedPluginState2.mediaState;
59
64
 
65
+ // Only traverse document once when media viewer is visible, media viewer items will not update
66
+ // when document changes are made while media viewer is open
67
+
68
+ var mediaItems = (0, _react.useMemo)(function () {
69
+ if (mediaState !== null && mediaState !== void 0 && mediaState.isMediaViewerVisible && (0, _platformFeatureFlags.fg)('platform_editor_media_interaction_improvements')) {
70
+ var mediaNodes = (0, _mediaCommon2.extractMediaNodes)(editorView.state.doc);
71
+ return (0, _mediaCommon2.createMediaIdentifierArray)(mediaNodes);
72
+ }
73
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- only update mediaItems once when media viewer is visible
74
+ }, [mediaState === null || mediaState === void 0 ? void 0 : mediaState.isMediaViewerVisible]);
75
+
60
76
  // Viewer does not have required attributes to render the media viewer
61
77
  if (!(mediaState !== null && mediaState !== void 0 && mediaState.isMediaViewerVisible) || !(mediaState !== null && mediaState !== void 0 && mediaState.mediaViewerSelectedMedia) || !(mediaState !== null && mediaState !== void 0 && mediaState.mediaClientConfig)) {
62
78
  return null;
@@ -68,7 +84,8 @@ var MediaViewerFunctionalComponent = function MediaViewerFunctionalComponent(_re
68
84
  return /*#__PURE__*/_react.default.createElement(_PortalWrapper.RenderMediaViewer, {
69
85
  mediaClientConfig: mediaState === null || mediaState === void 0 ? void 0 : mediaState.mediaClientConfig,
70
86
  onClose: handleOnClose,
71
- selectedNodeAttrs: mediaState.mediaViewerSelectedMedia
87
+ selectedNodeAttrs: mediaState.mediaViewerSelectedMedia,
88
+ items: (0, _platformFeatureFlags.fg)('platform_editor_media_interaction_improvements') ? mediaItems : undefined
72
89
  });
73
90
  };
74
91
  var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
@@ -259,7 +276,8 @@ var mediaPlugin = exports.mediaPlugin = function mediaPlugin(_ref3) {
259
276
  var editorView = _ref12.editorView,
260
277
  appearance = _ref12.appearance;
261
278
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _platformFeatureFlags.fg)('platform_editor_media_previewer_bugfix') && /*#__PURE__*/_react.default.createElement(MediaViewerFunctionalComponent, {
262
- api: api
279
+ api: api,
280
+ editorView: editorView
263
281
  }), /*#__PURE__*/_react.default.createElement(MediaPickerFunctionalComponent, {
264
282
  editorDomElement: editorView.dom,
265
283
  appearance: appearance,
@@ -786,11 +786,12 @@ var createPlugin = exports.createPlugin = function createPlugin(_schema, options
786
786
  switch (meta === null || meta === void 0 ? void 0 : meta.type) {
787
787
  case _actions.ACTIONS.SHOW_MEDIA_VIEWER:
788
788
  pluginState.mediaViewerSelectedMedia = meta.mediaViewerSelectedMedia;
789
- pluginState.isMediaViewerVisible = true;
789
+ pluginState.isMediaViewerVisible = meta.isMediaViewerVisible;
790
790
  nextPluginState = nextPluginState.clone();
791
791
  break;
792
792
  case _actions.ACTIONS.HIDE_MEDIA_VIEWER:
793
793
  pluginState.mediaViewerSelectedMedia = undefined;
794
+ pluginState.isMediaViewerVisible = meta.isMediaViewerVisible;
794
795
  nextPluginState = nextPluginState.clone();
795
796
  break;
796
797
  }
@@ -30,13 +30,15 @@ var getIdentifier = function getIdentifier(attrs) {
30
30
  var RenderMediaViewer = exports.RenderMediaViewer = function RenderMediaViewer(_ref) {
31
31
  var mediaClientConfig = _ref.mediaClientConfig,
32
32
  onClose = _ref.onClose,
33
- selectedNodeAttrs = _ref.selectedNodeAttrs;
33
+ selectedNodeAttrs = _ref.selectedNodeAttrs,
34
+ _ref$items = _ref.items,
35
+ items = _ref$items === void 0 ? [] : _ref$items;
34
36
  if ((0, _experiments.editorExperiment)('add-media-from-url', true)) {
35
37
  var _identifier = getIdentifier(selectedNodeAttrs);
36
38
  var collectionName = (0, _utils.isExternalMedia)(selectedNodeAttrs) ? '' : selectedNodeAttrs.collection;
37
39
  return /*#__PURE__*/_reactDom.default.createPortal( /*#__PURE__*/_react.default.createElement(_mediaViewer.MediaViewer, {
38
40
  collectionName: collectionName,
39
- items: [],
41
+ items: items,
40
42
  mediaClientConfig: mediaClientConfig,
41
43
  selectedItem: _identifier,
42
44
  onClose: onClose
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
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
+ 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.getIdentifier = exports.extractMediaNodes = exports.createMediaIdentifierArray = exports.copyOptionalAttrsFromMediaState = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
7
9
  var _selection = require("@atlaskit/editor-common/selection");
8
10
  var _utils = require("@atlaskit/editor-common/utils");
9
11
  var _commands = require("@atlaskit/editor-prosemirror/commands");
@@ -11,6 +13,8 @@ var _state = require("@atlaskit/editor-prosemirror/state");
11
13
  var _utils2 = require("@atlaskit/editor-prosemirror/utils");
12
14
  var _mediaClient = require("@atlaskit/media-client");
13
15
  var _main = require("../pm-plugins/main");
16
+ var _utils3 = require("../toolbar/utils");
17
+ var _mediaSingle = require("./media-single");
14
18
  var isTemporary = function isTemporary(id) {
15
19
  return id.indexOf('temporary:') === 0;
16
20
  };
@@ -218,4 +222,50 @@ var getMediaFromSupportedMediaNodesFromSelection = exports.getMediaFromSupported
218
222
  default:
219
223
  return null;
220
224
  }
225
+ };
226
+ var getIdentifier = exports.getIdentifier = function getIdentifier(attrs) {
227
+ if ((0, _utils3.isExternalMedia)(attrs)) {
228
+ return {
229
+ mediaItemType: 'external-image',
230
+ dataURI: attrs.url
231
+ };
232
+ } else {
233
+ var id = attrs.id,
234
+ _attrs$collection = attrs.collection,
235
+ collection = _attrs$collection === void 0 ? '' : _attrs$collection;
236
+ return {
237
+ id: id,
238
+ mediaItemType: 'file',
239
+ collectionName: collection
240
+ };
241
+ }
242
+ };
243
+ var extractMediaNodes = exports.extractMediaNodes = function extractMediaNodes(doc) {
244
+ var mediaNodes = [];
245
+ doc.descendants(function (node) {
246
+ if (node.type.name === 'media' || node.type.name === 'mediaInline') {
247
+ mediaNodes.push(node);
248
+ }
249
+ });
250
+ return mediaNodes;
251
+ };
252
+ var createMediaIdentifierArray = exports.createMediaIdentifierArray = function createMediaIdentifierArray(mediaNodes) {
253
+ var mediaIdentifierMap = new Map();
254
+ mediaNodes.forEach(function (item) {
255
+ var attrs = item.attrs;
256
+ if (!attrs) {
257
+ return;
258
+ }
259
+ if ((0, _mediaSingle.isVideo)(attrs.__fileMimeType)) {
260
+ return;
261
+ }
262
+ var identifier = getIdentifier(attrs);
263
+
264
+ // Add only if not already processed
265
+ var idKey = (0, _mediaClient.isExternalImageIdentifier)(identifier) ? identifier.dataURI : identifier.id;
266
+ if (!mediaIdentifierMap.has(idKey)) {
267
+ mediaIdentifierMap.set(idKey, identifier);
268
+ }
269
+ });
270
+ return (0, _toConsumableArray2.default)(mediaIdentifierMap.values());
221
271
  };
@@ -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,