@atlaskit/editor-plugin-mentions 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/editor-plugin-mentions
2
2
 
3
+ ## 1.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#103099](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/103099)
8
+ [`ab382e121799`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/ab382e121799) -
9
+ [ux] [ED-23248] -
10
+
11
+ **@atlaskit/editor-core**: REVERT: Added optional profilecardProvider to Mention plugin in
12
+ universal composable editor **@atlaskit/editor-plugin-mentions**: REVERT: Made mentions render
13
+ with profile cards on click if the feature flag:
14
+ `platform.editor.mentions-in-editor-popup-on-click` is turned on
15
+
3
16
  ## 1.3.0
4
17
 
5
18
  ### Minor Changes
@@ -17,10 +17,13 @@ var _Mention = _interopRequireDefault(require("../ui/Mention"));
17
17
  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); }
18
18
  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 && Object.prototype.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; }
19
19
  var UNKNOWN_USER_ID = '_|unknown|_';
20
- var useResolvedName = function useResolvedName(_ref) {
20
+ var MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref) {
21
21
  var id = _ref.id,
22
22
  text = _ref.text,
23
- mentionProvider = _ref.mentionProvider;
23
+ providers = _ref.providers,
24
+ accessLevel = _ref.accessLevel,
25
+ mentionProvider = _ref.mentionProvider,
26
+ localId = _ref.localId;
24
27
  var _useState = (0, _react.useState)(text),
25
28
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
26
29
  resolvedName = _useState2[0],
@@ -76,28 +79,36 @@ var useResolvedName = function useResolvedName(_ref) {
76
79
  });
77
80
  }
78
81
  }, [id, text, mentionProvider]);
79
- return resolvedName;
82
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Mention.default, {
83
+ id: id,
84
+ text: resolvedName,
85
+ accessLevel: accessLevel,
86
+ providers: providers,
87
+ localId: localId
88
+ })));
80
89
  };
81
90
  var MentionNodeView = exports.MentionNodeView = function MentionNodeView(props) {
82
- var _props$options;
91
+ var providerFactory = props.providerFactory;
83
92
  var _props$node$attrs = props.node.attrs,
84
93
  id = _props$node$attrs.id,
85
94
  text = _props$node$attrs.text,
86
95
  accessLevel = _props$node$attrs.accessLevel,
87
96
  localId = _props$node$attrs.localId;
88
- var mentionProvider = (0, _providerFactory.useProvider)('mentionProvider');
89
- var profilecardProvider = (_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.profilecardProvider;
90
- var resolvedName = useResolvedName({
91
- id: id,
92
- text: text,
93
- mentionProvider: mentionProvider
97
+ var renderAssistiveTextWithProviders = function renderAssistiveTextWithProviders(providers) {
98
+ var _ref3 = providers,
99
+ mentionProvider = _ref3.mentionProvider;
100
+ return /*#__PURE__*/_react.default.createElement(MentionAssistiveTextComponent, {
101
+ mentionProvider: mentionProvider,
102
+ id: id,
103
+ text: text,
104
+ providers: providerFactory,
105
+ accessLevel: accessLevel,
106
+ localId: localId
107
+ });
108
+ };
109
+ return /*#__PURE__*/_react.default.createElement(_providerFactory.WithProviders, {
110
+ providers: ['mentionProvider', 'profilecardProvider'],
111
+ providerFactory: providerFactory,
112
+ renderNode: renderAssistiveTextWithProviders
94
113
  });
95
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(_Mention.default, {
96
- id: id,
97
- text: resolvedName,
98
- accessLevel: accessLevel,
99
- mentionProvider: mentionProvider,
100
- profilecardProvider: profilecardProvider,
101
- localId: localId
102
- })));
103
114
  };
@@ -7,14 +7,21 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
13
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
15
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
17
  var _react = _interopRequireWildcard(require("react"));
12
- var _mention = require("@atlaskit/editor-common/mention");
18
+ var _providerFactory = require("@atlaskit/editor-common/provider-factory");
13
19
  var _utils = require("@atlaskit/editor-common/utils");
14
20
  var _element = require("@atlaskit/mention/element");
15
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
16
21
  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); }
