@atlaskit/editor-plugin-mentions 2.10.9 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlaskit/editor-plugin-mentions
2
2
 
3
+ ## 2.11.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#97984](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/97984)
8
+ [`8ffeab9aaf1ab`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/8ffeab9aaf1ab) -
9
+ [ux] [ED-23573] Added new actions (resolveMarks and registerMarks) to basePlugin. Callbacks added
10
+ to mentions, card, emoji and base plugins to handle conversion to inline code. Deprecated code
11
+ removed from editor-common.
12
+ - Updated dependencies
13
+
14
+ ## 2.11.0
15
+
16
+ ### Minor Changes
17
+
18
+ - [#99344](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/99344)
19
+ [`fbeb84f180cd2`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/fbeb84f180cd2) -
20
+ Added optional `isEligibleXProductUserInvite` and `inviteXProductUser` props which will be used in
21
+ CCEDITIONS-4746 (x-product-user-invite experiment). Project poster link -
22
+ https://hello.atlassian.net/wiki/spaces/CV1/pages/3685626022/Project+poster+-+Cross+Product+User+Search+Invites
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies
27
+
3
28
  ## 2.10.9
4
29
 
5
30
  ### Patch Changes
@@ -1,27 +1,89 @@
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.mentionsPlugin = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
8
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _react = _interopRequireDefault(require("react"));
11
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactIntlNext = require("react-intl-next");
10
14
  var _uuid = _interopRequireDefault(require("uuid"));
11
15
  var _adfSchema = require("@atlaskit/adf-schema");
12
16
  var _analytics = require("@atlaskit/editor-common/analytics");
13
17
  var _messages = require("@atlaskit/editor-common/messages");
18
+ var _providerFactory = require("@atlaskit/editor-common/provider-factory");
14
19
  var _quickInsert = require("@atlaskit/editor-common/quick-insert");
20
+ var _resource = require("@atlaskit/mention/resource");
21
+ var _types = require("@atlaskit/mention/types");
22
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
15
23
  var _key = require("./pm-plugins/key");
16
24
  var _main = require("./pm-plugins/main");
17
25
  var _SecondaryToolbarComponent = require("./ui/SecondaryToolbarComponent");
18
26
  var _typeAhead = require("./ui/type-ahead");
27
+ 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); }
28
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
29
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
30
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
- var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref) {
22
- var options = _ref.config,
31
+ var processName = function processName(name, intl) {
32
+ var unknownLabel = intl.formatMessage(_messages.mentionMessages.unknownLabel);
33
+ if (name.status === _types.MentionNameStatus.OK) {
34
+ return "@".concat(name.name || unknownLabel);
35
+ } else {
36
+ return "@".concat(unknownLabel);
37
+ }
38
+ };
39
+
40
+ /**
41
+ * We will need to clean this up once mentionProvider is
42
+ * put inside mention plugin.
43
+ * See: https://product-fabric.atlassian.net/browse/ED-26011
44
+ */
45
+ function Component(_ref) {
46
+ var mentionProvider = _ref.mentionProvider,
23
47
  api = _ref.api;
48
+ var mentionProviderMemo = (0, _react.useMemo)(function () {
49
+ return mentionProvider;
50
+ // eslint-disable-next-line react-hooks/exhaustive-deps
51
+ }, []);
52
+ var intl = (0, _reactIntlNext.useIntl)();
53
+ (0, _react.useEffect)(function () {
54
+ mentionProviderMemo === null || mentionProviderMemo === void 0 || mentionProviderMemo.then(function (mentionProviderSync) {
55
+ var _api$base;
56
+ api === null || api === void 0 || (_api$base = api.base) === null || _api$base === void 0 || (_api$base = _api$base.actions) === null || _api$base === void 0 || _api$base.registerMarks(function (_ref2) {
57
+ var tr = _ref2.tr,
58
+ node = _ref2.node,
59
+ pos = _ref2.pos;
60
+ var doc = tr.doc;
61
+ var schema = doc.type.schema;
62
+ var mentionNodeType = schema.nodes.mention;
63
+ var id = node.attrs.id;
64
+ if (node.type === mentionNodeType) {
65
+ if ((0, _resource.isResolvingMentionProvider)(mentionProviderSync)) {
66
+ var nameDetail = mentionProviderSync === null || mentionProviderSync === void 0 ? void 0 : mentionProviderSync.resolveMentionName(id);
67
+ var newText;
68
+ if ((0, _types.isPromise)(nameDetail)) {
69
+ newText = "@".concat(intl.formatMessage(_messages.mentionMessages.unknownLabel));
70
+ } else {
71
+ newText = processName(nameDetail, intl);
72
+ }
73
+ var currentPos = tr.mapping.map(pos);
74
+ tr.replaceWith(currentPos, currentPos + node.nodeSize, schema.text(newText, node.marks));
75
+ }
76
+ }
77
+ });
78
+ });
79
+ }, [mentionProviderMemo, api, intl]);
80
+ return null;
81
+ }
82
+ var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref3) {
83
+ var options = _ref3.config,
84
+ api = _ref3.api;
24
85
  var sessionId = (0, _uuid.default)();
86
+ var previousMediaProvider;
25
87
  var fireEvent = function fireEvent(payload, channel) {
26
88
  var _api$analytics;
27
89
  var fireAnalyticsEvent = api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || (_api$analytics = _api$analytics.actions) === null || _api$analytics === void 0 ? void 0 : _api$analytics.fireAnalyticsEvent;
@@ -53,13 +115,32 @@ var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref) {
53
115
  return [{
54
116
  name: 'mention',
55
117
  plugin: function plugin(pmPluginFactoryParams) {
56
- return (0, _main.createMentionPlugin)(pmPluginFactoryParams, fireEvent, options);
118
+ return (0, _main.createMentionPlugin)({
119
+ pmPluginFactoryParams: pmPluginFactoryParams,
120
+ fireEvent: fireEvent,
121
+ options: options,
122
+ api: api
123
+ });
57
124
  }
58
125
  }];
59
126
  },
60
- secondaryToolbarComponent: function secondaryToolbarComponent(_ref2) {
61
- var editorView = _ref2.editorView,
62
- disabled = _ref2.disabled;
127
+ contentComponent: function contentComponent(_ref4) {
128
+ var providerFactory = _ref4.providerFactory;
129
+ return /*#__PURE__*/_react.default.createElement(_providerFactory.WithProviders, {
130
+ providers: ['mentionProvider'],
131
+ providerFactory: providerFactory,
132
+ renderNode: function renderNode(_ref5) {
133
+ var mentionProvider = _ref5.mentionProvider;
134
+ return /*#__PURE__*/_react.default.createElement(Component, {
135
+ mentionProvider: mentionProvider,
136
+ api: api
137
+ });
138
+ }
139
+ });
140
+ },
141
+ secondaryToolbarComponent: function secondaryToolbarComponent(_ref6) {
142
+ var editorView = _ref6.editorView,
143
+ disabled = _ref6.disabled;
63
144
  return /*#__PURE__*/_react.default.createElement(_SecondaryToolbarComponent.SecondaryToolbarComponent, {
64
145
  editorView: editorView,
65
146
  api: api,
@@ -79,7 +160,51 @@ var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref) {
79
160
  if (options !== null && options !== void 0 && options.handleMentionsChanged) {
80
161
  options.handleMentionsChanged(mentionChanges);
81
162
  }
82
- }
163
+ },
164
+ setProvider: function () {
165
+ var _setProvider = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(providerPromise) {
166
+ var _api$core$actions$exe;
167
+ var provider;
168
+ return _regenerator.default.wrap(function _callee$(_context) {
169
+ while (1) switch (_context.prev = _context.next) {
170
+ case 0:
171
+ if ((0, _platformFeatureFlags.fg)('platform_editor_mention_provider_via_plugin_config')) {
172
+ _context.next = 2;
173
+ break;
174
+ }
175
+ return _context.abrupt("return", false);
176
+ case 2:
177
+ _context.next = 4;
178
+ return providerPromise;
179
+ case 4:
180
+ provider = _context.sent;
181
+ if (!(previousMediaProvider === provider)) {
182
+ _context.next = 7;
183
+ break;
184
+ }
185
+ return _context.abrupt("return", false);
186
+ case 7:
187
+ previousMediaProvider = provider;
188
+ return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref7) {
189
+ var tr = _ref7.tr;
190
+ return tr.setMeta(_key.mentionPluginKey, {
191
+ action: _main.ACTIONS.SET_PROVIDER,
192
+ params: {
193
+ provider: provider
194
+ }
195
+ });
196
+ })) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false);
197
+ case 9:
198
+ case "end":
199
+ return _context.stop();
200
+ }
201
+ }, _callee);
202
+ }));
203
+ function setProvider(_x) {
204
+ return _setProvider.apply(this, arguments);
205
+ }
206
+ return setProvider;
207
+ }()
83
208
  },
