@atlaskit/editor-plugin-mentions 1.2.1 → 1.3.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,17 @@
1
1
  # @atlaskit/editor-plugin-mentions
2
2
 
3
+ ## 1.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#98647](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/98647)
8
+ [`19eb20751225`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/19eb20751225) -
9
+ [ux] [ED-23248] -
10
+
11
+ **@atlaskit/editor-core**: Added optional profilecardProvider to Mention plugin in universal
12
+ composable editor **@atlaskit/editor-plugin-mentions**: Made mentions render with profile cards
13
+ on click if the feature flag: `platform.editor.mentions-in-editor-popup-on-click` is turned on
14
+
3
15
  ## 1.2.1
4
16
 
5
17
  ### Patch Changes
@@ -17,13 +17,10 @@ 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 MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref) {
20
+ var useResolvedName = function useResolvedName(_ref) {
21
21
  var id = _ref.id,
22
22
  text = _ref.text,
23
- providers = _ref.providers,
24
- accessLevel = _ref.accessLevel,
25
- mentionProvider = _ref.mentionProvider,
26
- localId = _ref.localId;
23
+ mentionProvider = _ref.mentionProvider;
27
24
  var _useState = (0, _react.useState)(text),
28
25
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
29
26
  resolvedName = _useState2[0],
@@ -79,36 +76,28 @@ var MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref)
79
76
  });
80
77
  }
81
78
  }, [id, text, mentionProvider]);
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
- })));
79
+ return resolvedName;
89
80
  };
90
81
  var MentionNodeView = exports.MentionNodeView = function MentionNodeView(props) {
91
- var providerFactory = props.providerFactory;
82
+ var _props$options;
92
83
  var _props$node$attrs = props.node.attrs,
93
84
  id = _props$node$attrs.id,
94
85
  text = _props$node$attrs.text,
95
86
  accessLevel = _props$node$attrs.accessLevel,
96
87
  localId = _props$node$attrs.localId;
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
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
113
94
  });
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
+ })));
114
103
  };
@@ -7,21 +7,14 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
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"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
11
  var _react = _interopRequireWildcard(require("react"));
18
- var _providerFactory = require("@atlaskit/editor-common/provider-factory");
12
+ var _mention = require("@atlaskit/editor-common/mention");
19
13
  var _utils = require("@atlaskit/editor-common/utils");
20
14
  var _element = require("@atlaskit/mention/element");
15
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
21
16
  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); }
22
17
  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; })(); }
25
18
  // Workaround for a firefox issue where dom selection is off sync
26
19
  // https://product-fabric.atlassian.net/browse/ED-12442
27
20
  var refreshBrowserSelection = function refreshBrowserSelection() {
@@ -34,67 +27,62 @@ var refreshBrowserSelection = function refreshBrowserSelection() {
34
27
  }
35
28
  }
36
29
  };
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 () {};
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);
56
50
  });
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
- }
78
- }
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
- }
51
+ } else {
52
+ setProfilecardProvider(null);
87
53
  }
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
- });
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);
96
62
  }
97
- }]);
98
- return Mention;
99
- }(_react.PureComponent);
100
- (0, _defineProperty2.default)(Mention, "displayName", 'Mention');
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;
@@ -1,16 +1,13 @@
1
1
  import React, { useEffect, useState } from 'react';
2
- import { WithProviders } from '@atlaskit/editor-common/provider-factory';
2
+ import { useProvider } 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 MentionAssistiveTextComponent = ({
7
+ const useResolvedName = ({
8
8
  id,
9
9
  text,
10
- providers,
11
- accessLevel,
12
- mentionProvider,
13
- localId
10
+ mentionProvider
14
11
  }) => {
15
12
  const [resolvedName, setResolvedName] = useState(text);
16
13
  const processName = name => {
@@ -38,40 +35,29 @@ const MentionAssistiveTextComponent = ({
38
35
  });
39
36
  }
40
37
  }, [id, text, mentionProvider]);
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
- })));
38
+ return resolvedName;
48
39
  };
