@atlaskit/editor-common 124.0.0 → 125.1.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 +33 -0
- package/dist/cjs/element-browser/components/ElementBrowserLoader.js +31 -8
- package/dist/cjs/extensibility/Extension.js +4 -2
- package/dist/cjs/extensibility/ExtensionComponent.js +3 -1
- package/dist/cjs/extensibility/ExtensionNodeWrapper.js +3 -0
- package/dist/cjs/extensibility/GeneratedContentReveal.js +18 -20
- package/dist/cjs/extensibility/extensionNodeView.js +61 -24
- package/dist/cjs/extensions/extension-handlers.js +96 -17
- package/dist/cjs/floating-toolbar/DropdownMenuExtensionItems.js +25 -4
- package/dist/cjs/icons/index.js +33 -10
- package/dist/cjs/monitoring/error.js +1 -1
- package/dist/cjs/quick-insert/assets/index.js +888 -257
- package/dist/cjs/table/getStickyHeaderHeight.js +9 -2
- package/dist/cjs/ui/DropList/index.js +1 -1
- package/dist/cjs/ui/Mention/mention-with-profilecard.js +30 -11
- package/dist/es2019/element-browser/components/ElementBrowserLoader.js +16 -2
- package/dist/es2019/extensibility/Extension.js +4 -2
- package/dist/es2019/extensibility/ExtensionComponent.js +3 -1
- package/dist/es2019/extensibility/ExtensionNodeWrapper.js +2 -0
- package/dist/es2019/extensibility/GeneratedContentReveal.js +11 -16
- package/dist/es2019/extensibility/extensionNodeView.js +51 -23
- package/dist/es2019/extensions/extension-handlers.js +70 -15
- package/dist/es2019/floating-toolbar/DropdownMenuExtensionItems.js +16 -2
- package/dist/es2019/icons/index.js +17 -3
- package/dist/es2019/monitoring/error.js +1 -1
- package/dist/es2019/quick-insert/assets/index.js +386 -66
- package/dist/es2019/table/getStickyHeaderHeight.js +10 -2
- package/dist/es2019/ui/DropList/index.js +1 -1
- package/dist/es2019/ui/Mention/mention-with-profilecard.js +15 -4
- package/dist/esm/element-browser/components/ElementBrowserLoader.js +28 -6
- package/dist/esm/extensibility/Extension.js +4 -2
- package/dist/esm/extensibility/ExtensionComponent.js +3 -1
- package/dist/esm/extensibility/ExtensionNodeWrapper.js +3 -0
- package/dist/esm/extensibility/GeneratedContentReveal.js +18 -20
- package/dist/esm/extensibility/extensionNodeView.js +56 -23
- package/dist/esm/extensions/extension-handlers.js +97 -17
- package/dist/esm/floating-toolbar/DropdownMenuExtensionItems.js +24 -4
- package/dist/esm/icons/index.js +29 -7
- package/dist/esm/monitoring/error.js +1 -1
- package/dist/esm/quick-insert/assets/index.js +764 -194
- package/dist/esm/table/getStickyHeaderHeight.js +10 -2
- package/dist/esm/ui/DropList/index.js +1 -1
- package/dist/esm/ui/Mention/mention-with-profilecard.js +25 -8
- package/dist/types/analytics/types/ai-suggestions-events.d.ts +4 -6
- package/dist/types/extensibility/Extension.d.ts +2 -0
- package/dist/types/extensibility/ExtensionComponent.d.ts +2 -0
- package/dist/types/extensibility/ExtensionNodeWrapper.d.ts +3 -1
- package/dist/types/extensibility/GeneratedContentReveal.d.ts +3 -1
- package/dist/types/extensibility/extensionNodeView.d.ts +13 -12
- package/dist/types/icons/index.d.ts +5 -3
- package/dist/types/quick-insert/assets/index.d.ts +34 -32
- package/dist/types/table/getStickyHeaderHeight.d.ts +1 -1
- package/package.json +23 -25
- package/dist/cjs/extensibility/useNativeEmbedSettled.js +0 -56
- package/dist/es2019/extensibility/useNativeEmbedSettled.js +0 -49
- package/dist/esm/extensibility/useNativeEmbedSettled.js +0 -51
- package/dist/types/extensibility/useNativeEmbedSettled.d.ts +0 -12
|
@@ -7,6 +7,11 @@ import React from 'react';
|
|
|
7
7
|
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
8
8
|
import { css, jsx } from '@emotion/react';
|
|
9
9
|
import Loadable from 'react-loadable';
|
|
10
|
+
// oxlint-disable-next-line @atlassian/no-restricted-imports
|
|
11
|
+
import { lazy, LazySuspense } from 'react-loosely-lazy';
|
|
12
|
+
|
|
13
|
+
// oxlint-disable-next-line @atlassian/no-restricted-imports
|
|
14
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
10
15
|
import Spinner from '@atlaskit/spinner/spinner';
|
|
11
16
|
var spinnerContainer = css({
|
|
12
17
|
display: 'flex',
|
|
@@ -15,12 +20,19 @@ var spinnerContainer = css({
|
|
|
15
20
|
height: '100%',
|
|
16
21
|
width: '100%'
|
|
17
22
|
});
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
return
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
var loadElementBrowser = function loadElementBrowser() {
|
|
24
|
+
return import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(function (module) {
|
|
25
|
+
return module.default;
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
var ElementBrowserLazy = lazy(function () {
|
|
29
|
+
return import( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser').then(function (module) {
|
|
30
|
+
return module.default;
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
ElementBrowserLazy.displayName = 'lazy(ElementBrowser)';
|
|
34
|
+
var ElementBrowserLoadable = Loadable({
|
|
35
|
+
loader: loadElementBrowser,
|
|
24
36
|
loading: function loading() {
|
|
25
37
|
return jsx("div", {
|
|
26
38
|
css: spinnerContainer
|
|
@@ -30,4 +42,14 @@ var ElementBrowserLoader = Loadable({
|
|
|
30
42
|
}));
|
|
31
43
|
}
|
|
32
44
|
});
|
|
45
|
+
var ElementBrowserLoader = function ElementBrowserLoader(props) {
|
|
46
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? jsx(LazySuspense, {
|
|
47
|
+
fallback: null
|
|
48
|
+
}, jsx(ElementBrowserLazy, props)) :
|
|
49
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
50
|
+
jsx(ElementBrowserLoadable, props);
|
|
51
|
+
};
|
|
52
|
+
ElementBrowserLoader.preload = function () {
|
|
53
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? ElementBrowserLazy.preload() : ElementBrowserLoadable.preload();
|
|
54
|
+
};
|
|
33
55
|
export default ElementBrowserLoader;
|
|
@@ -33,7 +33,8 @@ export var Extension = /*#__PURE__*/function (_Component) {
|
|
|
33
33
|
macroInteractionDesignFeatureFlags = _this$props.macroInteractionDesignFeatureFlags,
|
|
34
34
|
showLivePagesBodiedMacrosRendererView = _this$props.showLivePagesBodiedMacrosRendererView,
|
|
35
35
|
showUpdatedLivePages1PBodiedExtensionUI = _this$props.showUpdatedLivePages1PBodiedExtensionUI,
|
|
36
|
-
rendererExtensionHandlers = _this$props.rendererExtensionHandlers
|
|
36
|
+
rendererExtensionHandlers = _this$props.rendererExtensionHandlers,
|
|
37
|
+
onContentReady = _this$props.onContentReady;
|
|
37
38
|
|
|
38
39
|
// Extensions are not yet using the new plugin architecture, and the use of the pluginInjectionApi
|
|
39
40
|
// is not type safe in editor-common.
|
|
@@ -59,7 +60,8 @@ export var Extension = /*#__PURE__*/function (_Component) {
|
|
|
59
60
|
showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
|
|
60
61
|
showUpdatedLivePages1PBodiedExtensionUI: showUpdatedLivePages1PBodiedExtensionUI,
|
|
61
62
|
rendererExtensionHandlers: rendererExtensionHandlers,
|
|
62
|
-
isLivePageViewMode: isLivePageViewMode
|
|
63
|
+
isLivePageViewMode: isLivePageViewMode,
|
|
64
|
+
onContentReady: onContentReady
|
|
63
65
|
});
|
|
64
66
|
});
|
|
65
67
|
_this.providerFactory = props.providerFactory || new ProviderFactory();
|
|
@@ -233,7 +233,8 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
|
|
|
233
233
|
extensionLoadingHandlers = _this$props2.extensionLoadingHandlers,
|
|
234
234
|
editorView = _this$props2.editorView,
|
|
235
235
|
showBodiedExtensionRendererView = _this$props2.showBodiedExtensionRendererView,
|
|
236
|
-
rendererExtensionHandlers = _this$props2.rendererExtensionHandlers
|
|
236
|
+
rendererExtensionHandlers = _this$props2.rendererExtensionHandlers,
|
|
237
|
+
onContentReady = _this$props2.onContentReady;
|
|
237
238
|
var _pmNode$attrs = pmNode.attrs,
|
|
238
239
|
extensionType = _pmNode$attrs.extensionType,
|
|
239
240
|
extensionKey = _pmNode$attrs.extensionKey,
|
|
@@ -288,6 +289,7 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
|
|
|
288
289
|
references: _this.props.references,
|
|
289
290
|
isSelected: isSelected,
|
|
290
291
|
loadingFallback: loadingFallback,
|
|
292
|
+
onContentReady: onContentReady,
|
|
291
293
|
showUnknownMacroPlaceholder: true
|
|
292
294
|
});
|
|
293
295
|
}
|
|
@@ -68,6 +68,8 @@ export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
|
|
|
68
68
|
macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags,
|
|
69
69
|
_ref$generatedContent = _ref.generatedContentMotion,
|
|
70
70
|
generatedContentMotion = _ref$generatedContent === void 0 ? false : _ref$generatedContent,
|
|
71
|
+
_ref$contentReady = _ref.contentReady,
|
|
72
|
+
contentReady = _ref$contentReady === void 0 ? false : _ref$contentReady,
|
|
71
73
|
intl = _ref.intl;
|
|
72
74
|
var _ref2 = macroInteractionDesignFeatureFlags || {},
|
|
73
75
|
showMacroInteractionDesignUpdates = _ref2.showMacroInteractionDesignUpdates;
|
|
@@ -75,6 +77,7 @@ export var ExtensionNodeWrapper = function ExtensionNodeWrapper(_ref) {
|
|
|
75
77
|
// Fixed for the node view's lifetime: switching would remount the subtree and reload the embed.
|
|
76
78
|
if (generatedContentMotion) {
|
|
77
79
|
return jsx(GeneratedContentReveal, {
|
|
80
|
+
contentReady: contentReady,
|
|
78
81
|
intl: intl,
|
|
79
82
|
showMacroInteractionDesignUpdates: showMacroInteractionDesignUpdates
|
|
80
83
|
}, children);
|
|
@@ -4,14 +4,13 @@ import "./GeneratedContentReveal.compiled.css";
|
|
|
4
4
|
import { ax, ix } from "@compiled/react/runtime";
|
|
5
5
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
6
6
|
import { ExtensionSSRReactContextsProvider } from './ExtensionSSRReactContextsProvider';
|
|
7
|
-
import { useNativeEmbedSettled } from './useNativeEmbedSettled';
|
|
8
7
|
|
|
9
8
|
/*
|
|
10
9
|
* Animates a native embed into the document once it has loaded.
|
|
11
10
|
*
|
|
12
11
|
* 1. `collapsed` — clipped to zero height and `inert`. The embed loads behind it, full size but
|
|
13
12
|
* unseen, with its own loading overlay hidden.
|
|
14
|
-
* 2.
|
|
13
|
+
* 2. The extension reports its content ready through `contentReady`.
|
|
15
14
|
* 3. `revealing` — the node animates open to its content height (400ms).
|
|
16
15
|
* 4. The embed fades in (200ms), delayed so it follows the opening instead of overlapping it.
|
|
17
16
|
* 5. `open` — on `animationend`, when the content first becomes visible, `inert` is dropped.
|
|
@@ -56,42 +55,41 @@ var embedContentEnteringStyles = null;
|
|
|
56
55
|
|
|
57
56
|
export var GeneratedContentReveal = function GeneratedContentReveal(_ref) {
|
|
58
57
|
var children = _ref.children,
|
|
58
|
+
contentReady = _ref.contentReady,
|
|
59
59
|
intl = _ref.intl,
|
|
60
60
|
showMacroInteractionDesignUpdates = _ref.showMacroInteractionDesignUpdates;
|
|
61
|
-
// Held in state so the
|
|
61
|
+
// Held in state so the effect below runs once the span exists.
|
|
62
62
|
var _useState = useState(null),
|
|
63
63
|
_useState2 = _slicedToArray(_useState, 2),
|
|
64
64
|
wrapperElement = _useState2[0],
|
|
65
65
|
setWrapperElement = _useState2[1];
|
|
66
|
-
var _useState3 = useState(
|
|
66
|
+
var _useState3 = useState(false),
|
|
67
67
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
68
|
-
|
|
69
|
-
|
|
68
|
+
readyTimedOut = _useState4[0],
|
|
69
|
+
setReadyTimedOut = _useState4[1];
|
|
70
|
+
var _useState5 = useState(false),
|
|
71
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
72
|
+
opened = _useState6[0],
|
|
73
|
+
setOpened = _useState6[1];
|
|
70
74
|
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
var startRevealing = useCallback(function () {
|
|
74
|
-
setState(function (current) {
|
|
75
|
-
return current === 'collapsed' ? 'revealing' : current;
|
|
76
|
-
});
|
|
77
|
-
}, []);
|
|
78
|
-
|
|
79
|
-
// Step 2 → 3.
|
|
80
|
-
useNativeEmbedSettled(wrapperElement, startRevealing);
|
|
75
|
+
// Derived, so the two ways a node opens need no ordering between them.
|
|
76
|
+
var state = opened ? 'open' : contentReady || readyTimedOut ? 'revealing' : 'collapsed';
|
|
81
77
|
|
|
82
78
|
// One timer, set on mount, so the deadline never moves.
|
|
83
79
|
useEffect(function () {
|
|
84
|
-
var timer = setTimeout(
|
|
80
|
+
var timer = setTimeout(function () {
|
|
81
|
+
return setReadyTimedOut(true);
|
|
82
|
+
}, READY_TIMEOUT_MS);
|
|
85
83
|
return function () {
|
|
86
84
|
return clearTimeout(timer);
|
|
87
85
|
};
|
|
88
|
-
}, [
|
|
86
|
+
}, []);
|
|
89
87
|
useEffect(function () {
|
|
90
88
|
if (state !== 'revealing') {
|
|
91
89
|
return;
|
|
92
90
|
}
|
|
93
91
|
var timer = setTimeout(function () {
|
|
94
|
-
return
|
|
92
|
+
return setOpened(true);
|
|
95
93
|
}, REVEAL_TIMEOUT_MS);
|
|
96
94
|
return function () {
|
|
97
95
|
return clearTimeout(timer);
|
|
@@ -106,7 +104,7 @@ export var GeneratedContentReveal = function GeneratedContentReveal(_ref) {
|
|
|
106
104
|
var onAnimationEnd = useCallback(function (event) {
|
|
107
105
|
// The extension's own content animates too, and those events bubble.
|
|
108
106
|
if (event.target === event.currentTarget) {
|
|
109
|
-
|
|
107
|
+
setOpened(true);
|
|
110
108
|
}
|
|
111
109
|
}, []);
|
|
112
110
|
return /*#__PURE__*/React.createElement(ExtensionSSRReactContextsProvider, {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
1
2
|
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
2
3
|
import _createClass from "@babel/runtime/helpers/createClass";
|
|
3
4
|
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
@@ -8,7 +9,7 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
|
8
9
|
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
9
10
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
10
11
|
function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
|
|
11
|
-
import React from 'react';
|
|
12
|
+
import React, { useCallback, useState } from 'react';
|
|
12
13
|
import { fg } from '@atlaskit/platform-feature-flags/fg';
|
|
13
14
|
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
|
|
14
15
|
import { isSSR } from '../core-utils';
|
|
@@ -302,22 +303,14 @@ export var ExtensionNode = /*#__PURE__*/function (_ReactNodeView) {
|
|
|
302
303
|
}, {
|
|
303
304
|
key: "render",
|
|
304
305
|
value: function render(props, forwardRef) {
|
|
305
|
-
var _props$extensionNodeV, _props$extensionNodeV2;
|
|
306
306
|
// While sitting on SSR DOM, skip the React portal — see {@link didReuseSsrDom}.
|
|
307
307
|
if (this.didReuseSsrDom) {
|
|
308
308
|
return null;
|
|
309
309
|
}
|
|
310
|
-
return /*#__PURE__*/React.createElement(
|
|
311
|
-
intl: props.intl,
|
|
312
|
-
nodeType: this.node.type.name,
|
|
313
|
-
macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags
|
|
314
|
-
// Only native embeds animate in; the reveal waits on the embed's own loading state.
|
|
315
|
-
,
|
|
316
|
-
generatedContentMotion: !!((_props$extensionNodeV = props.extensionNodeViewOptions) !== null && _props$extensionNodeV !== void 0 && _props$extensionNodeV.allowAIGeneratedContentMotion) && isNativeEmbedExtension(this.node)
|
|
317
|
-
}, /*#__PURE__*/React.createElement(Extension, {
|
|
310
|
+
return /*#__PURE__*/React.createElement(ExtensionNodeRender, {
|
|
318
311
|
editorView: this.view,
|
|
319
|
-
|
|
320
|
-
|
|
312
|
+
eventDispatcher: this.eventDispatcher,
|
|
313
|
+
forwardRef: forwardRef
|
|
321
314
|
// The getPos arg is always a function when used with nodes
|
|
322
315
|
// the version of the types we use has a union with the type
|
|
323
316
|
// for marks.
|
|
@@ -326,20 +319,60 @@ export var ExtensionNode = /*#__PURE__*/function (_ReactNodeView) {
|
|
|
326
319
|
// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/57384
|
|
327
320
|
,
|
|
328
321
|
getPos: this.getPos,
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
extensionLoadingHandlers: props.extensionLoadingHandlers,
|
|
333
|
-
editorAppearance: (_props$extensionNodeV2 = props.extensionNodeViewOptions) === null || _props$extensionNodeV2 === void 0 ? void 0 : _props$extensionNodeV2.appearance,
|
|
334
|
-
pluginInjectionApi: props.pluginInjectionApi,
|
|
335
|
-
macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags,
|
|
336
|
-
showLivePagesBodiedMacrosRendererView: props.showLivePagesBodiedMacrosRendererView,
|
|
337
|
-
showUpdatedLivePages1PBodiedExtensionUI: props.showUpdatedLivePages1PBodiedExtensionUI,
|
|
338
|
-
rendererExtensionHandlers: props.rendererExtensionHandlers
|
|
339
|
-
}));
|
|
322
|
+
node: this.node,
|
|
323
|
+
renderProps: props
|
|
324
|
+
});
|
|
340
325
|
}
|
|
341
326
|
}]);
|
|
342
327
|
}(ReactNodeView);
|
|
328
|
+
/**
|
|
329
|
+
* Wraps the extension in its node wrapper. A component rather than part of the node view's `render`,
|
|
330
|
+
* so `contentReady` can be React state: the extension reports its content ready from inside the
|
|
331
|
+
* wrapper, and the wrapper animates the node in once it has.
|
|
332
|
+
*/
|
|
333
|
+
function ExtensionNodeRender(_ref2) {
|
|
334
|
+
var _renderProps$extensio, _renderProps$extensio2;
|
|
335
|
+
var editorView = _ref2.editorView,
|
|
336
|
+
eventDispatcher = _ref2.eventDispatcher,
|
|
337
|
+
forwardRef = _ref2.forwardRef,
|
|
338
|
+
getPos = _ref2.getPos,
|
|
339
|
+
node = _ref2.node,
|
|
340
|
+
renderProps = _ref2.renderProps;
|
|
341
|
+
var _useState = useState(false),
|
|
342
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
343
|
+
contentReady = _useState2[0],
|
|
344
|
+
setContentReady = _useState2[1];
|
|
345
|
+
var onContentReady = useCallback(function () {
|
|
346
|
+
return setContentReady(true);
|
|
347
|
+
}, []);
|
|
348
|
+
|
|
349
|
+
// Only native embeds animate in; every other extension type renders as it does without the
|
|
350
|
+
// option, so nothing waits on a signal it does not send.
|
|
351
|
+
var generatedContentMotion = !!((_renderProps$extensio = renderProps.extensionNodeViewOptions) !== null && _renderProps$extensio !== void 0 && _renderProps$extensio.allowAIGeneratedContentMotion) && isNativeEmbedExtension(node);
|
|
352
|
+
return /*#__PURE__*/React.createElement(ExtensionNodeWrapper, {
|
|
353
|
+
intl: renderProps.intl,
|
|
354
|
+
nodeType: node.type.name,
|
|
355
|
+
macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
|
|
356
|
+
generatedContentMotion: generatedContentMotion,
|
|
357
|
+
contentReady: contentReady
|
|
358
|
+
}, /*#__PURE__*/React.createElement(Extension, {
|
|
359
|
+
editorView: editorView,
|
|
360
|
+
node: node,
|
|
361
|
+
eventDispatcher: eventDispatcher,
|
|
362
|
+
getPos: getPos,
|
|
363
|
+
providerFactory: renderProps.providerFactory,
|
|
364
|
+
handleContentDOMRef: forwardRef,
|
|
365
|
+
extensionHandlers: renderProps.extensionHandlers,
|
|
366
|
+
extensionLoadingHandlers: renderProps.extensionLoadingHandlers,
|
|
367
|
+
editorAppearance: (_renderProps$extensio2 = renderProps.extensionNodeViewOptions) === null || _renderProps$extensio2 === void 0 ? void 0 : _renderProps$extensio2.appearance,
|
|
368
|
+
pluginInjectionApi: renderProps.pluginInjectionApi,
|
|
369
|
+
macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
|
|
370
|
+
showLivePagesBodiedMacrosRendererView: renderProps.showLivePagesBodiedMacrosRendererView,
|
|
371
|
+
showUpdatedLivePages1PBodiedExtensionUI: renderProps.showUpdatedLivePages1PBodiedExtensionUI,
|
|
372
|
+
rendererExtensionHandlers: renderProps.rendererExtensionHandlers,
|
|
373
|
+
onContentReady: generatedContentMotion ? onContentReady : undefined
|
|
374
|
+
}));
|
|
375
|
+
}
|
|
343
376
|
|
|
344
377
|
// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
|
|
345
378
|
export default function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionLoadingHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers, intl) {
|
|
@@ -1,9 +1,21 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
3
|
+
import _createClass from "@babel/runtime/helpers/createClass";
|
|
4
|
+
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
5
|
+
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
6
|
+
import _inherits from "@babel/runtime/helpers/inherits";
|
|
7
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
1
8
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
2
9
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
3
10
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
|
+
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
|
|
12
|
+
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
4
13
|
import React from 'react';
|
|
5
14
|
import { useIntl } from 'react-intl';
|
|
6
15
|
import Loadable from 'react-loadable';
|
|
16
|
+
// oxlint-disable-next-line @atlassian/no-restricted-imports
|
|
17
|
+
import { lazy, LazySuspense } from 'react-loosely-lazy';
|
|
18
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
7
19
|
import { getExtensionKeyAndNodeKey, resolveImport } from './manifest-helpers';
|
|
8
20
|
import { messages } from './messages';
|
|
9
21
|
import { resolveImportSync } from './resolveImportSync';
|
|
@@ -105,6 +117,52 @@ function isUnknownConfluenceMacroWithBody(extensionNode) {
|
|
|
105
117
|
var _extensionNode$parame;
|
|
106
118
|
return extensionNode !== null && extensionNode.type === 'extension' && extensionNode.extensionType === 'com.atlassian.confluence.macro.core' && !!((_extensionNode$parame = extensionNode.parameters) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.macroParams) !== null && _extensionNode$parame !== void 0 && (_extensionNode$parame = _extensionNode$parame.__bodyContent) !== null && _extensionNode$parame !== void 0 && _extensionNode$parame.value);
|
|
107
119
|
}
|
|
120
|
+
// eslint-disable-next-line @repo/internal/react/no-class-components -- error boundaries require a class component
|
|
121
|
+
var ExtensionRendererErrorBoundary = /*#__PURE__*/function (_React$Component) {
|
|
122
|
+
function ExtensionRendererErrorBoundary() {
|
|
123
|
+
var _this;
|
|
124
|
+
_classCallCheck(this, ExtensionRendererErrorBoundary);
|
|
125
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
126
|
+
args[_key] = arguments[_key];
|
|
127
|
+
}
|
|
128
|
+
_this = _callSuper(this, ExtensionRendererErrorBoundary, [].concat(args));
|
|
129
|
+
_defineProperty(_this, "state", {});
|
|
130
|
+
return _this;
|
|
131
|
+
}
|
|
132
|
+
_inherits(ExtensionRendererErrorBoundary, _React$Component);
|
|
133
|
+
return _createClass(ExtensionRendererErrorBoundary, [{
|
|
134
|
+
key: "componentDidCatch",
|
|
135
|
+
value: function componentDidCatch(error) {
|
|
136
|
+
// eslint-disable-next-line no-console
|
|
137
|
+
console.error('Error rendering extension', error);
|
|
138
|
+
}
|
|
139
|
+
}, {
|
|
140
|
+
key: "render",
|
|
141
|
+
value: function render() {
|
|
142
|
+
return this.state.error ? renderExtensionLoadingError(this.state.error, this.props.fallbackProps) : this.props.children;
|
|
143
|
+
}
|
|
144
|
+
}], [{
|
|
145
|
+
key: "getDerivedStateFromError",
|
|
146
|
+
value: function getDerivedStateFromError(error) {
|
|
147
|
+
return {
|
|
148
|
+
error: error
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}]);
|
|
152
|
+
}(React.Component);
|
|
153
|
+
var noop = function noop() {};
|
|
154
|
+
function renderExtensionLoadingError(error, props) {
|
|
155
|
+
// Needed because the old react-loadable (older code-splitting library) error handling behaviour might be relied on by extensions.
|
|
156
|
+
// https://unpkg.com/react-loadable@5.2.2/lib/index.js
|
|
157
|
+
return /*#__PURE__*/React.createElement(ExtensionLoading, _extends({
|
|
158
|
+
isLoading: false,
|
|
159
|
+
pastDelay: true,
|
|
160
|
+
timedOut: false,
|
|
161
|
+
error: error,
|
|
162
|
+
retry: noop
|
|
163
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
164
|
+
}, props));
|
|
165
|
+
}
|
|
108
166
|
function ExtensionLoading(props) {
|
|
109
167
|
var intl = useIntl();
|
|
110
168
|
var extensionNode = props.node;
|
|
@@ -127,29 +185,51 @@ function ExtensionLoading(props) {
|
|
|
127
185
|
|
|
128
186
|
// eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
|
|
129
187
|
export function getNodeRenderer(extensionProvider, extensionType, extensionKey) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
188
|
+
var loadNodeRenderer = function loadNodeRenderer() {
|
|
189
|
+
var _renderSync, _ref;
|
|
190
|
+
var maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
|
|
191
|
+
if (maybePromise instanceof Promise) {
|
|
192
|
+
return maybePromise.then(function (node) {
|
|
193
|
+
return resolveImport(node.render());
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
var preloaded = maybePromise === null || maybePromise === void 0 || (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
|
|
197
|
+
// Only product implemented preloading will return sync result
|
|
198
|
+
// However the out-of-box won't handle this. Confluence uses a custom implementation
|
|
199
|
+
return preloaded ?
|
|
200
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
201
|
+
resolveImportSync(preloaded) : resolveImport(maybePromise.render());
|
|
202
|
+
};
|
|
203
|
+
var LazyNodeRenderer = lazy(function () {
|
|
204
|
+
return loadNodeRenderer();
|
|
205
|
+
});
|
|
206
|
+
LazyNodeRenderer.displayName = 'lazy(NodeRenderer)';
|
|
207
|
+
// Ignored via go/ees005
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
209
|
+
var LoadableNodeRenderer = Loadable({
|
|
210
|
+
loader: loadNodeRenderer,
|
|
147
211
|
// react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
|
|
148
212
|
// but its TypeScript types only expect LoadingComponentProps. We cast here because
|
|
149
213
|
// ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
|
|
150
214
|
// react-loadable will pass through but doesn't know about in its type definitions.
|
|
151
215
|
loading: ExtensionLoading
|
|
152
216
|
});
|
|
217
|
+
var NodeRenderer = function NodeRenderer(props) {
|
|
218
|
+
var _props$loadingFallbac;
|
|
219
|
+
if (!isExperimentEnabled('platform_editor_loosely_lazy_migration')) {
|
|
220
|
+
// eslint-disable-next-line react/jsx-props-no-spreading
|
|
221
|
+
return /*#__PURE__*/React.createElement(LoadableNodeRenderer, props);
|
|
222
|
+
}
|
|
223
|
+
return /*#__PURE__*/React.createElement(ExtensionRendererErrorBoundary, {
|
|
224
|
+
fallbackProps: props
|
|
225
|
+
}, /*#__PURE__*/React.createElement(LazySuspense, {
|
|
226
|
+
fallback: (_props$loadingFallbac = props.loadingFallback) !== null && _props$loadingFallbac !== void 0 ? _props$loadingFallbac : null
|
|
227
|
+
}, /*#__PURE__*/React.createElement(LazyNodeRenderer, props)));
|
|
228
|
+
};
|
|
229
|
+
NodeRenderer.preload = function () {
|
|
230
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? LazyNodeRenderer.preload() : LoadableNodeRenderer.preload();
|
|
231
|
+
};
|
|
232
|
+
return NodeRenderer;
|
|
153
233
|
}
|
|
154
234
|
// eslint-disable-next-line @atlaskit/editor/no-re-export
|
|
155
235
|
export { getExtensionManifest } from './getExtensionManifest';
|
|
@@ -3,6 +3,9 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
|
3
3
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
4
4
|
import React, { useEffect, useRef, useState } from 'react';
|
|
5
5
|
import Loadable from 'react-loadable';
|
|
6
|
+
// oxlint-disable-next-line @atlassian/no-restricted-imports
|
|
7
|
+
import { lazy, LazySuspense } from 'react-loosely-lazy';
|
|
8
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
6
9
|
import { getContextualToolbarItemsFromModule } from '../extensions';
|
|
7
10
|
import { nodeToJSON } from '../utils';
|
|
8
11
|
import { DropdownMenuItem } from './DropdownMenuItem';
|
|
@@ -85,12 +88,29 @@ var DropdownMenuExtensionItem = function DropdownMenuExtensionItem(_ref3) {
|
|
|
85
88
|
// Use ref to keep icon component stable across renders
|
|
86
89
|
var iconRef = useRef(null);
|
|
87
90
|
if (!iconRef.current && item.icon) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
var loadIcon = function loadIcon() {
|
|
92
|
+
return resolveExtensionIcon(item.icon);
|
|
93
|
+
};
|
|
94
|
+
var IconLazy = lazy(function () {
|
|
95
|
+
return resolveExtensionIcon(item.icon);
|
|
96
|
+
});
|
|
97
|
+
IconLazy.displayName = 'lazy(ExtensionIcon)';
|
|
98
|
+
var IconLoadable = Loadable({
|
|
99
|
+
loader: loadIcon,
|
|
92
100
|
loading: noop
|
|
93
101
|
});
|
|
102
|
+
var Icon = function Icon(props) {
|
|
103
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
|
|
104
|
+
fallback: null
|
|
105
|
+
}, /*#__PURE__*/React.createElement(IconLazy, props)) :
|
|
106
|
+
/*#__PURE__*/
|
|
107
|
+
// eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
|
|
108
|
+
React.createElement(IconLoadable, props);
|
|
109
|
+
};
|
|
110
|
+
Icon.preload = function () {
|
|
111
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconLazy.preload() : IconLoadable.preload();
|
|
112
|
+
};
|
|
113
|
+
iconRef.current = Icon;
|
|
94
114
|
}
|
|
95
115
|
var dropdownItem = convertExtensionToDropdownMenuItem({
|
|
96
116
|
item: item,
|
package/dist/esm/icons/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
// Disable no-re-export rule for entry point files
|
|
2
2
|
/* eslint-disable @atlaskit/editor/no-re-export */
|
|
3
3
|
|
|
4
|
+
import React from 'react';
|
|
4
5
|
import Loadable from 'react-loadable';
|
|
6
|
+
// oxlint-disable-next-line @atlassian/no-restricted-imports
|
|
7
|
+
import { lazy, LazySuspense } from 'react-loosely-lazy';
|
|
8
|
+
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
|
|
5
9
|
export { PanelInfoIcon } from './shared/PanelInfoIcon';
|
|
6
10
|
export { PanelWarningIcon } from './shared/PanelWarningIcon';
|
|
7
11
|
export { PanelErrorIcon } from './shared/PanelErrorIcon';
|
|
@@ -10,13 +14,31 @@ export { PanelNoteIcon } from './shared/PanelNoteIcon';
|
|
|
10
14
|
export { BorderIcon } from './shared/BorderIcon';
|
|
11
15
|
export { SteppedRainbowIconDecoration, rainbow, disabledRainbow } from './shared/SteppedRainbowIconDecoration';
|
|
12
16
|
export { DynamicStrokeIconDecoration } from './shared/DynamicStrokeIconDecoration';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
var loadIconTable = function loadIconTable() {
|
|
18
|
+
return import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(function (module) {
|
|
19
|
+
return module.default;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var IconTableLazy = lazy(function () {
|
|
23
|
+
return import( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table').then(function (module) {
|
|
24
|
+
return module.default;
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
IconTableLazy.displayName = 'lazy(IconTable)';
|
|
28
|
+
var IconTableLoadable = Loadable({
|
|
29
|
+
loader: loadIconTable,
|
|
19
30
|
loading: function loading() {
|
|
20
31
|
return null;
|
|
21
32
|
}
|
|
22
|
-
});
|
|
33
|
+
});
|
|
34
|
+
export var IconTable = function IconTable(props) {
|
|
35
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/React.createElement(LazySuspense, {
|
|
36
|
+
fallback: null
|
|
37
|
+
}, /*#__PURE__*/React.createElement(IconTableLazy, props)) :
|
|
38
|
+
/*#__PURE__*/
|
|
39
|
+
// eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
|
|
40
|
+
React.createElement(IconTableLoadable, props);
|
|
41
|
+
};
|
|
42
|
+
IconTable.preload = function () {
|
|
43
|
+
return isExperimentEnabled('platform_editor_loosely_lazy_migration') ? IconTableLazy.preload() : IconTableLoadable.preload();
|
|
44
|
+
};
|
|
@@ -19,7 +19,7 @@ var NETWORK_FAILURE_REGEX = /^network failure/i;
|
|
|
19
19
|
var RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
|
|
20
20
|
var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
|
|
21
21
|
var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
|
|
22
|
-
var packageVersion = "
|
|
22
|
+
var packageVersion = "125.0.0";
|
|
23
23
|
var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
|
|
24
24
|
// Remove URL as it has UGC
|
|
25
25
|
// Ignored via go/ees007
|