17
22
  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 && Object.prototype.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; }
23
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
24
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
18
25
  // Workaround for a firefox issue where dom selection is off sync
19
26
  // https://product-fabric.atlassian.net/browse/ED-12442
20
27
  var refreshBrowserSelection = function refreshBrowserSelection() {
@@ -27,62 +34,67 @@ var refreshBrowserSelection = function refreshBrowserSelection() {
27
34
  }
28
35
  }
29
36
  };
30
- var Mention = function Mention(props) {
31
- var accessLevel = props.accessLevel,
32
- eventHandlers = props.eventHandlers,
33
- id = props.id,
34
- text = props.text,
35
- localId = props.localId,
36
- mentionProvider = props.mentionProvider,
37
- profilecardProviderPromise = props.profilecardProvider;
38
- var _useState = (0, _react.useState)(null),
39
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
40
- profilecardProvider = _useState2[0],
41
- setProfilecardProvider = _useState2[1];
42
-
43
- // Resolve the profilecard provider
44
- (0, _react.useEffect)(function () {
45
- if (profilecardProviderPromise) {
46
- profilecardProviderPromise.then(function (profilecardProvider) {
47
- setProfilecardProvider(profilecardProvider);
48
- }).catch(function () {
49
- setProfilecardProvider(null);
37
+ var Mention = exports.default = /*#__PURE__*/function (_PureComponent) {
38
+ (0, _inherits2.default)(Mention, _PureComponent);
39
+ var _super = _createSuper(Mention);
40
+ function Mention(props) {
41
+ var _this;
42
+ (0, _classCallCheck2.default)(this, Mention);
43
+ _this = _super.call(this, props);
44
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderWithProvider", function (providers) {
45
+ var _this$props = _this.props,
46
+ accessLevel = _this$props.accessLevel,
47
+ eventHandlers = _this$props.eventHandlers,
48
+ id = _this$props.id,
49
+ text = _this$props.text,
50
+ localId = _this$props.localId;
51
+ var _ref = providers,
52
+ mentionProvider = _ref.mentionProvider;
53
+ var actionHandlers = {};
54
+ ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(function (handler) {
55
+ actionHandlers[handler] = eventHandlers && eventHandlers[handler] || function () {};
50
56
  });
51
- } else {
52
- setProfilecardProvider(null);
57
+ return /*#__PURE__*/_react.default.createElement(_element.ResourcedMention, (0, _extends2.default)({
58
+ id: id,
59
+ text: text,
60
+ accessLevel: accessLevel,
61
+ localId: localId,
62
+ mentionProvider: mentionProvider
63
+ }, actionHandlers));
64
+ });
65
+ _this.providerFactory = props.providers || new _providerFactory.ProviderFactory();
66
+ return _this;
67
+ }
68
+ (0, _createClass2.default)(Mention, [{
69
+ key: "componentDidMount",
70
+ value: function componentDidMount() {
71
+ // Workaround an issue where the selection is not updated immediately after adding
72
+ // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
73
+ // This affects both insertion and paste behaviour it is applied to the component.
74
+ // https://product-fabric.atlassian.net/browse/ED-14859
75
+ if (_utils.browser.safari) {
76
+ setTimeout(refreshBrowserSelection, 0);
77
+ }
53
78
  }
54
- }, [profilecardProviderPromise]);
55
- (0, _react.useEffect)(function () {
56
- // Workaround an issue where the selection is not updated immediately after adding
57
- // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
58
- // This affects both insertion and paste behaviour it is applied to the component.
59
- // https://product-fabric.atlassian.net/browse/ED-14859
60
- if (_utils.browser.safari) {
61
- setTimeout(refreshBrowserSelection, 0);
79
+ }, {
80
+ key: "componentWillUnmount",
81
+ value: function componentWillUnmount() {
82
+ if (!this.props.providers) {
83
+ // new ProviderFactory is created if no `providers` has been set
84
+ // in this case when component is unmounted it's safe to destroy this providerFactory
85
+ this.providerFactory.destroy();
86
+ }
62
87
  }
63
- }, []);
64
- var actionHandlers = {};
65
- ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(function (handler) {
66
- actionHandlers[handler] = eventHandlers && eventHandlers[handler] || function () {};
67
- });
68
- if ((0, _platformFeatureFlags.getBooleanFF)('platform.editor.mentions-in-editor-popup-on-click') && profilecardProvider) {
69
- return /*#__PURE__*/_react.default.createElement(_mention.MentionWithProfileCard, (0, _extends2.default)({
70
- id: id,
71
- text: text,
72
- accessLevel: accessLevel,
73
- mentionProvider: mentionProvider,
74
- profilecardProvider: profilecardProvider,
75
- localId: localId
76
- }, actionHandlers));
77
- } else {
78
- return /*#__PURE__*/_react.default.createElement(_element.ResourcedMention, (0, _extends2.default)({
79
- id: id,
80
- text: text,
81
- accessLevel: accessLevel,
82
- mentionProvider: mentionProvider,
83
- localId: localId
84
- }, actionHandlers));
85
- }
86
- };
87
- Mention.displayName = 'Mention';
88
- var _default = exports.default = Mention;
88
+ }, {
89
+ key: "render",
90
+ value: function render() {
91
+ return /*#__PURE__*/_react.default.createElement(_providerFactory.WithProviders, {
92
+ providers: ['mentionProvider', 'profilecardProvider'],
93
+ providerFactory: this.providerFactory,
94
+ renderNode: this.renderWithProvider
95
+ });
96
+ }
97
+ }]);
98
+ return Mention;
99
+ }(_react.PureComponent);
100
+ (0, _defineProperty2.default)(Mention, "displayName", 'Mention');
@@ -1,13 +1,16 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { useProvider } from '@atlaskit/editor-common/provider-factory';
2
+ import { WithProviders } from '@atlaskit/editor-common/provider-factory';
3
3
  import { isResolvingMentionProvider, MentionNameStatus } from '@atlaskit/mention';
4
4
  import { isPromise } from '@atlaskit/mention/types';
5
5
  import Mention from '../ui/Mention';
6
6
  const UNKNOWN_USER_ID = '_|unknown|_';
7
- const useResolvedName = ({
7
+ const MentionAssistiveTextComponent = ({
8
8
  id,
9
9
  text,
10
- mentionProvider
10
+ providers,
11
+ accessLevel,
12
+ mentionProvider,
13
+ localId
11
14
  }) => {
12
15
  const [resolvedName, setResolvedName] = useState(text);
13
16
  const processName = name => {
@@ -35,29 +38,40 @@ const useResolvedName = ({
35
38
  });
36
39
  }
37
40
  }, [id, text, mentionProvider]);
38
- return resolvedName;
41
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Mention, {
42
+ id: id,
43
+ text: resolvedName,
44
+ accessLevel: accessLevel,
45
+ providers: providers,
46
+ localId: localId
47
+ })));
39
48
  };