49
40
  export const MentionNodeView = props => {
50
- const {
51
- providerFactory
52
- } = props;
41
+ var _props$options;
53
42
  const {
54
43
  id,
55
44
  text,
56
45
  accessLevel,
57
46
  localId
58
47
  } = props.node.attrs;
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
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
76
54
  });
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
+ })));
77
63
  };
@@ -1,10 +1,10 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
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';
2
+ import React, { useEffect, useState } from 'react';
3
+ import { MentionWithProfileCard } from '@atlaskit/editor-common/mention';
6
4
  import { browser } from '@atlaskit/editor-common/utils';
7
5
  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,35 +17,31 @@ const refreshBrowserSelection = () => {
17
17
  }
18
18
  }
19
19
  };
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] || (() => {});
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);
37
39
  });
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() {
40
+ } else {
41
+ setProfilecardProvider(null);
42
+ }
43
+ }, [profilecardProviderPromise]);
44
+ useEffect(() => {
49
45
  // Workaround an issue where the selection is not updated immediately after adding
50
46
  // a mention when "sanitizePrivateContent" is enabled in the editor on safari.
51
47
  // This affects both insertion and paste behaviour it is applied to the component.
@@ -53,20 +49,29 @@ export default class Mention extends PureComponent {
53
49
  if (browser.safari) {
54
50
  setTimeout(refreshBrowserSelection, 0);
55
51
  }
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));
56
74
  }
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');
75
+ };
76
+ Mention.displayName = 'Mention';
77
+ export default Mention;
@@ -2,18 +2,15 @@ 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 { WithProviders } from '@atlaskit/editor-common/provider-factory';
5
+ import { useProvider } 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 MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref) {
10
+ var useResolvedName = function useResolvedName(_ref) {
11
11
  var id = _ref.id,
12
12
  text = _ref.text,
13
- providers = _ref.providers,
14
- accessLevel = _ref.accessLevel,
15
- mentionProvider = _ref.mentionProvider,
16
- localId = _ref.localId;
13
+ mentionProvider = _ref.mentionProvider;
17
14
  var _useState = useState(text),
18
15
  _useState2 = _slicedToArray(_useState, 2),
19
16
  resolvedName = _useState2[0],
@@ -69,36 +66,28 @@ var MentionAssistiveTextComponent = function MentionAssistiveTextComponent(_ref)
69
66
  });
70
67
  }
71
68
  }, [id, text, mentionProvider]);
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
- })));
69
+ return resolvedName;
79
70
  };
80
71
  export var MentionNodeView = function MentionNodeView(props) {
81
- var providerFactory = props.providerFactory;
72
+ var _props$options;
82
73
  var _props$node$attrs = props.node.attrs,
83
74
  id = _props$node$attrs.id,
84
75
  text = _props$node$attrs.text,
85
76
  accessLevel = _props$node$attrs.accessLevel,
86
77
  localId = _props$node$attrs.localId;
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
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
103
84
  });
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
+ })));
104
93
  };
@@ -1,18 +1,11 @@
1
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 _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';
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import React, { useEffect, useState } from 'react';
4
+ import { MentionWithProfileCard } from '@atlaskit/editor-common/mention';
14
5
  import { browser } from '@atlaskit/editor-common/utils';
15
6
  import { ResourcedMention } from '@atlaskit/mention/element';
7
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
8
+
16
9
  // Workaround for a firefox issue where dom selection is off sync
17
10
  // https://product-fabric.atlassian.net/browse/ED-12442
18
11
  var refreshBrowserSelection = function refreshBrowserSelection() {
@@ -25,68 +18,62 @@ var refreshBrowserSelection = function refreshBrowserSelection() {
25
18
  }
26
19
  }
27
20
  };
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 () {};
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);
47
41
  });
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
- }
69
- }
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
- }
42
+ } else {
43
+ setProfilecardProvider(null);
78
44
  }
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
- });
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);
87
53
  }
