@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 +24 -0
- package/dist/cjs/nodeviews/mediaGroup.js +19 -0
- package/dist/cjs/nodeviews/mediaGroupNext.js +295 -0
- package/dist/cjs/nodeviews/mediaNodeUpdater.js +1 -3
- package/dist/cjs/plugin.js +22 -4
- package/dist/cjs/pm-plugins/main.js +2 -1
- package/dist/cjs/ui/MediaViewer/PortalWrapper.js +4 -2
- package/dist/cjs/utils/media-common.js +51 -1
- package/dist/es2019/nodeviews/mediaGroup.js +19 -0
- package/dist/es2019/nodeviews/mediaGroupNext.js +249 -0
- package/dist/es2019/nodeviews/mediaNodeUpdater.js +1 -2
- package/dist/es2019/plugin.js +19 -4
- package/dist/es2019/pm-plugins/main.js +2 -1
- package/dist/es2019/ui/MediaViewer/PortalWrapper.js +3 -2
- package/dist/es2019/utils/media-common.js +50 -1
- package/dist/esm/nodeviews/mediaGroup.js +19 -0
- package/dist/esm/nodeviews/mediaGroupNext.js +285 -0
- package/dist/esm/nodeviews/mediaNodeUpdater.js +1 -3
- package/dist/esm/plugin.js +19 -4
- package/dist/esm/pm-plugins/main.js +2 -1
- package/dist/esm/ui/MediaViewer/PortalWrapper.js +4 -2
- package/dist/esm/utils/media-common.js +50 -1
- package/dist/types/nodeviews/mediaGroupNext.d.ts +37 -0
- package/dist/types/ui/MediaViewer/PortalWrapper.d.ts +3 -2
- package/dist/types/utils/media-common.d.ts +5 -0
- package/dist/types-ts4.5/nodeviews/mediaGroupNext.d.ts +37 -0
- package/dist/types-ts4.5/ui/MediaViewer/PortalWrapper.d.ts +3 -2
- package/dist/types-ts4.5/utils/media-common.d.ts +5 -0
- package/package.json +7 -7
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(
|
|
783
|
-
isMediaSingle: true
|
|
784
|
-
});
|
|
782
|
+
var updaterProps = _objectSpread({}, props);
|
|
785
783
|
return new MediaNodeUpdater(updaterProps);
|
|
786
784
|
};
|
package/dist/cjs/plugin.js
CHANGED
|
@@ -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 =
|
|
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 =
|
|
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,
|