@atlaskit/editor-common 125.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/element-browser/components/ElementBrowserLoader.js +31 -8
  3. package/dist/cjs/extensibility/Extension.js +4 -2
  4. package/dist/cjs/extensibility/ExtensionComponent.js +3 -1
  5. package/dist/cjs/extensibility/ExtensionNodeWrapper.js +3 -0
  6. package/dist/cjs/extensibility/GeneratedContentReveal.js +18 -20
  7. package/dist/cjs/extensibility/extensionNodeView.js +61 -24
  8. package/dist/cjs/extensions/extension-handlers.js +96 -17
  9. package/dist/cjs/floating-toolbar/DropdownMenuExtensionItems.js +25 -4
  10. package/dist/cjs/icons/index.js +33 -10
  11. package/dist/cjs/monitoring/error.js +1 -1
  12. package/dist/cjs/quick-insert/assets/index.js +888 -257
  13. package/dist/cjs/ui/DropList/index.js +1 -1
  14. package/dist/cjs/ui/Mention/mention-with-profilecard.js +30 -11
  15. package/dist/es2019/element-browser/components/ElementBrowserLoader.js +16 -2
  16. package/dist/es2019/extensibility/Extension.js +4 -2
  17. package/dist/es2019/extensibility/ExtensionComponent.js +3 -1
  18. package/dist/es2019/extensibility/ExtensionNodeWrapper.js +2 -0
  19. package/dist/es2019/extensibility/GeneratedContentReveal.js +11 -16
  20. package/dist/es2019/extensibility/extensionNodeView.js +51 -23
  21. package/dist/es2019/extensions/extension-handlers.js +70 -15
  22. package/dist/es2019/floating-toolbar/DropdownMenuExtensionItems.js +16 -2
  23. package/dist/es2019/icons/index.js +17 -3
  24. package/dist/es2019/monitoring/error.js +1 -1
  25. package/dist/es2019/quick-insert/assets/index.js +386 -66
  26. package/dist/es2019/ui/DropList/index.js +1 -1
  27. package/dist/es2019/ui/Mention/mention-with-profilecard.js +15 -4
  28. package/dist/esm/element-browser/components/ElementBrowserLoader.js +28 -6
  29. package/dist/esm/extensibility/Extension.js +4 -2
  30. package/dist/esm/extensibility/ExtensionComponent.js +3 -1
  31. package/dist/esm/extensibility/ExtensionNodeWrapper.js +3 -0
  32. package/dist/esm/extensibility/GeneratedContentReveal.js +18 -20
  33. package/dist/esm/extensibility/extensionNodeView.js +56 -23
  34. package/dist/esm/extensions/extension-handlers.js +97 -17
  35. package/dist/esm/floating-toolbar/DropdownMenuExtensionItems.js +24 -4
  36. package/dist/esm/icons/index.js +29 -7
  37. package/dist/esm/monitoring/error.js +1 -1
  38. package/dist/esm/quick-insert/assets/index.js +764 -194
  39. package/dist/esm/ui/DropList/index.js +1 -1
  40. package/dist/esm/ui/Mention/mention-with-profilecard.js +25 -8
  41. package/dist/types/analytics/types/ai-suggestions-events.d.ts +4 -6
  42. package/dist/types/extensibility/Extension.d.ts +2 -0
  43. package/dist/types/extensibility/ExtensionComponent.d.ts +2 -0
  44. package/dist/types/extensibility/ExtensionNodeWrapper.d.ts +3 -1
  45. package/dist/types/extensibility/GeneratedContentReveal.d.ts +3 -1
  46. package/dist/types/extensibility/extensionNodeView.d.ts +13 -12
  47. package/dist/types/icons/index.d.ts +5 -3
  48. package/dist/types/quick-insert/assets/index.d.ts +34 -32
  49. package/package.json +5 -4
  50. package/dist/cjs/extensibility/useNativeEmbedSettled.js +0 -56
  51. package/dist/es2019/extensibility/useNativeEmbedSettled.js +0 -49
  52. package/dist/esm/extensibility/useNativeEmbedSettled.js +0 -51
  53. package/dist/types/extensibility/useNativeEmbedSettled.d.ts +0 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @atlaskit/editor-common
2
2
 