84
209
  getSharedState: function getSharedState(editorState) {
85
210
  if (!editorState) {
@@ -91,8 +216,8 @@ var mentionsPlugin = exports.mentionsPlugin = function mentionsPlugin(_ref) {
91
216
  });
92
217
  },
93
218
  pluginsOptions: {
94
- quickInsert: function quickInsert(_ref3) {
95
- var formatMessage = _ref3.formatMessage;
219
+ quickInsert: function quickInsert(_ref8) {
220
+ var formatMessage = _ref8.formatMessage;
96
221
  return [{
97
222
  id: 'mention',
98
223
  title: formatMessage(_messages.toolbarInsertBlockMessages.mention),
@@ -6,25 +6,29 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.MentionNodeView = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
+ var _hooks = require("@atlaskit/editor-common/hooks");
9
10
  var _providerFactory = require("@atlaskit/editor-common/provider-factory");
10
11
  var _Mention = require("../ui/Mention");
11
12
  var MentionNodeView = exports.MentionNodeView = function MentionNodeView(props) {
12
- var providerFactory = props.providerFactory;
13
+ var providerFactory = props.providerFactory,
14
+ pluginInjectionApi = props.pluginInjectionApi;
13
15
  var _props$node$attrs = props.node.attrs,
14
16
  id = _props$node$attrs.id,
15
17
  text = _props$node$attrs.text,
16
18
  accessLevel = _props$node$attrs.accessLevel,
17
19
  localId = _props$node$attrs.localId;
20
+ var _useSharedPluginState = (0, _hooks.useSharedPluginState)(pluginInjectionApi, ['mention']),
21
+ mentionState = _useSharedPluginState.mentionState;
22
+ var mentionProvider = mentionState === null || mentionState === void 0 ? void 0 : mentionState.mentionProvider;
18
23
  var renderAssistiveTextWithProviders = function renderAssistiveTextWithProviders(providers) {
19
24
  var _props$options;
20
- var _ref = providers,
21
- mentionProvider = _ref.mentionProvider;
25
+ var mentionProviderPromise = mentionProvider ? Promise.resolve(mentionProvider) : providers.mentionProvider;
22
26
  var profilecardProvider = (_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.profilecardProvider;
23
27
  return /*#__PURE__*/_react.default.createElement(_Mention.Mention, {
24
28
  id: id,
25
29
  text: text,
26
30
  accessLevel: accessLevel,
27
- mentionProvider: mentionProvider,
31
+ mentionProvider: mentionProviderPromise,
28
32
  profilecardProvider: profilecardProvider,
29
33
  localId: localId
30
34
  });
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.ACTIONS = void 0;
7
8
  exports.createMentionPlugin = createMentionPlugin;
8
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -19,11 +20,11 @@ var _key = require("./key");
19
20
  var _utils2 = require("./utils");
20
21
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
- var ACTIONS = {
23
+ var ACTIONS = exports.ACTIONS = {
23
24
  SET_PROVIDER: 'SET_PROVIDER'
24
25
  };
25
26
  var PACKAGE_NAME = "@atlaskit/editor-plugin-mentions";
26
- var PACKAGE_VERSION = "2.10.9";
27
+ var PACKAGE_VERSION = "2.11.1";
27
28
  var setProvider = function setProvider(provider) {
28
29
  return function (state, dispatch) {
29
30
  if (dispatch) {
@@ -37,7 +38,11 @@ var setProvider = function setProvider(provider) {
37
38
  return true;
38
39
  };
39
40
  };
40
- function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
41
+ function createMentionPlugin(_ref) {
42
+ var pmPluginFactoryParams = _ref.pmPluginFactoryParams,
43
+ fireEvent = _ref.fireEvent,
44
+ options = _ref.options,
45
+ api = _ref.api;
41
46
  var mentionProvider;
42
47
  var sendAnalytics = function sendAnalytics(event, actionSubject, action, attributes
43
48
  // Ignored via go/ees005
@@ -68,12 +73,12 @@ function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
68
73
  // Ignored via go/ees005
69
74
  // eslint-disable-next-line @typescript-eslint/max-params
70
75
  apply: function apply(tr, pluginState, oldState, newState) {
71
- var _ref = tr.getMeta(_key.mentionPluginKey) || {
76
+ var _ref2 = tr.getMeta(_key.mentionPluginKey) || {
72
77
  action: null,
73
78
  params: null
74
79
  },
75
- action = _ref.action,
76
- params = _ref.params;
80
+ action = _ref2.action,
81
+ params = _ref2.params;
77
82
  var hasNewPluginState = false;
78
83
  var newPluginState = pluginState;
79
84
  var hasPositionChanged = oldState.selection.from !== newState.selection.from || oldState.selection.to !== newState.selection.to;
@@ -104,6 +109,7 @@ function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
104
109
  Component: _mention.MentionNodeView,
105
110
  extraComponentProps: {
106
111
  providerFactory: pmPluginFactoryParams.providerFactory,
112
+ pluginInjectionApi: api,
107
113
  options: options
108
114
  }
109
115
  })
@@ -148,7 +154,12 @@ function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
148
154
  }
149
155
  return;
150
156
  };
151
- pmPluginFactoryParams.providerFactory.subscribe('mentionProvider', providerHandler);
157
+ var providerViaConfig = (0, _platformFeatureFlags.fg)('platform_editor_mention_provider_via_plugin_config');
158
+ if (providerViaConfig && options !== null && options !== void 0 && options.mentionProvider) {
159
+ providerHandler('mentionProvider', options === null || options === void 0 ? void 0 : options.mentionProvider);
160
+ } else {
161
+ pmPluginFactoryParams.providerFactory.subscribe('mentionProvider', providerHandler);
162
+ }
152
163
  return {
153
164
  destroy: function destroy() {
154
165
  if (pmPluginFactoryParams.providerFactory) {
@@ -163,16 +174,16 @@ function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
163
174
  if (options !== null && options !== void 0 && options.handleMentionsChanged && (0, _platformFeatureFlags.fg)('confluence_updated_mentions_livepages')) {
164
175
  var mentionSchema = newState.schema.nodes.mention;
165
176
  var mentionNodesBefore = (0, _utils.findChildrenByType)(prevState.doc, mentionSchema);
166
- var mentionLocalIdsAfter = new Set((0, _utils.findChildrenByType)(newState.doc, mentionSchema).map(function (_ref2) {
167
- var node = _ref2.node;
177
+ var mentionLocalIdsAfter = new Set((0, _utils.findChildrenByType)(newState.doc, mentionSchema).map(function (_ref3) {
178
+ var node = _ref3.node;
168
179
  return node.attrs.localId;
169
180
  }));
170
181
  if (mentionNodesBefore.length > mentionLocalIdsAfter.size) {
171
- var deletedMentions = mentionNodesBefore.filter(function (_ref3) {
172
- var node = _ref3.node;
173
- return !mentionLocalIdsAfter.has(node.attrs.localId);
174
- }).map(function (_ref4) {
182
+ var deletedMentions = mentionNodesBefore.filter(function (_ref4) {
175
183
  var node = _ref4.node;
184
+ return !mentionLocalIdsAfter.has(node.attrs.localId);
185
+ }).map(function (_ref5) {
186
+ var node = _ref5.node;
176
187
  return {
177
188
  type: 'deleted',
178
189
  id: node.attrs.id,
@@ -167,6 +167,7 @@ var buildNodesForTeamMention = function buildNodesForTeamMention(schema, selecte
167
167
  // build team link
168
168
  var defaultTeamLink = "".concat(window.location.origin, "/people/team/").concat(teamId);
169
169
  var teamLink = context && context.teamLink ? context.teamLink : defaultTeamLink;
170
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
170
171
  var teamLinkNode = (0, _platformFeatureFlags.fg)('team-mention-inline-smartlink') ? schema.nodes.inlineCard.create({
171
172
  url: teamLink
172
173
  }) :
@@ -238,7 +239,7 @@ var createTypeAheadConfig = exports.createTypeAheadConfig = function createTypeA
238
239
  var mentionProvider = pluginState.mentionProvider;
239
240
  var _ref8 = (_api$contextIdentifie = api === null || api === void 0 || (_api$contextIdentifie2 = api.contextIdentifier) === null || _api$contextIdentifie2 === void 0 ? void 0 : _api$contextIdentifie2.sharedState.currentState()) !== null && _api$contextIdentifie !== void 0 ? _api$contextIdentifie : {},
240
241
  contextIdentifierProvider = _ref8.contextIdentifierProvider;
241
- return new Promise(function (resolve) {
242
+ return new Promise(function (resolve, reject) {
242
243
  var key = "loadingMentionsForTypeAhead_".concat((0, _uuid.default)());
243
244
  var mentionsSubscribeCallback = function mentionsSubscribeCallback(mentions) {
244
245
  var resultQuery = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
@@ -274,7 +275,13 @@ var createTypeAheadConfig = exports.createTypeAheadConfig = function createTypeA
274
275
  }
275
276
  };
276
277
  subscriptionKeys.add(key);
277
- mentionProvider.subscribe(key, mentionsSubscribeCallback);
278
+ mentionProvider.subscribe(key, mentionsSubscribeCallback, function () {
279
+ if ((0, _platformFeatureFlags.fg)('platform_editor_offline_editing_ga')) {
280
+ mentionProvider.unsubscribe(key);
281
+ subscriptionKeys.delete(key);
282
+ reject('FETCH_ERROR');
283
+ }
284
+ });
278
285
  mentionProvider.filter(query || '', _objectSpread(_objectSpread({}, contextIdentifierProvider), {}, {
279
286
  sessionId: sessionId
280
287
  }));
@@ -299,7 +306,8 @@ var createTypeAheadConfig = exports.createTypeAheadConfig = function createTypeA
299
306
  name = _item$mention.name,
300
307
  nickname = _item$mention.nickname,
301
308
  accessLevel = _item$mention.accessLevel,
302
- userType = _item$mention.userType;
309
+ userType = _item$mention.userType,
310
+ isXProductUser = _item$mention.isXProductUser;
303
311
  var trimmedNickname = nickname && nickname.startsWith('@') ? nickname.slice(1) : nickname;
304
312
  var renderName = mentionInsertDisplayName || !trimmedNickname ? name : trimmedNickname;
305
313
  var _ref10 = (_api$contextIdentifie3 = api === null || api === void 0 || (_api$contextIdentifie4 = api.contextIdentifier) === null || _api$contextIdentifie4 === void 0 ? void 0 : _api$contextIdentifie4.sharedState.currentState()) !== null && _api$contextIdentifie3 !== void 0 ? _api$contextIdentifie3 : {},
@@ -356,6 +364,9 @@ var createTypeAheadConfig = exports.createTypeAheadConfig = function createTypeA
356
364
  if (mentionProvider && (0, _utils4.isTeamType)(userType)) {
357
365
  return insert(buildNodesForTeamMention(schema, item.mention, mentionProvider, sanitizePrivateContent));
358
366
  }
367
+ if (isXProductUser && mentionProvider && mentionProvider.inviteXProductUser) {
368
+ mentionProvider.inviteXProductUser(id);
369
+ }
359
370
 
360
371
  // Don't insert into document if document data is sanitized.
361
372
  var text = sanitizePrivateContent ? '' : "@".concat(renderName);
@@ -363,15 +374,21 @@ var createTypeAheadConfig = exports.createTypeAheadConfig = function createTypeA
363
374
  // Cache (locally) for later rendering
364
375
  mentionProvider.cacheMentionName(id, renderName);
365
376
  }
366
- var annotationMarksForPos = (0, _platformFeatureFlags.fg)('editor_inline_comments_paste_insert_nodes') ? (0, _utils.getAnnotationMarksForPos)(state.tr.selection.$head) : undefined;
377
+ var annotationMarksForPos = (0, _platformFeatureFlags.fg)(
378
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
379
+ 'editor_inline_comments_paste_insert_nodes') ? (0, _utils.getAnnotationMarksForPos)(state.tr.selection.$head) : undefined;
367
380
  var mentionNode = schema.nodes.mention.createChecked({
368
381
  text: text,
369
382
  id: id,
370
383
  accessLevel: accessLevel,
371
384
  userType: userType === 'DEFAULT' ? null : userType,
372
385
  localId: mentionLocalId
373
- }, null, (0, _platformFeatureFlags.fg)('editor_inline_comments_paste_insert_nodes') ? annotationMarksForPos : undefined);
374
- var space = schema.text(' ', (0, _platformFeatureFlags.fg)('editor_inline_comments_paste_insert_nodes') ? annotationMarksForPos : undefined);
386
+ }, null,
387
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
388
+ (0, _platformFeatureFlags.fg)('editor_inline_comments_paste_insert_nodes') ? annotationMarksForPos : undefined);
389
+ var space = schema.text(' ',
390
+ // eslint-disable-next-line @atlaskit/platform/ensure-feature-flag-prefix
391
+ (0, _platformFeatureFlags.fg)('editor_inline_comments_paste_insert_nodes') ? annotationMarksForPos : undefined);
375
392
  return insert(_model.Fragment.from([mentionNode, space]));
376
393
  },
377
394
  dismiss: function dismiss(_ref11) {
@@ -1,18 +1,85 @@
1
- import React from 'react';
1
+ import React, { useEffect, useMemo } from 'react';
2
+ import { useIntl } from 'react-intl-next';
2
3
  import uuid from 'uuid';
3
4
  import { mention } from '@atlaskit/adf-schema';
4
5
  import { INPUT_METHOD } from '@atlaskit/editor-common/analytics';
5
- import { toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
6
+ import { toolbarInsertBlockMessages as messages, mentionMessages } from '@atlaskit/editor-common/messages';
7
+ import { WithProviders } from '@atlaskit/editor-common/provider-factory';
6
8
  import { IconMention } from '@atlaskit/editor-common/quick-insert';
9
+ import { isResolvingMentionProvider } from '@atlaskit/mention/resource';
10
+ import { MentionNameStatus, isPromise } from '@atlaskit/mention/types';
11
+ import { fg } from '@atlaskit/platform-feature-flags';
7
12
  import { mentionPluginKey } from './pm-plugins/key';
8
- import { createMentionPlugin } from './pm-plugins/main';
13
+ import { ACTIONS, createMentionPlugin } from './pm-plugins/main';
9
14
  import { SecondaryToolbarComponent } from './ui/SecondaryToolbarComponent';
10
15
  import { createTypeAheadConfig } from './ui/type-ahead';
16
+ const processName = (name, intl) => {
17
+ const unknownLabel = intl.formatMessage(mentionMessages.unknownLabel);
18
+ if (name.status === MentionNameStatus.OK) {
19
+ return `@${name.name || unknownLabel}`;
20
+ } else {
21
+ return `@${unknownLabel}`;
22
+ }
23
+ };
24
+
25
+ /**
26
+ * We will need to clean this up once mentionProvider is
27
+ * put inside mention plugin.
28
+ * See: https://product-fabric.atlassian.net/browse/ED-26011
29
+ */
30
+ function Component({
31
+ mentionProvider,
32
+ api
33
+ }) {
34
+ const mentionProviderMemo = useMemo(() => {
35
+ return mentionProvider;
36
+ // eslint-disable-next-line react-hooks/exhaustive-deps
37
+ }, []);
38
+ const intl = useIntl();
39
+ useEffect(() => {
40
+ mentionProviderMemo === null || mentionProviderMemo === void 0 ? void 0 : mentionProviderMemo.then(mentionProviderSync => {
41
+ var _api$base, _api$base$actions;
42
+ api === null || api === void 0 ? void 0 : (_api$base = api.base) === null || _api$base === void 0 ? void 0 : (_api$base$actions = _api$base.actions) === null || _api$base$actions === void 0 ? void 0 : _api$base$actions.registerMarks(({
43
+ tr,
44
+ node,
45
+ pos
46
+ }) => {
47
+ const {
48
+ doc
49
+ } = tr;
50
+ const {
51
+ schema
52
+ } = doc.type;
53
+ const {
54
+ mention: mentionNodeType
55
+ } = schema.nodes;
56
+ const {
57
+ id
58
+ } = node.attrs;
59
+ if (node.type === mentionNodeType) {
60
+ if (isResolvingMentionProvider(mentionProviderSync)) {
61
+ const nameDetail = mentionProviderSync === null || mentionProviderSync === void 0 ? void 0 : mentionProviderSync.resolveMentionName(id);
62
+ let newText;
63
+ if (isPromise(nameDetail)) {
64
+ newText = `@${intl.formatMessage(mentionMessages.unknownLabel)}`;
65
+ } else {
66
+ newText = processName(nameDetail, intl);
67
+ }
68
+ const currentPos = tr.mapping.map(pos);
69
+ tr.replaceWith(currentPos, currentPos + node.nodeSize, schema.text(newText, node.marks));
70
+ }
71
+ }
72
+ });
73
+ });
74
+ }, [mentionProviderMemo, api, intl]);
75
+ return null;
76
+ }
11
77
  const mentionsPlugin = ({
12
78
  config: options,
13
79
  api
14
80
  }) => {
15
81
  const sessionId = uuid();
82
+ let previousMediaProvider;
16
83
  const fireEvent = (payload, channel) => {
17
84
  var _api$analytics, _api$analytics$action;
18
85
  const fireAnalyticsEvent = api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : (_api$analytics$action = _api$analytics.actions) === null || _api$analytics$action === void 0 ? void 0 : _api$analytics$action.fireAnalyticsEvent;
@@ -43,9 +110,30 @@ const mentionsPlugin = ({
43
110
  pmPlugins() {
44
111
  return [{
45
112
  name: 'mention',
46
- plugin: pmPluginFactoryParams => createMentionPlugin(pmPluginFactoryParams, fireEvent, options)
113
+ plugin: pmPluginFactoryParams => createMentionPlugin({
114
+ pmPluginFactoryParams,
115
+ fireEvent,
116
+ options,
117
+ api
118
+ })
47
119
  }];
48
120
  },
121
+ contentComponent({
122
+ providerFactory
123
+ }) {
124
+ return /*#__PURE__*/React.createElement(WithProviders, {
125
+ providers: ['mentionProvider'],
126
+ providerFactory: providerFactory,
127
+ renderNode: ({
128
+ mentionProvider
129
+ }) => {
130
+ return /*#__PURE__*/React.createElement(Component, {
131
+ mentionProvider: mentionProvider,
132
+ api: api
133
+ });
134
+ }
135
+ });
136
+ },
49
137
  secondaryToolbarComponent({
50
138
  editorView,
51
139
  disabled
@@ -69,6 +157,26 @@ const mentionsPlugin = ({
69
157
  if (options !== null && options !== void 0 && options.handleMentionsChanged) {
70
158
  options.handleMentionsChanged(mentionChanges);
71
159
  }
160
+ },
161
+ setProvider: async providerPromise => {
162
+ var _api$core$actions$exe;
163
+ if (!fg('platform_editor_mention_provider_via_plugin_config')) {
164
+ return false;
165
+ }
166
+ const provider = await providerPromise;
167
+ // Prevent someone trying to set the exact same provider twice for performance reasons
168
+ if (previousMediaProvider === provider) {
169
+ return false;
170
+ }
171
+ previousMediaProvider = provider;
172
+ return (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(({
173
+ tr
174
+ }) => tr.setMeta(mentionPluginKey, {
175
+ action: ACTIONS.SET_PROVIDER,
176
+ params: {
177
+ provider
178
+ }
179
+ }))) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false;
72
180
  }
73
181
  },
74
182
  getSharedState(editorState) {
@@ -1,9 +1,11 @@
1
1
  import React from 'react';
2
+ import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
2
3
  import { WithProviders } from '@atlaskit/editor-common/provider-factory';
3
4
  import { Mention } from '../ui/Mention';
4
5
  export const MentionNodeView = props => {
5
6
  const {
6
- providerFactory
7
+ providerFactory,
8
+ pluginInjectionApi
7
9
  } = props;
8
10
  const {
9
11
  id,
@@ -11,17 +13,19 @@ export const MentionNodeView = props => {
11
13
  accessLevel,
12
14
  localId
13
15
  } = props.node.attrs;
16
+ const {
17
+ mentionState
18
+ } = useSharedPluginState(pluginInjectionApi, ['mention']);
19
+ const mentionProvider = mentionState === null || mentionState === void 0 ? void 0 : mentionState.mentionProvider;
14
20
  const renderAssistiveTextWithProviders = providers => {
15
21
  var _props$options;
16
- const {
17
- mentionProvider
18
- } = providers;
22
+ const mentionProviderPromise = mentionProvider ? Promise.resolve(mentionProvider) : providers.mentionProvider;
19
23
  const profilecardProvider = (_props$options = props.options) === null || _props$options === void 0 ? void 0 : _props$options.profilecardProvider;
20
24
  return /*#__PURE__*/React.createElement(Mention, {
21
25
  id: id,
22
26
  text: text,
23
27
  accessLevel: accessLevel,
24
- mentionProvider: mentionProvider,
28
+ mentionProvider: mentionProviderPromise,
25
29
  profilecardProvider: profilecardProvider,
26
30
  localId: localId
27
31
  });
@@ -9,11 +9,11 @@ import { MentionNodeView } from '../nodeviews/mention';
9
9
  import { MENTION_PROVIDER_REJECTED, MENTION_PROVIDER_UNDEFINED } from '../types';
10
10
  import { mentionPluginKey } from './key';
11
11
  import { canMentionBeCreatedInRange } from './utils';
12
- const ACTIONS = {
12
+ export const ACTIONS = {
13
13
  SET_PROVIDER: 'SET_PROVIDER'
14
14
  };
15
15
  const PACKAGE_NAME = "@atlaskit/editor-plugin-mentions";
16
- const PACKAGE_VERSION = "2.10.9";
16
+ const PACKAGE_VERSION = "2.11.1";
17
17
  const setProvider = provider => (state, dispatch) => {
18
18
  if (dispatch) {
19
19
  dispatch(state.tr.setMeta(mentionPluginKey, {
@@ -25,7 +25,12 @@ const setProvider = provider => (state, dispatch) => {
25
25
  }
26
26
  return true;
27
27
  };
28
- export function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
28
+ export function createMentionPlugin({
29
+ pmPluginFactoryParams,
30
+ fireEvent,
31
+ options,
32
+ api
33
+ }) {
29
34
  let mentionProvider;
30
35
  const sendAnalytics = (event, actionSubject, action, attributes
31
36
  // Ignored via go/ees005
@@ -96,6 +101,7 @@ export function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
96
101
  Component: MentionNodeView,
97
102
  extraComponentProps: {
98
103
  providerFactory: pmPluginFactoryParams.providerFactory,
104
+ pluginInjectionApi: api,
99
105
  options
100
106
  }
101
107
  })
@@ -140,7 +146,12 @@ export function createMentionPlugin(pmPluginFactoryParams, fireEvent, options) {
140
146
  }
141
147
  return;
142
148
  };
143
- pmPluginFactoryParams.providerFactory.subscribe('mentionProvider', providerHandler);
149
+ const providerViaConfig = fg('platform_editor_mention_provider_via_plugin_config');
150
+ if (providerViaConfig && options !== null && options !== void 0 && options.mentionProvider) {
151
+ providerHandler('mentionProvider', options === null || options === void 0 ? void 0 : options.mentionProvider);
152
+ } else {
153
+ pmPluginFactoryParams.providerFactory.subscribe('mentionProvider', providerHandler);
154
+ }
144
155
  return {
145
156
  destroy() {
146
157
  if (pmPluginFactoryParams.providerFactory) {