40
49
  export const MentionNodeView = props => {
41
- var _props$options;
50
+ const {
51
+ providerFactory
52
+ } = props;
42
53
  const {
43
54
  id,
44
55
  text,
45
56
  accessLevel,
46
57
  localId
47
58
  } = props.node.attrs;
48
- const mentionProvider = useProvider('mentionProvider');
49
- const profilecardProvider = (_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.profilecardProvider;
50
- const resolvedName = useResolvedName({
51
- id,
52
- text,
53
- mentionProvider
59
+ const renderAssistiveTextWithProviders = providers => {
60
+ const {
61
+ mentionProvider
62
+ } = providers;
63
+ return /*#__PURE__*/React.createElement(MentionAssistiveTextComponent, {
64
+ mentionProvider: mentionProvider,
65
+ id: id,
66
+ text: text,
67
+ providers: providerFactory,
68
+ accessLevel: accessLevel,
69
+ localId: localId
70
+ });
71
+ };
72
+ return /*#__PURE__*/React.createElement(WithProviders, {
73
+ providers: ['mentionProvider', 'profilecardProvider'],
74
+ providerFactory: providerFactory,
75
+ renderNode: renderAssistiveTextWithProviders
54
76
  });
55
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Mention, {
56
- id: id,
57
- text: resolvedName,
58
- accessLevel: accessLevel,
59
- mentionProvider: mentionProvider,
60
- profilecardProvider: profilecardProvider,
61
- localId: localId
62
- })));
63
77
  };