3
+ ## 125.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`52a90f8df8ee2`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/52a90f8df8ee2) -
8
+ Native embed extensions take an `onContentReady` callback and call it once there is something to
9
+ show: the app's first painted frame for an experience that reports one, the frame's load event
10
+ otherwise, or a failure. The generated content reveal holds its node closed until that call, so
11
+ `editor-common` no longer watches the native embed loading attribute to work out when a node has
12
+ loaded. Both extension node views, the extension plugin's and the referentiality plugin's, hand
13
+ the callback to the extension.
14
+ - [`bc78affbd7445`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bc78affbd7445) -
15
+ Migrate Editor Common's lazy-loaded components to react-loosely-lazy behind the
16
+ `platform_editor_loosely_lazy_migration` experiment.
17
+
18
+ ### Patch Changes
19
+
20
+ - [`6ae411e31887f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/6ae411e31887f) -
21
+ Fix Suggested Edits analytics exposure, navigation, and suggestion view tracking under
22
+ platform_editor_ai_content_suggested_edits.
23
+ - Updated dependencies
24
+
3
25
  ## 125.0.0
4
26
 
5
27
  ### Patch Changes
@@ -9,11 +9,15 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
9
9
  var _react = _interopRequireDefault(require("react"));
10
10
  var _react2 = require("@emotion/react");
11
11
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
12
+ var _reactLooselyLazy = require("react-loosely-lazy");
13
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
12
14
  var _spinner = _interopRequireDefault(require("@atlaskit/spinner/spinner"));
13
15
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != (0, _typeof2.default)(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } /**
14
16
  * @jsxRuntime classic
15
17
  * @jsx jsx
16
18
  */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
19
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
20
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
17
21
  var spinnerContainer = (0, _react2.css)({
18
22
  display: 'flex',
19
23
  alignItems: 'center',
@@ -21,14 +25,23 @@ var spinnerContainer = (0, _react2.css)({
21
25
  height: '100%',
22
26
  width: '100%'
23
27
  });
24
- var ElementBrowserLoader = (0, _reactLoadable.default)({
25
- loader: function loader() {
26
- return Promise.resolve().then(function () {
27
- return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser'));
28
- }).then(function (module) {
29
- return module.default;
30
- });
31
- },
28
+ var loadElementBrowser = function loadElementBrowser() {
29
+ return Promise.resolve().then(function () {
30
+ return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser'));
31
+ }).then(function (module) {
32
+ return module.default;
33
+ });
34
+ };
35
+ var ElementBrowserLazy = (0, _reactLooselyLazy.lazy)(function () {
36
+ return Promise.resolve().then(function () {
37
+ return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-element-browser" */'../ElementBrowser'));
38
+ }).then(function (module) {
39
+ return module.default;
40
+ });
41
+ });
42
+ ElementBrowserLazy.displayName = 'lazy(ElementBrowser)';
43
+ var ElementBrowserLoadable = (0, _reactLoadable.default)({
44
+ loader: loadElementBrowser,
32
45
  loading: function loading() {
33
46
  return (0, _react2.jsx)("div", {
34
47
  css: spinnerContainer
@@ -38,4 +51,14 @@ var ElementBrowserLoader = (0, _reactLoadable.default)({
38
51
  }));
39
52
  }
40
53
  });
54
+ var ElementBrowserLoader = function ElementBrowserLoader(props) {
55
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? (0, _react2.jsx)(_reactLooselyLazy.LazySuspense, {
56
+ fallback: null
57
+ }, (0, _react2.jsx)(ElementBrowserLazy, props)) :
58
+ // eslint-disable-next-line react/jsx-props-no-spreading
59
+ (0, _react2.jsx)(ElementBrowserLoadable, props);
60
+ };
61
+ ElementBrowserLoader.preload = function () {
62
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? ElementBrowserLazy.preload() : ElementBrowserLoadable.preload();
63
+ };
41
64
  var _default = exports.default = ElementBrowserLoader;
@@ -42,7 +42,8 @@ var Extension = exports.Extension = /*#__PURE__*/function (_Component) {
42
42
  macroInteractionDesignFeatureFlags = _this$props.macroInteractionDesignFeatureFlags,
43
43
  showLivePagesBodiedMacrosRendererView = _this$props.showLivePagesBodiedMacrosRendererView,
44
44
  showUpdatedLivePages1PBodiedExtensionUI = _this$props.showUpdatedLivePages1PBodiedExtensionUI,
45
- rendererExtensionHandlers = _this$props.rendererExtensionHandlers;
45
+ rendererExtensionHandlers = _this$props.rendererExtensionHandlers,
46
+ onContentReady = _this$props.onContentReady;
46
47
 
47
48
  // Extensions are not yet using the new plugin architecture, and the use of the pluginInjectionApi
48
49
  // is not type safe in editor-common.
@@ -68,7 +69,8 @@ var Extension = exports.Extension = /*#__PURE__*/function (_Component) {
68
69
  showLivePagesBodiedMacrosRendererView: showLivePagesBodiedMacrosRendererView,
69
70
  showUpdatedLivePages1PBodiedExtensionUI: showUpdatedLivePages1PBodiedExtensionUI,
70
71
  rendererExtensionHandlers: rendererExtensionHandlers,
71
- isLivePageViewMode: isLivePageViewMode
72
+ isLivePageViewMode: isLivePageViewMode,
73
+ onContentReady: onContentReady
72
74
  });
73
75
  });
74
76
  _this.providerFactory = props.providerFactory || new _providerFactory.ProviderFactory();
@@ -241,7 +241,8 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
241
241
  extensionLoadingHandlers = _this$props2.extensionLoadingHandlers,
242
242
  editorView = _this$props2.editorView,
243
243
  showBodiedExtensionRendererView = _this$props2.showBodiedExtensionRendererView,
244
- rendererExtensionHandlers = _this$props2.rendererExtensionHandlers;
244
+ rendererExtensionHandlers = _this$props2.rendererExtensionHandlers,
245
+ onContentReady = _this$props2.onContentReady;
245
246
  var _pmNode$attrs = pmNode.attrs,
246
247
  extensionType = _pmNode$attrs.extensionType,
247
248
  extensionKey = _pmNode$attrs.extensionKey,
@@ -296,6 +297,7 @@ var ExtensionComponentInner = /*#__PURE__*/function (_Component) {
296
297
  references: _this.props.references,
297
298
  isSelected: isSelected,
298
299
  loadingFallback: loadingFallback,
300
+ onContentReady: onContentReady,
299
301
  showUnknownMacroPlaceholder: true
300
302
  });
301
303
  }
@@ -76,6 +76,8 @@ var ExtensionNodeWrapper = exports.ExtensionNodeWrapper = function ExtensionNode
76
76
  macroInteractionDesignFeatureFlags = _ref.macroInteractionDesignFeatureFlags,
77
77
  _ref$generatedContent = _ref.generatedContentMotion,
78
78
  generatedContentMotion = _ref$generatedContent === void 0 ? false : _ref$generatedContent,
79
+ _ref$contentReady = _ref.contentReady,
80
+ contentReady = _ref$contentReady === void 0 ? false : _ref$contentReady,
79
81
  intl = _ref.intl;
80
82
  var _ref2 = macroInteractionDesignFeatureFlags || {},
81
83
  showMacroInteractionDesignUpdates = _ref2.showMacroInteractionDesignUpdates;
@@ -83,6 +85,7 @@ var ExtensionNodeWrapper = exports.ExtensionNodeWrapper = function ExtensionNode
83
85
  // Fixed for the node view's lifetime: switching would remount the subtree and reload the embed.
84
86
  if (generatedContentMotion) {
85
87
  return (0, _react2.jsx)(_GeneratedContentReveal.GeneratedContentReveal, {
88
+ contentReady: contentReady,
86
89
  intl: intl,
87
90
  showMacroInteractionDesignUpdates: showMacroInteractionDesignUpdates
88
91
  }, children);
@@ -12,14 +12,13 @@ var _runtime = require("@compiled/react/runtime");
12
12
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
14
  var _ExtensionSSRReactContextsProvider = require("./ExtensionSSRReactContextsProvider");
15
- var _useNativeEmbedSettled = require("./useNativeEmbedSettled");
16
15
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
17
16
  /*
18
17
  * Animates a native embed into the document once it has loaded.
19
18
  *
20
19
  * 1. `collapsed` — clipped to zero height and `inert`. The embed loads behind it, full size but
21
20
  * unseen, with its own loading overlay hidden.
22
- * 2. `useNativeEmbedSettled` calls back once the embed has finished loading.
21
+ * 2. The extension reports its content ready through `contentReady`.
23
22
  * 3. `revealing` — the node animates open to its content height (400ms).
24
23
  * 4. The embed fades in (200ms), delayed so it follows the opening instead of overlapping it.
25
24
  * 5. `open` — on `animationend`, when the content first becomes visible, `inert` is dropped.
@@ -64,42 +63,41 @@ var embedContentEnteringStyles = null;
64
63
 
65
64
  var GeneratedContentReveal = exports.GeneratedContentReveal = function GeneratedContentReveal(_ref) {
66
65
  var children = _ref.children,
66
+ contentReady = _ref.contentReady,
67
67
  intl = _ref.intl,
68
68
  showMacroInteractionDesignUpdates = _ref.showMacroInteractionDesignUpdates;
69
- // Held in state so the effects below run once the span exists.
69
+ // Held in state so the effect below runs once the span exists.
70
70
  var _useState = (0, _react.useState)(null),
71
71
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
72
72
  wrapperElement = _useState2[0],
73
73
  setWrapperElement = _useState2[1];
74
- var _useState3 = (0, _react.useState)('collapsed'),
74
+ var _useState3 = (0, _react.useState)(false),
75
75
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
76
- state = _useState4[0],
77
- setState = _useState4[1];
76
+ readyTimedOut = _useState4[0],
77
+ setReadyTimedOut = _useState4[1];
78
+ var _useState5 = (0, _react.useState)(false),
79
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
80
+ opened = _useState6[0],
81
+ setOpened = _useState6[1];
78
82
 
79
- // Only a collapsed node opens, so whichever of the readiness signal and the fail-safe timer
80
- // comes second changes nothing.
81
- var startRevealing = (0, _react.useCallback)(function () {
82
- setState(function (current) {
83
- return current === 'collapsed' ? 'revealing' : current;
84
- });
85
- }, []);
86
-
87
- // Step 2 → 3.
88
- (0, _useNativeEmbedSettled.useNativeEmbedSettled)(wrapperElement, startRevealing);
83
+ // Derived, so the two ways a node opens need no ordering between them.
84
+ var state = opened ? 'open' : contentReady || readyTimedOut ? 'revealing' : 'collapsed';
89
85
 
90
86
  // One timer, set on mount, so the deadline never moves.
91
87
  (0, _react.useEffect)(function () {
92
- var timer = setTimeout(startRevealing, READY_TIMEOUT_MS);
88
+ var timer = setTimeout(function () {
89
+ return setReadyTimedOut(true);
90
+ }, READY_TIMEOUT_MS);
93
91
  return function () {
94
92
  return clearTimeout(timer);
95
93
  };
96
- }, [startRevealing]);
94
+ }, []);
97
95
  (0, _react.useEffect)(function () {
98
96
  if (state !== 'revealing') {
99
97
  return;
100
98
  }
101
99
  var timer = setTimeout(function () {
102
- return setState('open');
100
+ return setOpened(true);
103
101
  }, REVEAL_TIMEOUT_MS);
104
102
  return function () {
105
103
  return clearTimeout(timer);
@@ -114,7 +112,7 @@ var GeneratedContentReveal = exports.GeneratedContentReveal = function Generated
114
112
  var onAnimationEnd = (0, _react.useCallback)(function (event) {
115
113
  // The extension's own content animates too, and those events bubble.
116
114
  if (event.target === event.currentTarget) {
117
- setState('open');
115
+ setOpened(true);
118
116
  }
119
117
  }, []);
120
118
  return /*#__PURE__*/_react.default.createElement(_ExtensionSSRReactContextsProvider.ExtensionSSRReactContextsProvider, {
@@ -1,11 +1,13 @@
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.ExtensionNode = void 0;
8
9
  exports.default = ExtensionNodeView;
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
11
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
10
12
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
11
13
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
@@ -13,7 +15,7 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
13
15
  var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
14
16
  var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
- var _react = _interopRequireDefault(require("react"));
18
+ var _react = _interopRequireWildcard(require("react"));
17
19
  var _fg = require("@atlaskit/platform-feature-flags/fg");
18
20
  var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
19
21
  var _coreUtils = require("../core-utils");
@@ -21,6 +23,7 @@ var _reactNodeView = _interopRequireDefault(require("../react-node-view"));
21
23
  var _Extension = require("./Extension");
22
24
  var _ExtensionNodeWrapper = require("./ExtensionNodeWrapper");
23
25
  var _nativeEmbedExtension = require("./nativeEmbedExtension");
26
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
24
27
  function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
25
28
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
26
29
  function _superPropGet(t, o, e, r) { var p = (0, _get2.default)((0, _getPrototypeOf2.default)(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
@@ -310,22 +313,14 @@ var ExtensionNode = exports.ExtensionNode = /*#__PURE__*/function (_ReactNodeVie
310
313
  }, {
311
314
  key: "render",
312
315
  value: function render(props, forwardRef) {
313
- var _props$extensionNodeV, _props$extensionNodeV2;
314
316
  // While sitting on SSR DOM, skip the React portal — see {@link didReuseSsrDom}.
315
317
  if (this.didReuseSsrDom) {
316
318
  return null;
317
319
  }
318
- return /*#__PURE__*/_react.default.createElement(_ExtensionNodeWrapper.ExtensionNodeWrapper, {
319
- intl: props.intl,
320
- nodeType: this.node.type.name,
321
- macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags
322
- // Only native embeds animate in; the reveal waits on the embed's own loading state.
323
- ,
324
- generatedContentMotion: !!((_props$extensionNodeV = props.extensionNodeViewOptions) !== null && _props$extensionNodeV !== void 0 && _props$extensionNodeV.allowAIGeneratedContentMotion) && (0, _nativeEmbedExtension.isNativeEmbedExtension)(this.node)
325
- }, /*#__PURE__*/_react.default.createElement(_Extension.Extension, {
320
+ return /*#__PURE__*/_react.default.createElement(ExtensionNodeRender, {
326
321
  editorView: this.view,
327
- node: this.node,
328
- eventDispatcher: this.eventDispatcher
322
+ eventDispatcher: this.eventDispatcher,
323
+ forwardRef: forwardRef
329
324
  // The getPos arg is always a function when used with nodes
330
325
  // the version of the types we use has a union with the type
331
326
  // for marks.
@@ -334,20 +329,62 @@ var ExtensionNode = exports.ExtensionNode = /*#__PURE__*/function (_ReactNodeVie
334
329
  // https://github.com/DefinitelyTyped/DefinitelyTyped/pull/57384
335
330
  ,
336
331
  getPos: this.getPos,
337
- providerFactory: props.providerFactory,
338
- handleContentDOMRef: forwardRef,
339
- extensionHandlers: props.extensionHandlers,
340
- extensionLoadingHandlers: props.extensionLoadingHandlers,
341
- editorAppearance: (_props$extensionNodeV2 = props.extensionNodeViewOptions) === null || _props$extensionNodeV2 === void 0 ? void 0 : _props$extensionNodeV2.appearance,
342
- pluginInjectionApi: props.pluginInjectionApi,
343
- macroInteractionDesignFeatureFlags: props.macroInteractionDesignFeatureFlags,
344
- showLivePagesBodiedMacrosRendererView: props.showLivePagesBodiedMacrosRendererView,
345
- showUpdatedLivePages1PBodiedExtensionUI: props.showUpdatedLivePages1PBodiedExtensionUI,
346
- rendererExtensionHandlers: props.rendererExtensionHandlers
347
- }));
332
+ node: this.node,
333
+ renderProps: props
334
+ });
348
335
  }
349
336
  }]);
350
- }(_reactNodeView.default); // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
337
+ }(_reactNodeView.default);
338
+ /**
339
+ * Wraps the extension in its node wrapper. A component rather than part of the node view's `render`,
340
+ * so `contentReady` can be React state: the extension reports its content ready from inside the
341
+ * wrapper, and the wrapper animates the node in once it has.
342
+ */
343
+ function ExtensionNodeRender(_ref2) {
344
+ var _renderProps$extensio, _renderProps$extensio2;
345
+ var editorView = _ref2.editorView,
346
+ eventDispatcher = _ref2.eventDispatcher,
347
+ forwardRef = _ref2.forwardRef,
348
+ getPos = _ref2.getPos,
349
+ node = _ref2.node,
350
+ renderProps = _ref2.renderProps;
351
+ var _useState = (0, _react.useState)(false),
352
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
353
+ contentReady = _useState2[0],
354
+ setContentReady = _useState2[1];
355
+ var onContentReady = (0, _react.useCallback)(function () {
356
+ return setContentReady(true);
357
+ }, []);
358
+
359
+ // Only native embeds animate in; every other extension type renders as it does without the
360
+ // option, so nothing waits on a signal it does not send.
361
+ var generatedContentMotion = !!((_renderProps$extensio = renderProps.extensionNodeViewOptions) !== null && _renderProps$extensio !== void 0 && _renderProps$extensio.allowAIGeneratedContentMotion) && (0, _nativeEmbedExtension.isNativeEmbedExtension)(node);
362
+ return /*#__PURE__*/_react.default.createElement(_ExtensionNodeWrapper.ExtensionNodeWrapper, {
363
+ intl: renderProps.intl,
364
+ nodeType: node.type.name,
365
+ macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
366
+ generatedContentMotion: generatedContentMotion,
367
+ contentReady: contentReady
368
+ }, /*#__PURE__*/_react.default.createElement(_Extension.Extension, {
369
+ editorView: editorView,
370
+ node: node,
371
+ eventDispatcher: eventDispatcher,
372
+ getPos: getPos,
373
+ providerFactory: renderProps.providerFactory,
374
+ handleContentDOMRef: forwardRef,
375
+ extensionHandlers: renderProps.extensionHandlers,
376
+ extensionLoadingHandlers: renderProps.extensionLoadingHandlers,
377
+ editorAppearance: (_renderProps$extensio2 = renderProps.extensionNodeViewOptions) === null || _renderProps$extensio2 === void 0 ? void 0 : _renderProps$extensio2.appearance,
378
+ pluginInjectionApi: renderProps.pluginInjectionApi,
379
+ macroInteractionDesignFeatureFlags: renderProps.macroInteractionDesignFeatureFlags,
380
+ showLivePagesBodiedMacrosRendererView: renderProps.showLivePagesBodiedMacrosRendererView,
381
+ showUpdatedLivePages1PBodiedExtensionUI: renderProps.showUpdatedLivePages1PBodiedExtensionUI,
382
+ rendererExtensionHandlers: renderProps.rendererExtensionHandlers,
383
+ onContentReady: generatedContentMotion ? onContentReady : undefined
384
+ }));
385
+ }
386
+
387
+ // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
351
388
  function ExtensionNodeView(portalProviderAPI, eventDispatcher, providerFactory, extensionHandlers, extensionLoadingHandlers, extensionNodeViewOptions, pluginInjectionApi, macroInteractionDesignFeatureFlags, showLivePagesBodiedMacrosRendererView, showUpdatedLivePages1PBodiedExtensionUI, rendererExtensionHandlers, intl) {
352
389
  return function (node, view, getPos) {
353
390
  return new ExtensionNode(node, view, getPos, portalProviderAPI, eventDispatcher, {
@@ -15,16 +15,27 @@ exports.getExtensionModuleNodeMaybePreloaded = getExtensionModuleNodeMaybePreloa
15
15
  exports.getExtensionModuleNodePrivateProps = getExtensionModuleNodePrivateProps;
16
16
  exports.getNodeRenderer = getNodeRenderer;
17
17
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
18
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
19
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
20
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
22
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
23
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
24
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
25
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
26
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
20
27
  var _react = _interopRequireDefault(require("react"));
21
28
  var _reactIntl = require("react-intl");
22
29
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
30
+ var _reactLooselyLazy = require("react-loosely-lazy");
31
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
23
32
  var _manifestHelpers = require("./manifest-helpers");
24
33
  var _messages = require("./messages");
25
34
  var _resolveImportSync = require("./resolveImportSync");
26
35
  var _UnknownMacroPlaceholder = require("./UnknownMacroPlaceholder");
27
36
  var _getExtensionManifest = require("./getExtensionManifest");
37
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
38
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // oxlint-disable-next-line @atlassian/no-restricted-imports
28
39
  function getNodeFromManifest(
29
40
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
41
  manifest, extKey, nodeKey, extensionType, extensionKey) {
@@ -120,6 +131,52 @@ function isUnknownConfluenceMacroWithBody(extensionNode) {
120
131
  var _extensionNode$parame;
121
132
  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);
122
133
  }
134
+ // eslint-disable-next-line @repo/internal/react/no-class-components -- error boundaries require a class component
135
+ var ExtensionRendererErrorBoundary = /*#__PURE__*/function (_React$Component) {
136
+ function ExtensionRendererErrorBoundary() {
137
+ var _this;
138
+ (0, _classCallCheck2.default)(this, ExtensionRendererErrorBoundary);
139
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
140
+ args[_key] = arguments[_key];
141
+ }
142
+ _this = _callSuper(this, ExtensionRendererErrorBoundary, [].concat(args));
143
+ (0, _defineProperty2.default)(_this, "state", {});
144
+ return _this;
145
+ }
146
+ (0, _inherits2.default)(ExtensionRendererErrorBoundary, _React$Component);
147
+ return (0, _createClass2.default)(ExtensionRendererErrorBoundary, [{
148
+ key: "componentDidCatch",
149
+ value: function componentDidCatch(error) {
150
+ // eslint-disable-next-line no-console
151
+ console.error('Error rendering extension', error);
152
+ }
153
+ }, {
154
+ key: "render",
155
+ value: function render() {
156
+ return this.state.error ? renderExtensionLoadingError(this.state.error, this.props.fallbackProps) : this.props.children;
157
+ }
158
+ }], [{
159
+ key: "getDerivedStateFromError",
160
+ value: function getDerivedStateFromError(error) {
161
+ return {
162
+ error: error
163
+ };
164
+ }
165
+ }]);
166
+ }(_react.default.Component);
167
+ var noop = function noop() {};
168
+ function renderExtensionLoadingError(error, props) {
169
+ // Needed because the old react-loadable (older code-splitting library) error handling behaviour might be relied on by extensions.
170
+ // https://unpkg.com/react-loadable@5.2.2/lib/index.js
171
+ return /*#__PURE__*/_react.default.createElement(ExtensionLoading, (0, _extends2.default)({
172
+ isLoading: false,
173
+ pastDelay: true,
174
+ timedOut: false,
175
+ error: error,
176
+ retry: noop
177
+ // eslint-disable-next-line react/jsx-props-no-spreading
178
+ }, props));
179
+ }
123
180
  function ExtensionLoading(props) {
124
181
  var intl = (0, _reactIntl.useIntl)();
125
182
  var extensionNode = props.node;
@@ -142,28 +199,50 @@ function ExtensionLoading(props) {
142
199
 
143
200
  // eslint-disable-next-line @atlaskit/volt-strict-mode/no-multiple-exports
144
201
  function getNodeRenderer(extensionProvider, extensionType, extensionKey) {
145
- return (0, _reactLoadable.default)({
146
- loader: function loader() {
147
- var maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
148
- if (maybePromise instanceof Promise) {
149
- return maybePromise.then(function (node) {
150
- return (0, _manifestHelpers.resolveImport)(node.render());
151
- });
152
- } else {
153
- var _renderSync, _ref;
154
- var preloaded = maybePromise === null || maybePromise === void 0 || (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
155
- // Only product implemented preloading will return sync result
156
- // However the out-of-box won't handle this. Confluence uses a custom implementation
157
- return preloaded ?
158
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
159
- (0, _resolveImportSync.resolveImportSync)(preloaded) : (0, _manifestHelpers.resolveImport)(maybePromise.render());
160
- }
161
- },
202
+ var loadNodeRenderer = function loadNodeRenderer() {
203
+ var _renderSync, _ref;
204
+ var maybePromise = getExtensionModuleNodeMaybePreloaded(extensionProvider, extensionType, extensionKey);
205
+ if (maybePromise instanceof Promise) {
206
+ return maybePromise.then(function (node) {
207
+ return (0, _manifestHelpers.resolveImport)(node.render());
208
+ });
209
+ }
210
+ var preloaded = maybePromise === null || maybePromise === void 0 || (_renderSync = (_ref = maybePromise).renderSync) === null || _renderSync === void 0 ? void 0 : _renderSync.call(_ref);
211
+ // Only product implemented preloading will return sync result
212
+ // However the out-of-box won't handle this. Confluence uses a custom implementation
213
+ return preloaded ?
214
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
215
+ (0, _resolveImportSync.resolveImportSync)(preloaded) : (0, _manifestHelpers.resolveImport)(maybePromise.render());
216
+ };
217
+ var LazyNodeRenderer = (0, _reactLooselyLazy.lazy)(function () {
218
+ return loadNodeRenderer();
219
+ });
220
+ LazyNodeRenderer.displayName = 'lazy(NodeRenderer)';
221
+ // Ignored via go/ees005
222
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
223
+ var LoadableNodeRenderer = (0, _reactLoadable.default)({
224
+ loader: loadNodeRenderer,
162
225
  // react-loadable passes all props from <NodeRenderer> to the loading component at runtime,
163
226
  // but its TypeScript types only expect LoadingComponentProps. We cast here because
164
227
  // ExtensionLoading accepts additional props (node, showUnknownMacroPlaceholder) that
165
228
  // react-loadable will pass through but doesn't know about in its type definitions.
166
229
  loading: ExtensionLoading
167
230
  });
231
+ var NodeRenderer = function NodeRenderer(props) {
232
+ var _props$loadingFallbac;
233
+ if (!(0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration')) {
234
+ // eslint-disable-next-line react/jsx-props-no-spreading
235
+ return /*#__PURE__*/_react.default.createElement(LoadableNodeRenderer, props);
236
+ }
237
+ return /*#__PURE__*/_react.default.createElement(ExtensionRendererErrorBoundary, {
238
+ fallbackProps: props
239
+ }, /*#__PURE__*/_react.default.createElement(_reactLooselyLazy.LazySuspense, {
240
+ fallback: (_props$loadingFallbac = props.loadingFallback) !== null && _props$loadingFallbac !== void 0 ? _props$loadingFallbac : null
241
+ }, /*#__PURE__*/_react.default.createElement(LazyNodeRenderer, props)));
242
+ };
243
+ NodeRenderer.preload = function () {
244
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? LazyNodeRenderer.preload() : LoadableNodeRenderer.preload();
245
+ };
246
+ return NodeRenderer;
168
247
  }
169
248
  // eslint-disable-next-line @atlaskit/editor/no-re-export
@@ -11,11 +11,15 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
14
+ var _reactLooselyLazy = require("react-loosely-lazy");
15
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
14
16
  var _extensions = require("../extensions");
15
17
  var _utils = require("../utils");
16
18
  var _DropdownMenuItem = require("./DropdownMenuItem");
17
19
  var _DropdownSeparator = require("./DropdownSeparator");
18
20
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
21
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
22
+
19
23
  var noop = function noop() {
20
24
  return null;
21
25
  };
@@ -94,12 +98,29 @@ var DropdownMenuExtensionItem = function DropdownMenuExtensionItem(_ref3) {
94
98
  // Use ref to keep icon component stable across renders
95
99
  var iconRef = (0, _react.useRef)(null);
96
100
  if (!iconRef.current && item.icon) {
97
- iconRef.current = (0, _reactLoadable.default)({
98
- loader: function loader() {
99
- return resolveExtensionIcon(item.icon);
100
- },
101
+ var loadIcon = function loadIcon() {
102
+ return resolveExtensionIcon(item.icon);
103
+ };
104
+ var IconLazy = (0, _reactLooselyLazy.lazy)(function () {
105
+ return resolveExtensionIcon(item.icon);
106
+ });
107
+ IconLazy.displayName = 'lazy(ExtensionIcon)';
108
+ var IconLoadable = (0, _reactLoadable.default)({
109
+ loader: loadIcon,
101
110
  loading: noop
102
111
  });
112
+ var Icon = function Icon(props) {
113
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/_react.default.createElement(_reactLooselyLazy.LazySuspense, {
114
+ fallback: null
115
+ }, /*#__PURE__*/_react.default.createElement(IconLazy, props)) :
116
+ /*#__PURE__*/
117
+ // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
118
+ _react.default.createElement(IconLoadable, props);
119
+ };
120
+ Icon.preload = function () {
121
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? IconLazy.preload() : IconLoadable.preload();
122
+ };
123
+ iconRef.current = Icon;
103
124
  }
104
125
  var dropdownItem = convertExtensionToDropdownMenuItem({
105
126
  item: item,
@@ -66,7 +66,10 @@ Object.defineProperty(exports, "rainbow", {
66
66
  }
67
67
  });
68
68
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
69
+ var _react = _interopRequireDefault(require("react"));
69
70
  var _reactLoadable = _interopRequireDefault(require("react-loadable"));
71
+ var _reactLooselyLazy = require("react-loosely-lazy");
72
+ var _isExperimentEnabled = require("@atlaskit/platform-feature-experiments/is-experiment-enabled");
70
73
  var _PanelInfoIcon = require("./shared/PanelInfoIcon");
71
74
  var _PanelWarningIcon = require("./shared/PanelWarningIcon");
72
75
  var _PanelErrorIcon = require("./shared/PanelErrorIcon");
@@ -76,16 +79,36 @@ var _BorderIcon = require("./shared/BorderIcon");
76
79
  var _SteppedRainbowIconDecoration = require("./shared/SteppedRainbowIconDecoration");
77
80
  var _DynamicStrokeIconDecoration = require("./shared/DynamicStrokeIconDecoration");
78
81
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != (0, _typeof2.default)(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } // Disable no-re-export rule for entry point files
79
- /* eslint-disable @atlaskit/editor/no-re-export */
80
- var IconTable = exports.IconTable = (0, _reactLoadable.default)({
81
- loader: function loader() {
82
- return Promise.resolve().then(function () {
83
- return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table'));
84
- }).then(function (module) {
85
- return module.default;
86
- });
87
- },
82
+ /* eslint-disable @atlaskit/editor/no-re-export */ // oxlint-disable-next-line @atlassian/no-restricted-imports
83
+ var loadIconTable = function loadIconTable() {
84
+ return Promise.resolve().then(function () {
85
+ return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table'));
86
+ }).then(function (module) {
87
+ return module.default;
88
+ });
89
+ };
90
+ var IconTableLazy = (0, _reactLooselyLazy.lazy)(function () {
91
+ return Promise.resolve().then(function () {
92
+ return _interopRequireWildcard(require( /* webpackChunkName: "@atlaskit-internal_editor-icon-table" */'../icons/shared/table'));
93
+ }).then(function (module) {
94
+ return module.default;
95
+ });
96
+ });
97
+ IconTableLazy.displayName = 'lazy(IconTable)';
98
+ var IconTableLoadable = (0, _reactLoadable.default)({
99
+ loader: loadIconTable,
88
100
  loading: function loading() {
89
101
  return null;
90
102
  }
91
- });
103
+ });
104
+ var IconTable = exports.IconTable = function IconTable(props) {
105
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? /*#__PURE__*/_react.default.createElement(_reactLooselyLazy.LazySuspense, {
106
+ fallback: null
107
+ }, /*#__PURE__*/_react.default.createElement(IconTableLazy, props)) :
108
+ /*#__PURE__*/
109
+ // eslint-disable-next-line react/jsx-props-no-spreading -- pass icon props to the legacy component
110
+ _react.default.createElement(IconTableLoadable, props);
111
+ };
112
+ IconTable.preload = function () {
113
+ return (0, _isExperimentEnabled.isExperimentEnabled)('platform_editor_loosely_lazy_migration') ? IconTableLazy.preload() : IconTableLoadable.preload();
114
+ };
@@ -27,7 +27,7 @@ var NETWORK_FAILURE_REGEX = /^network failure/i;
27
27
  var RESIZE_OBSERVER_LOOP_REGEX = /ResizeObserver loop completed with undelivered notifications/;
28
28
  var SENTRY_DSN = 'https://0b10c8e02fb44d8796c047b102c9bee8@o55978.ingest.sentry.io/4505129224110080';
29
29
  var packageName = 'editor-common'; // Sentry doesn't accept '/' in its releases https://docs.sentry.io/platforms/javascript/configuration/releases/
30
- var packageVersion = "124.0.0";
30
+ var packageVersion = "125.0.0";
31
31
  var sanitiseSentryEvents = function sanitiseSentryEvents(data, _hint) {
32
32
  // Remove URL as it has UGC
33
33
  // Ignored via go/ees007