88
- }]);
89
- return Mention;
90
- }(PureComponent);
91
- _defineProperty(Mention, "displayName", 'Mention');
92
- export { Mention as default };
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;
@@ -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,5 +1,6 @@
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';
3
4
  import type { NextEditorPlugin, OptionalPlugin, TypeAheadHandler } from '@atlaskit/editor-common/types';
4
5
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
5
6
  import type { ContextIdentifierPlugin } from '@atlaskit/editor-plugin-context-identifier';
@@ -13,6 +14,7 @@ export interface TeamInfoAttrAnalytics {
13
14
  export interface MentionPluginConfig {
14
15
  HighlightComponent?: React.ComponentType<React.PropsWithChildren<unknown>>;
15
16
  insertDisplayName?: boolean;
17
+ profilecardProvider?: Promise<ProfilecardProvider>;
16
18
  }
17
19
  export interface MentionPluginOptions extends MentionPluginConfig {
18
20
  sanitizePrivateContent?: boolean;
@@ -1,20 +1,18 @@
1
- import { PureComponent } from 'react';
2
- import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
1
+ /// <reference types="react" />
2
+ import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
3
3
  import type { MentionEventHandlers } from '@atlaskit/editor-common/ui';
4
+ import type { MentionProvider } from '@atlaskit/mention/resource';
4
5
  export interface MentionProps {
5
6
  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>;
11
13
  }
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
- }
14
+ declare const Mention: {
15
+ (props: MentionProps): JSX.Element;
16
+ displayName: string;
17
+ };
18
+ export default Mention;
@@ -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,5 +1,6 @@
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';
3
4
  import type { NextEditorPlugin, OptionalPlugin, TypeAheadHandler } from '@atlaskit/editor-common/types';
4
5
  import type { AnalyticsPlugin } from '@atlaskit/editor-plugin-analytics';
5
6
  import type { ContextIdentifierPlugin } from '@atlaskit/editor-plugin-context-identifier';
@@ -13,6 +14,7 @@ export interface TeamInfoAttrAnalytics {
13
14
  export interface MentionPluginConfig {
14
15
  HighlightComponent?: React.ComponentType<React.PropsWithChildren<unknown>>;
15
16
  insertDisplayName?: boolean;
17
+ profilecardProvider?: Promise<ProfilecardProvider>;
16
18
  }
17
19
  export interface MentionPluginOptions extends MentionPluginConfig {
18
20
  sanitizePrivateContent?: boolean;
@@ -1,20 +1,18 @@
1
- import { PureComponent } from 'react';
2
- import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
1
+ /// <reference types="react" />
2
+ import { type ProfilecardProvider } from '@atlaskit/editor-common/src/provider-factory/profile-card-provider';
3
3
  import type { MentionEventHandlers } from '@atlaskit/editor-common/ui';
4
+ import type { MentionProvider } from '@atlaskit/mention/resource';
4
5
  export interface MentionProps {
5
6
  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>;
11
13
  }
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
- }
14
+ declare const Mention: {
15
+ (props: MentionProps): JSX.Element;
16
+ displayName: string;
17
+ };
18
+ export default Mention;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-mentions",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
4
4
  "description": "Mentions plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -40,10 +40,11 @@
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
- "@atlaskit/icon": "^22.2.0",
43
+ "@atlaskit/icon": "^22.3.0",
44
44
  "@atlaskit/mention": "^23.0.0",
45
+ "@atlaskit/platform-feature-flags": "^0.2.5",
45
46
  "@atlaskit/theme": "^12.8.0",
46
- "@atlaskit/tokens": "^1.48.0",
47
+ "@atlaskit/tokens": "^1.49.0",
47
48
  "@babel/runtime": "^7.0.0",
48
49
  "@emotion/react": "^11.7.1",
49
50
  "uuid": "^3.1.0"
@@ -104,5 +105,10 @@
104
105
  "@atlassian/tangerine/project-structure"
105
106
  ]
106
107
  },
107
- "prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.0"
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
+ }
108
114
  }