@@ -1,10 +1,10 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import React, { useEffect, useState } from 'react';
3
- import { MentionWithProfileCard } from '@atlaskit/editor-common/mention';
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import React from 'react';
4
+ import { PureComponent } from 'react';
5
+ import { ProviderFactory, WithProviders } from '@atlaskit/editor-common/provider-factory';
4
6
  import { browser } from '@atlaskit/editor-common/utils';
5
7
  import { ResourcedMention } from '@atlaskit/mention/element';
6
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
7
-
8
8
  // Workaround for a firefox issue where dom selection is off sync
9
9
  // https://product-fabric.atlassian.net/browse/ED-12442
10
10
  const refreshBrowserSelection = () => {
@@ -17,31 +17,35 @@ const refreshBrowserSelection = () => {
17
17
  }
18
18
  }
19
19
  };
20
- const Mention = props => {
21
- const {
22
- accessLevel,
23
- eventHandlers,
24
- id,
25
- text,
26
- localId,
27
- mentionProvider,
28
- profilecardProvider: profilecardProviderPromise
29
- } = props;
30
- const [profilecardProvider, setProfilecardProvider] = useState(null);
31
-
32
- // Resolve the profilecard provider
33
- useEffect(() => {
34
- if (profilecardProviderPromise) {
35
- profilecardProviderPromise.then(profilecardProvider => {
36
- setProfilecardProvider(profilecardProvider);
37
- }).catch(() => {
38
- setProfilecardProvider(null);
20
+ export default class Mention extends PureComponent {
21
+ constructor(props) {
22
+ super(props);
23
+ _defineProperty(this, "renderWithProvider", providers => {
24
+ const {
25
+ accessLevel,
26
+ eventHandlers,
27
+ id,
28
+ text,
29
+ localId
30
+ } = this.props;
31
+ const {
32
+ mentionProvider
33
+ } = providers;
34
+ const actionHandlers = {};
35
+ ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(handler => {
36
+ actionHandlers[handler] = eventHandlers && eventHandlers[handler] || (() => {});
39
37
  });
40
- } else {
41
- setProfilecardProvider(null);
42
- }
43
- }, [profilecardProviderPromise]);
44
- useEffect(() => {
38
+ return /*#__PURE__*/React.createElement(ResourcedMention, _extends({
39
+ id: id,
40
+ text: text,
41
+ accessLevel: accessLevel,
42
+ localId: localId,
43
+ mentionProvider: mentionProvider
44
+ }, actionHandlers));
45
+ });
46
+ this.providerFactory = props.providers || new ProviderFactory();
47
+ }
48
+ componentDidMount() {
45
49
  // Workaround an issue where the selection is not updated immediately after adding
46
50
  // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
47
51
  // This affects both insertion and paste behaviour it is applied to the component.
@@ -49,29 +53,20 @@ const Mention = props => {
49
53
  if (browser.safari) {
50
54
  setTimeout(refreshBrowserSelection, 0);
51
55
  }
52
- }, []);
53
- const actionHandlers = {};
54
- ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(handler => {
55
- actionHandlers[handler] = eventHandlers && eventHandlers[handler] || (() => {});
56
- });
57
- if (getBooleanFF('platform.editor.mentions-in-editor-popup-on-click') && profilecardProvider) {
58
- return /*#__PURE__*/React.createElement(MentionWithProfileCard, _extends({
59
- id: id,
60
- text: text,
61
- accessLevel: accessLevel,
62
- mentionProvider: mentionProvider,
63
- profilecardProvider: profilecardProvider,
64
- localId: localId
65
- }, actionHandlers));
66
- } else {
67
- return /*#__PURE__*/React.createElement(ResourcedMention, _extends({
68
- id: id,
69
- text: text,
70
- accessLevel: accessLevel,
71
- mentionProvider: mentionProvider,
72
- localId: localId
73
- }, actionHandlers));
74
56
  }
75
- };
76
- Mention.displayName = 'Mention';
77
- export default Mention;
57
+ componentWillUnmount() {
58
+ if (!this.props.providers) {
59
+ // new ProviderFactory is created if no `providers` has been set
60
+ // in this case when component is unmounted it's safe to destroy this providerFactory
61
+ this.providerFactory.destroy();
62
+ }
63
+ }
64
+ render() {
65
+ return /*#__PURE__*/React.createElement(WithProviders, {
66
+ providers: ['mentionProvider', 'profilecardProvider'],
67
+ providerFactory: this.providerFactory,
68
+ renderNode: this.renderWithProvider
69
+ });
70
+ }
71
+ }
72
+ _defineProperty(Mention, "displayName", 'Mention');
@@ -2,15 +2,18 @@ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import _regeneratorRuntime from "@babel/runtime/regenerator";
4
4
  import React, { useEffect, useState } from 'react';
5
- import { useProvider } from '@atlaskit/editor-common/provider-factory';
5
+ import { WithProviders } from '@atlaskit/editor-common/provider-factory';
6
6
  import { isResolvingMentionProvider, MentionNameStatus } from '@atlaskit/mention';
7
7
  import { isPromise } from '@atlaskit/mention/types';
8
8
  import Mention from '../ui/Mention';
9
9
  var UNKNOWN_USER_ID = '_|unknown|_';
10
- var useResolvedName = function useResolvedName(_ref) {
10
+ var MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref) {
11
11
  var id = _ref.id,
12
12
  text = _ref.text,
13
- mentionProvider = _ref.mentionProvider;
13
+ providers = _ref.providers,
14
+ accessLevel = _ref.accessLevel,
15
+ mentionProvider = _ref.mentionProvider,
16
+ localId = _ref.localId;
14
17
  var _useState = useState(text),
15
18
  _useState2 = _slicedToArray(_useState, 2),
16
19
  resolvedName = _useState2[0],
@@ -66,28 +69,36 @@ var useResolvedName = function useResolvedName(_ref) {
66
69
  });
67
70
  }
68
71
  }, [id, text, mentionProvider]);
69
- return resolvedName;
72
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Mention, {
73
+ id: id,
74
+ text: resolvedName,
75
+ accessLevel: accessLevel,
76
+ providers: providers,
77
+ localId: localId
78
+ })));
70
79
  };
71
80
  export var MentionNodeView = function MentionNodeView(props) {
72
- var _props$options;
81
+ var providerFactory = props.providerFactory;
73
82
  var _props$node$attrs = props.node.attrs,
74
83
  id = _props$node$attrs.id,
75
84
  text = _props$node$attrs.text,
76
85
  accessLevel = _props$node$attrs.accessLevel,
77
86
  localId = _props$node$attrs.localId;
78
- var mentionProvider = useProvider('mentionProvider');
79
- var profilecardProvider = (_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.profilecardProvider;
80
- var resolvedName = useResolvedName({
81
- id: id,
82
- text: text,
83
- mentionProvider: mentionProvider
87
+ var renderAssistiveTextWithProviders = function renderAssistiveTextWithProviders(providers) {
88
+ var _ref3 = providers,
89
+ mentionProvider = _ref3.mentionProvider;
90
+ return /*#__PURE__*/React.createElement(MentionAssistiveTextComponent, {
91
+ mentionProvider: mentionProvider,
92
+ id: id,
93
+ text: text,
94
+ providers: providerFactory,
95
+ accessLevel: accessLevel,
96
+ localId: localId
97
+ });
98
+ };
99
+ return /*#__PURE__*/React.createElement(WithProviders, {
100
+ providers: ['mentionProvider', 'profilecardProvider'],
101
+ providerFactory: providerFactory,
102
+ renderNode: renderAssistiveTextWithProviders
84
103
  });
85
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Mention, {
86
- id: id,
87
- text: resolvedName,
88
- accessLevel: accessLevel,
89
- mentionProvider: mentionProvider,
90
- profilecardProvider: profilecardProvider,
91
- localId: localId
92
- })));
93
104
  };
@@ -1,11 +1,18 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- import React, { useEffect, useState } from 'react';
4
- import { MentionWithProfileCard } from '@atlaskit/editor-common/mention';
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
4
+ import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
5
+ import _inherits from "@babel/runtime/helpers/inherits";
6
+ import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
7
+ import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
8
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
10
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
+ import React from 'react';
12
+ import { PureComponent } from 'react';
13
+ import { ProviderFactory, WithProviders } from '@atlaskit/editor-common/provider-factory';
5
14
  import { browser } from '@atlaskit/editor-common/utils';
6
15
  import { ResourcedMention } from '@atlaskit/mention/element';
7
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
-
9
16
  // Workaround for a firefox issue where dom selection is off sync
10
17
  // https://product-fabric.atlassian.net/browse/ED-12442
11
18
  var refreshBrowserSelection = function refreshBrowserSelection() {
@@ -18,62 +25,68 @@ var refreshBrowserSelection = function refreshBrowserSelection() {
18
25
  }
19
26
  }
20
27
  };
21
- var Mention = function Mention(props) {
22
- var accessLevel = props.accessLevel,
23
- eventHandlers = props.eventHandlers,
24
- id = props.id,
25
- text = props.text,
26
- localId = props.localId,
27
- mentionProvider = props.mentionProvider,
28
- profilecardProviderPromise = props.profilecardProvider;
29
- var _useState = useState(null),
30
- _useState2 = _slicedToArray(_useState, 2),
31
- profilecardProvider = _useState2[0],
32
- setProfilecardProvider = _useState2[1];
33
-
34
- // Resolve the profilecard provider
35
- useEffect(function () {
36
- if (profilecardProviderPromise) {
37
- profilecardProviderPromise.then(function (profilecardProvider) {
38
- setProfilecardProvider(profilecardProvider);
39
- }).catch(function () {
40
- setProfilecardProvider(null);
28
+ var Mention = /*#__PURE__*/function (_PureComponent) {
29
+ _inherits(Mention, _PureComponent);
30
+ var _super = _createSuper(Mention);
31
+ function Mention(props) {
32
+ var _this;
33
+ _classCallCheck(this, Mention);
34
+ _this = _super.call(this, props);
35
+ _defineProperty(_assertThisInitialized(_this), "renderWithProvider", function (providers) {
36
+ var _this$props = _this.props,
37
+ accessLevel = _this$props.accessLevel,
38
+ eventHandlers = _this$props.eventHandlers,
39
+ id = _this$props.id,
40
+ text = _this$props.text,
41
+ localId = _this$props.localId;
42
+ var _ref = providers,
43
+ mentionProvider = _ref.mentionProvider;
44
+ var actionHandlers = {};
45
+ ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(function (handler) {
46
+ actionHandlers[handler] = eventHandlers && eventHandlers[handler] || function () {};
41
47
  });
42
- } else {
43
- setProfilecardProvider(null);
48
+ return /*#__PURE__*/React.createElement(ResourcedMention, _extends({
49
+ id: id,
50
+ text: text,
51
+ accessLevel: accessLevel,
52
+ localId: localId,
53
+ mentionProvider: mentionProvider
54
+ }, actionHandlers));
55
+ });
56
+ _this.providerFactory = props.providers || new ProviderFactory();
57
+ return _this;
58
+ }
59
+ _createClass(Mention, [{
60
+ key: "componentDidMount",
61
+ value: function componentDidMount() {
62
+ // Workaround an issue where the selection is not updated immediately after adding
63
+ // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
64
+ // This affects both insertion and paste behaviour it is applied to the component.
65
+ // https://product-fabric.atlassian.net/browse/ED-14859
66
+ if (browser.safari) {
67
+ setTimeout(refreshBrowserSelection, 0);
68
+ }
44
69
  }
45
- }, [profilecardProviderPromise]);
46
- useEffect(function () {
47
- // Workaround an issue where the selection is not updated immediately after adding
48
- // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
49
- // This affects both insertion and paste behaviour it is applied to the component.
50
- // https://product-fabric.atlassian.net/browse/ED-14859
51
- if (browser.safari) {
52
- setTimeout(refreshBrowserSelection, 0);
70
+ }, {
71
+ key: "componentWillUnmount",
72
+ value: function componentWillUnmount() {
73
+ if (!this.props.providers) {
74
+ // new ProviderFactory is created if no `providers` has been set
75
+ // in this case when component is unmounted it's safe to destroy this providerFactory
76
+ this.providerFactory.destroy();
77
+ }
53
78
  }
54
- }, []);
55
- var actionHandlers = {};
56
- ['onClick', 'onMouseEnter', 'onMouseLeave'].forEach(function (handler) {
57
- actionHandlers[handler] = eventHandlers && eventHandlers[handler] || function () {};
58
- });
59
- if (getBooleanFF('platform.editor.mentions-in-editor-popup-on-click') && profilecardProvider) {
60
- return /*#__PURE__*/React.createElement(MentionWithProfileCard, _extends({
61
- id: id,
62
- text: text,
63
- accessLevel: accessLevel,
64
- mentionProvider: mentionProvider,
65
- profilecardProvider: profilecardProvider,
66
- localId: localId
67
- }, actionHandlers));
68
- } else {
69
- return /*#__PURE__*/React.createElement(ResourcedMention, _extends({
70
- id: id,
71
- text: text,
72
- accessLevel: accessLevel,
73
- mentionProvider: mentionProvider,
74
- localId: localId
75
- }, actionHandlers));
76
- }
77
- };
78
- Mention.displayName = 'Mention';
79
- export default Mention;
79
+ }, {
80
+ key: "render",
81
+ value: function render() {
82
+ return /*#__PURE__*/React.createElement(WithProviders, {
83
+ providers: ['mentionProvider', 'profilecardProvider'],
84
+ providerFactory: this.providerFactory,
85
+ renderNode: this.renderWithProvider
86
+ });
87
+ }
88
+ }]);
89
+ return Mention;
90
+ }(PureComponent);
91
+ _defineProperty(Mention, "displayName", 'Mention');
92
+ export { Mention as default };
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { type ProviderFactory } from '@atlaskit/editor-common/provider-factory';
2
+ import type { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
3
  import type { InlineNodeViewComponentProps } from '@atlaskit/editor-common/react-node-view';
4
4
  import type { MentionPluginOptions } from '../types';
5
5
  export type Props = InlineNodeViewComponentProps & {
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type { AnalyticsEventPayload } from '@atlaskit/analytics-next';
3
- import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
4
3
  import type { NextEditorPlugin, OptionalPlugin, TypeAheadHandler } from '@atlaskit/editor-common/types';
5
4
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
6
5
  import type { ContextIdentifierPlugin } from '@atlaskit/editor-plugin-context-identifier';
@@ -14,7 +13,6 @@ export interface TeamInfoAttrAnalytics {
14
13
  export interface MentionPluginConfig {
15
14
  HighlightComponent?: React.ComponentType<React.PropsWithChildren<unknown>>;
16
15
  insertDisplayName?: boolean;
17
- profilecardProvider?: Promise<ProfilecardProvider>;
18
16
  }
19
17
  export interface MentionPluginOptions extends MentionPluginConfig {
20
18
  sanitizePrivateContent?: boolean;
@@ -1,18 +1,20 @@
1
- /// <reference types="react" />
2
- import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
1
+ import { PureComponent } from 'react';
2
+ import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
3
  import type { MentionEventHandlers } from '@atlaskit/editor-common/ui';
4
- import type { MentionProvider } from '@atlaskit/mention/resource';
5
4
  export interface MentionProps {
6
5
  id: string;
6
+ providers?: ProviderFactory;
7
7
  eventHandlers?: MentionEventHandlers;
8
8
  text: string;
9
9
  accessLevel?: string;
10
10
  localId?: string;
11
- mentionProvider?: Promise<MentionProvider>;
12
- profilecardProvider?: Promise<ProfilecardProvider>;
13
11
  }
14
- declare const Mention: {
15
- (props: MentionProps): JSX.Element;
16
- displayName: string;
17
- };
18
- export default Mention;
12
+ export default class Mention extends PureComponent<MentionProps, {}> {
13
+ static displayName: string;
14
+ private providerFactory;
15
+ constructor(props: MentionProps);
16
+ componentDidMount(): void;
17
+ componentWillUnmount(): void;
18
+ private renderWithProvider;
19
+ render(): JSX.Element;
20
+ }
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import { type ProviderFactory } from '@atlaskit/editor-common/provider-factory';
2
+ import type { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
3
  import type { InlineNodeViewComponentProps } from '@atlaskit/editor-common/react-node-view';
4
4
  import type { MentionPluginOptions } from '../types';
5
5
  export type Props = InlineNodeViewComponentProps & {
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type { AnalyticsEventPayload } from '@atlaskit/analytics-next';
3
- import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
4
3
  import type { NextEditorPlugin, OptionalPlugin, TypeAheadHandler } from '@atlaskit/editor-common/types';
5
4
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
6
5
  import type { ContextIdentifierPlugin } from '@atlaskit/editor-plugin-context-identifier';
@@ -14,7 +13,6 @@ export interface TeamInfoAttrAnalytics {
14
13
  export interface MentionPluginConfig {
15
14
  HighlightComponent?: React.ComponentType<React.PropsWithChildren<unknown>>;
16
15
  insertDisplayName?: boolean;
17
- profilecardProvider?: Promise<ProfilecardProvider>;
18
16
  }
19
17
  export interface MentionPluginOptions extends MentionPluginConfig {
20
18
  sanitizePrivateContent?: boolean;
@@ -1,18 +1,20 @@
1
- /// <reference types="react" />
2
- import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
1
+ import { PureComponent } from 'react';
2
+ import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
3
  import type { MentionEventHandlers } from '@atlaskit/editor-common/ui';
4
- import type { MentionProvider } from '@atlaskit/mention/resource';
5
4
  export interface MentionProps {
6
5
  id: string;
6
+ providers?: ProviderFactory;
7
7
  eventHandlers?: MentionEventHandlers;
8
8
  text: string;
9
9
  accessLevel?: string;
10
10
  localId?: string;
11
- mentionProvider?: Promise<MentionProvider>;
12
- profilecardProvider?: Promise<ProfilecardProvider>;
13
11
  }
14
- declare const Mention: {
15
- (props: MentionProps): JSX.Element;
16
- displayName: string;
17
- };
18
- export default Mention;
12
+ export default class Mention extends PureComponent<MentionProps, {}> {
13
+ static displayName: string;
14
+ private providerFactory;
15
+ constructor(props: MentionProps);
16
+ componentDidMount(): void;
17
+ componentWillUnmount(): void;
18
+ private renderWithProvider;
19
+ render(): JSX.Element;
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-mentions",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Mentions plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -35,14 +35,13 @@
35
35
  "dependencies": {
36
36
  "@atlaskit/adf-schema": "^36.8.0",
37
37
  "@atlaskit/analytics-gas-types": "^5.1.0",
38
- "@atlaskit/editor-common": "^80.4.0",
38
+ "@atlaskit/editor-common": "^80.5.0",
39
39
  "@atlaskit/editor-plugin-analytics": "^1.2.0",
40
40
  "@atlaskit/editor-plugin-context-identifier": "^1.1.0",
41
41
  "@atlaskit/editor-plugin-type-ahead": "^1.2.0",
42
42
  "@atlaskit/editor-prosemirror": "4.0.1",
43
43
  "@atlaskit/icon": "^22.3.0",
44
44
  "@atlaskit/mention": "^23.0.0",
45
- "@atlaskit/platform-feature-flags": "^0.2.5",
46
45
  "@atlaskit/theme": "^12.8.0",
47
46
  "@atlaskit/tokens": "^1.49.0",
48
47
  "@babel/runtime": "^7.0.0",
@@ -105,10 +104,5 @@
105
104
  "@atlassian/tangerine/project-structure"
106
105
  ]
107
106
  },
108
- "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.0",
109
- "platform-feature-flags": {
110
- "platform.editor.mentions-in-editor-popup-on-click": {
111
- "type": "boolean"
112
- }
113
- }
107
+ "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.0"
114
108
  }