@atlaskit/editor-plugin-emoji 2.4.0 → 2.5.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/cjs/nodeviews/emoji.js +1 -0
  3. package/dist/cjs/plugin.js +93 -56
  4. package/dist/cjs/pm-plugins/actions.js +41 -0
  5. package/dist/cjs/pm-plugins/ascii-input-rules.js +19 -6
  6. package/dist/cjs/ui/Emoji/emoji-next.js +55 -0
  7. package/dist/cjs/ui/Emoji/index.js +3 -1
  8. package/dist/es2019/nodeviews/emoji.js +1 -0
  9. package/dist/es2019/plugin.js +54 -41
  10. package/dist/es2019/pm-plugins/actions.js +29 -0
  11. package/dist/es2019/pm-plugins/ascii-input-rules.js +20 -6
  12. package/dist/es2019/ui/Emoji/emoji-next.js +51 -0
  13. package/dist/es2019/ui/Emoji/index.js +3 -1
  14. package/dist/esm/nodeviews/emoji.js +1 -0
  15. package/dist/esm/plugin.js +90 -52
  16. package/dist/esm/pm-plugins/actions.js +35 -0
  17. package/dist/esm/pm-plugins/ascii-input-rules.js +19 -6
  18. package/dist/esm/ui/Emoji/emoji-next.js +48 -0
  19. package/dist/esm/ui/Emoji/index.js +3 -1
  20. package/dist/types/nodeviews/emoji.d.ts +3 -1
  21. package/dist/types/plugin.d.ts +4 -11
  22. package/dist/types/pm-plugins/actions.d.ts +13 -0
  23. package/dist/types/pm-plugins/ascii-input-rules.d.ts +4 -3
  24. package/dist/types/types.d.ts +3 -1
  25. package/dist/types/ui/Emoji/emoji-next.d.ts +16 -0
  26. package/dist/types/ui/Emoji/index.d.ts +1 -1
  27. package/dist/types-ts4.5/nodeviews/emoji.d.ts +3 -1
  28. package/dist/types-ts4.5/plugin.d.ts +4 -11
  29. package/dist/types-ts4.5/pm-plugins/actions.d.ts +13 -0
  30. package/dist/types-ts4.5/pm-plugins/ascii-input-rules.d.ts +4 -3
  31. package/dist/types-ts4.5/types.d.ts +3 -1
  32. package/dist/types-ts4.5/ui/Emoji/emoji-next.d.ts +16 -0
  33. package/dist/types-ts4.5/ui/Emoji/index.d.ts +1 -1
  34. package/package.json +7 -5
@@ -12,6 +12,7 @@ import { EmojiTypeAheadItem, recordSelectionFailedSli, recordSelectionSucceededS
12
12
  import { fg } from '@atlaskit/platform-feature-flags';
13
13
  import { createEmojiFragment, insertEmoji } from './commands/insert-emoji';
14
14
  import { EmojiNodeView } from './nodeviews/emoji';
15
+ import { ACTIONS, openTypeAhead as openTypeAheadAction, setAsciiMap as setAsciiMapAction, setProvider as setProviderAction } from './pm-plugins/actions';
15
16
  import { inputRulePlugin as asciiInputRulePlugin } from './pm-plugins/ascii-input-rules';
16
17
  export const emojiToTypeaheadItem = (emoji, emojiProvider) => ({
17
18
  title: emoji.shortName || '',
@@ -65,6 +66,7 @@ export const emojiPlugin = ({
65
66
  api
66
67
  }) => {
67
68
  var _api$analytics5;
69
+ let previousEmojiProvider;
68
70
  const typeAhead = {
69
71
  id: TypeAheadAvailableNodes.EMOJI,
70
72
  trigger: TRIGGER,
@@ -178,7 +180,9 @@ export const emojiPlugin = ({
178
180
  pmPlugins() {
179
181
  return [{
180
182
  name: 'emoji',
181
- plugin: pmPluginFactoryParams => createEmojiPlugin(pmPluginFactoryParams, options)
183
+ plugin: pmPluginFactoryParams => {
184
+ return createEmojiPlugin(pmPluginFactoryParams, options, api);
185
+ }
182
186
  }, {
183
187
  name: 'emojiAsciiInputRule',
184
188
  plugin: ({
@@ -187,7 +191,7 @@ export const emojiPlugin = ({
187
191
  featureFlags
188
192
  }) => {
189
193
  var _api$analytics4;
190
- return asciiInputRulePlugin(schema, providerFactory, featureFlags, api === null || api === void 0 ? void 0 : (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions);
194
+ return asciiInputRulePlugin(schema, providerFactory, featureFlags, api === null || api === void 0 ? void 0 : (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions, api);
191
195
  }
192
196
  }];
193
197
  },
@@ -198,21 +202,29 @@ export const emojiPlugin = ({
198
202
  }
199
203
  const {
200
204
  emojiResourceConfig,
201
- asciiMap
205
+ asciiMap,
206
+ emojiProvider
202
207
  } = (_emojiPluginKey$getSt = emojiPluginKey.getState(editorState)) !== null && _emojiPluginKey$getSt !== void 0 ? _emojiPluginKey$getSt : {};
203
208
  return {
204
209
  emojiResourceConfig,
205
210
  asciiMap,
206
- typeAheadHandler: typeAhead
211
+ typeAheadHandler: typeAhead,
212
+ emojiProvider
207
213
  };
208
214
  },
209
215
  actions: {
210
- openTypeAhead(inputMethod) {
211
- var _api$typeAhead;
212
- return Boolean(api === null || api === void 0 ? void 0 : (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 ? void 0 : _api$typeAhead.actions.open({
213
- triggerHandler: typeAhead,
214
- inputMethod
215
- }));
216
+ openTypeAhead: openTypeAheadAction(typeAhead, api),
217
+ setProvider: async providerPromise => {
218
+ var _api$core$actions$exe;
219
+ const provider = await providerPromise;
220
+ // Prevent someone trying to set the exact same provider twice for performance reasons
221
+ if (previousEmojiProvider === provider || (options === null || options === void 0 ? void 0 : options.emojiProvider) === providerPromise) {
222
+ return false;
223
+ }
224
+ previousEmojiProvider = provider;
225
+ return (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(({
226
+ tr
227
+ }) => setProviderTr(provider)(tr))) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false;
216
228
  }
217
229
  },
218
230
  commands: {
@@ -229,9 +241,9 @@ export const emojiPlugin = ({
229
241
  keyshortcut: ':',
230
242
  icon: () => /*#__PURE__*/React.createElement(IconEmoji, null),
231
243
  action(insert, state) {
232
- var _api$typeAhead2;
244
+ var _api$typeAhead;
233
245
  const tr = insert(undefined);
234
- api === null || api === void 0 ? void 0 : (_api$typeAhead2 = api.typeAhead) === null || _api$typeAhead2 === void 0 ? void 0 : _api$typeAhead2.actions.openAtTransaction({
246
+ api === null || api === void 0 ? void 0 : (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 ? void 0 : _api$typeAhead.actions.openAtTransaction({
235
247
  triggerHandler: typeAhead,
236
248
  inputMethod: INPUT_METHOD.QUICK_INSERT
237
249
  })(tr);
@@ -247,19 +259,10 @@ export const emojiPlugin = ({
247
259
  * Actions
248
260
  */
249
261
 
250
- export const ACTIONS = {
251
- SET_PROVIDER: 'SET_PROVIDER',
252
- SET_RESULTS: 'SET_RESULTS',
253
- SET_ASCII_MAP: 'SET_ASCII_MAP'
254
- };
255
262
  const setAsciiMap = asciiMap => (state, dispatch) => {
256
263
  if (dispatch) {
257
- dispatch(state.tr.setMeta(emojiPluginKey, {
258
- action: ACTIONS.SET_ASCII_MAP,
259
- params: {
260
- asciiMap
261
- }
262
- }));
264
+ const tr = setAsciiMapAction(asciiMap)(state.tr);
265
+ dispatch(tr);
263
266
  }
264
267
  return true;
265
268
  };
@@ -300,26 +303,23 @@ const logRateWarning = () => {
300
303
  console.error('The emoji provider injected in the Editor is being reloaded frequently, this will cause a slow Editor experience.');
301
304
  }
302
305
  };
303
- export const setProvider = createRateLimitReachedFunction(provider => (state, dispatch) => {
304
- if (dispatch) {
305
- dispatch(state.tr.setMeta(emojiPluginKey, {
306
- action: ACTIONS.SET_PROVIDER,
307
- params: {
308
- provider
309
- }
310
- }));
311
- }
312
- return true;
313
- },
306
+ export const setProviderTr = createRateLimitReachedFunction(provider => tr => setProviderAction(provider)(tr),
314
307
  // If we change the emoji provider more than three times every 5 seconds we should warn.
315
308
  // This seems like a really long time but the performance can be that laggy that we don't
316
309
  // even get 3 events in 3 seconds and miss this indicator.
317
310
  5000, 3, logRateWarning);
311
+ export const setProvider = provider => (state, dispatch) => {
312
+ if (dispatch) {
313
+ const tr = setProviderTr(provider)(state.tr);
314
+ dispatch(tr);
315
+ }
316
+ return true;
317
+ };
318
318
  export const emojiPluginKey = new PluginKey('emojiPlugin');
319
319
  export function getEmojiPluginState(state) {
320
320
  return emojiPluginKey.getState(state) || {};
321
321
  }
322
- export function createEmojiPlugin(pmPluginFactoryParams, options) {
322
+ export function createEmojiPlugin(pmPluginFactoryParams, options, api) {
323
323
  return new SafePlugin({
324
324
  key: emojiPluginKey,
325
325
  state: {
@@ -341,14 +341,18 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
341
341
  ...pluginState,
342
342
  emojiProvider: params.provider
343
343
  };
344
- pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
344
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
345
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
346
+ }
345
347
  return newPluginState;
346
348
  case ACTIONS.SET_ASCII_MAP:
347
349
  newPluginState = {
348
350
  ...pluginState,
349
351
  asciiMap: params.asciiMap
350
352
  };
351
- pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
353
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
354
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
355
+ }
352
356
  return newPluginState;
353
357
  }
354
358
  return newPluginState;
@@ -361,7 +365,8 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
361
365
  Component: EmojiNodeView,
362
366
  extraComponentProps: {
363
367
  providerFactory: pmPluginFactoryParams.providerFactory,
364
- options
368
+ options,
369
+ api
365
370
  }
366
371
  })
367
372
  }
@@ -388,11 +393,19 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
388
393
  }
389
394
  return;
390
395
  };
391
- pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
396
+ if (fg('platform_editor_get_emoji_provider_from_config')) {
397
+ if (options !== null && options !== void 0 && options.emojiProvider) {
398
+ providerHandler('emojiProvider', options.emojiProvider);
399
+ }
400
+ } else {
401
+ pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
402
+ }
392
403
  return {
393
404
  destroy() {
394
- if (pmPluginFactoryParams.providerFactory) {
395
- pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
405
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
406
+ if (pmPluginFactoryParams.providerFactory) {
407
+ pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
408
+ }
396
409
  }
397
410
  }
398
411
  };
@@ -0,0 +1,29 @@
1
+ import { emojiPluginKey } from '../plugin';
2
+ export const ACTIONS = {
3
+ SET_PROVIDER: 'SET_PROVIDER',
4
+ SET_RESULTS: 'SET_RESULTS',
5
+ SET_ASCII_MAP: 'SET_ASCII_MAP'
6
+ };
7
+ export const setAsciiMap = asciiMap => tr => {
8
+ return tr.setMeta(emojiPluginKey, {
9
+ action: ACTIONS.SET_ASCII_MAP,
10
+ params: {
11
+ asciiMap
12
+ }
13
+ });
14
+ };
15
+ export const openTypeAhead = (typeaheadHandler, api) => inputMethod => {
16
+ var _api$typeAhead;
17
+ return Boolean(api === null || api === void 0 ? void 0 : (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 ? void 0 : _api$typeAhead.actions.open({
18
+ triggerHandler: typeaheadHandler,
19
+ inputMethod
20
+ }));
21
+ };
22
+ export const setProvider = provider => tr => {
23
+ return tr.setMeta(emojiPluginKey, {
24
+ action: ACTIONS.SET_PROVIDER,
25
+ params: {
26
+ provider
27
+ }
28
+ });
29
+ };
@@ -3,17 +3,18 @@ import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } f
3
3
  import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
4
4
  import { createRule } from '@atlaskit/editor-common/utils';
5
5
  import { PluginKey } from '@atlaskit/editor-prosemirror/state';
6
+ import { fg } from '@atlaskit/platform-feature-flags';
6
7
  import { createPlugin, leafNodeReplacementCharacter } from '@atlaskit/prosemirror-input-rules';
7
8
  let matcher;
8
- export function inputRulePlugin(schema, providerFactory, featureFlags, editorAnalyticsAPI) {
9
+ export function inputRulePlugin(schema, providerFactory, featureFlags, editorAnalyticsAPI, pluginInjectionApi) {
9
10
  if (schema.nodes.emoji && providerFactory) {
10
- initMatcher(providerFactory);
11
+ initMatcher(providerFactory, pluginInjectionApi);
11
12
  const asciiEmojiRule = createRule(AsciiEmojiMatcher.REGEX, inputRuleHandler(editorAnalyticsAPI));
12
13
  return new SafePlugin(createPlugin('emoji', [asciiEmojiRule]));
13
14
  }
14
15
  return;
15
16
  }
16
- function initMatcher(providerFactory) {
17
+ function initMatcher(providerFactory, pluginInjectionApi) {
17
18
  const handleProvider = (_name, provider) => {
18
19
  if (!provider) {
19
20
  return;
@@ -24,7 +25,20 @@ function initMatcher(providerFactory) {
24
25
  });
25
26
  });
26
27
  };
27
- providerFactory.subscribe('emojiProvider', handleProvider);
28
+ if (fg('platform_editor_get_emoji_provider_from_config')) {
29
+ pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : pluginInjectionApi.emoji.sharedState.onChange(({
30
+ nextSharedState
31
+ }) => {
32
+ const emojiProvider = nextSharedState === null || nextSharedState === void 0 ? void 0 : nextSharedState.emojiProvider;
33
+ if (emojiProvider) {
34
+ emojiProvider.getAsciiMap().then(map => {
35
+ matcher = new RecordingAsciiEmojiMatcher(emojiProvider, map);
36
+ });
37
+ }
38
+ });
39
+ } else {
40
+ providerFactory.subscribe('emojiProvider', handleProvider);
41
+ }
28
42
  }
29
43
  const inputRuleHandler = editorAnalyticsAPI => (state, matchParts, start, end) => {
30
44
  if (!matcher) {
@@ -164,7 +178,7 @@ class AsciiEmojiTransactionCreator {
164
178
  }
165
179
  }
166
180
  export const stateKey = new PluginKey('asciiEmojiPlugin');
167
- const plugins = (schema, providerFactory, featureFlags, editorAnalyticsAPI) => {
168
- return [inputRulePlugin(schema, providerFactory, featureFlags, editorAnalyticsAPI)].filter(plugin => !!plugin);
181
+ const plugins = (schema, providerFactory, featureFlags, editorAnalyticsAPI, pluginInjectionApi) => {
182
+ return [inputRulePlugin(schema, providerFactory, featureFlags, editorAnalyticsAPI, pluginInjectionApi)].filter(plugin => !!plugin);
169
183
  };
170
184
  export default plugins;
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { useSharedPluginState } from '@atlaskit/editor-common/hooks';
3
+ import { ResourcedEmoji } from '@atlaskit/emoji/element';
4
+ const useEmojiProvider = pluginInjectionApi => {
5
+ const {
6
+ emojiState
7
+ } = useSharedPluginState(pluginInjectionApi, ['emoji']);
8
+ return emojiState === null || emojiState === void 0 ? void 0 : emojiState.emojiProvider;
9
+ };
10
+ const EmojiNode = props => {
11
+ var _resourceConfig$optim;
12
+ const {
13
+ allowTextFallback,
14
+ shortName,
15
+ id,
16
+ fallback,
17
+ fitToHeight,
18
+ showTooltip,
19
+ resourceConfig,
20
+ pluginInjectionApi
21
+ } = props;
22
+ const emojiProvider = useEmojiProvider(pluginInjectionApi);
23
+ if (allowTextFallback && !emojiProvider) {
24
+ return /*#__PURE__*/React.createElement("span", {
25
+ "data-emoji-id": id,
26
+ "data-emoji-short-name": shortName,
27
+ "data-emoji-text": fallback || shortName
28
+ }, fallback || shortName);
29
+ }
30
+ if (!emojiProvider) {
31
+ return null;
32
+ }
33
+ return /*#__PURE__*/React.createElement(ResourcedEmoji, {
34
+ emojiId: {
35
+ id,
36
+ fallback,
37
+ shortName
38
+ },
39
+ emojiProvider: Promise.resolve(emojiProvider),
40
+ showTooltip: showTooltip,
41
+ fitToHeight: fitToHeight,
42
+ optimistic: true,
43
+ optimisticImageURL: resourceConfig === null || resourceConfig === void 0 ? void 0 : (_resourceConfig$optim = resourceConfig.optimisticImageApi) === null || _resourceConfig$optim === void 0 ? void 0 : _resourceConfig$optim.getUrl({
44
+ id,
45
+ fallback,
46
+ shortName
47
+ }),
48
+ editorEmoji: true
49
+ });
50
+ };
51
+ export default EmojiNode;
@@ -5,6 +5,8 @@
5
5
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
6
6
  import { css, jsx } from '@emotion/react';
7
7
  import { Emoji } from '@atlaskit/editor-common/emoji';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
9
+ import { default as EmojiNext } from './emoji-next';
8
10
  // eslint-disable-next-line
9
11
  const clickSelectWrapperStyle = css`
10
12
  // eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage
@@ -13,5 +15,5 @@ const clickSelectWrapperStyle = css`
13
15
  export default function EmojiNode(props) {
14
16
  return jsx("span", {
15
17
  css: clickSelectWrapperStyle
16
- }, jsx(Emoji, props));
18
+ }, fg('platform_editor_get_emoji_provider_from_config') ? jsx(EmojiNext, props) : jsx(Emoji, props));
17
19
  }
@@ -31,6 +31,7 @@ export function EmojiNodeView(props) {
31
31
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EmojiAssistiveTextComponent, {
32
32
  emojiShortName: shortName
33
33
  }), /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(Emoji, {
34
+ pluginInjectionApi: props.api,
34
35
  providers: props.providerFactory,
35
36
  id: id,
36
37
  shortName: shortName,
@@ -1,6 +1,8 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
3
  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; }
3
4
  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) { _defineProperty(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; }
5
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
4
6
  import React from 'react';
5
7
  import { emoji } from '@atlaskit/adf-schema';
6
8
  import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE, INPUT_METHOD } from '@atlaskit/editor-common/analytics';
@@ -15,6 +17,7 @@ import { EmojiTypeAheadItem, recordSelectionFailedSli, recordSelectionSucceededS
15
17
  import { fg } from '@atlaskit/platform-feature-flags';
16
18
  import { createEmojiFragment, insertEmoji } from './commands/insert-emoji';
17
19
  import { EmojiNodeView } from './nodeviews/emoji';
20
+ import { ACTIONS, openTypeAhead as openTypeAheadAction, setAsciiMap as setAsciiMapAction, setProvider as setProviderAction } from './pm-plugins/actions';
18
21
  import { inputRulePlugin as asciiInputRulePlugin } from './pm-plugins/ascii-input-rules';
19
22
  export var emojiToTypeaheadItem = function emojiToTypeaheadItem(emoji, emojiProvider) {
20
23
  return {
@@ -70,6 +73,7 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
70
73
  var _api$analytics5;
71
74
  var options = _ref2.config,
72
75
  api = _ref2.api;
76
+ var previousEmojiProvider;
73
77
  var typeAhead = {
74
78
  id: TypeAheadAvailableNodes.EMOJI,
75
79
  trigger: TRIGGER,
@@ -184,7 +188,7 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
184
188
  return [{
185
189
  name: 'emoji',
186
190
  plugin: function plugin(pmPluginFactoryParams) {
187
- return createEmojiPlugin(pmPluginFactoryParams, options);
191
+ return createEmojiPlugin(pmPluginFactoryParams, options, api);
188
192
  }
189
193
  }, {
190
194
  name: 'emojiAsciiInputRule',
@@ -193,7 +197,7 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
193
197
  var schema = _ref7.schema,
194
198
  providerFactory = _ref7.providerFactory,
195
199
  featureFlags = _ref7.featureFlags;
196
- return asciiInputRulePlugin(schema, providerFactory, featureFlags, api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions);
200
+ return asciiInputRulePlugin(schema, providerFactory, featureFlags, api === null || api === void 0 || (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions, api);
197
201
  }
198
202
  }];
199
203
  },
@@ -204,28 +208,57 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
204
208
  }
205
209
  var _ref8 = (_emojiPluginKey$getSt = emojiPluginKey.getState(editorState)) !== null && _emojiPluginKey$getSt !== void 0 ? _emojiPluginKey$getSt : {},
206
210
  emojiResourceConfig = _ref8.emojiResourceConfig,
207
- asciiMap = _ref8.asciiMap;
211
+ asciiMap = _ref8.asciiMap,
212
+ emojiProvider = _ref8.emojiProvider;
208
213
  return {
209
214
  emojiResourceConfig: emojiResourceConfig,
210
215
  asciiMap: asciiMap,
211
- typeAheadHandler: typeAhead
216
+ typeAheadHandler: typeAhead,
217
+ emojiProvider: emojiProvider
212
218
  };
213
219
  },
214
220
  actions: {
215
- openTypeAhead: function openTypeAhead(inputMethod) {
216
- var _api$typeAhead;
217
- return Boolean(api === null || api === void 0 || (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 ? void 0 : _api$typeAhead.actions.open({
218
- triggerHandler: typeAhead,
219
- inputMethod: inputMethod
221
+ openTypeAhead: openTypeAheadAction(typeAhead, api),
222
+ setProvider: function () {
223
+ var _setProvider = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(providerPromise) {
224
+ var _api$core$actions$exe;
225
+ var provider;
226
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
227
+ while (1) switch (_context.prev = _context.next) {
228
+ case 0:
229
+ _context.next = 2;
230
+ return providerPromise;
231
+ case 2:
232
+ provider = _context.sent;
233
+ if (!(previousEmojiProvider === provider || (options === null || options === void 0 ? void 0 : options.emojiProvider) === providerPromise)) {
234
+ _context.next = 5;
235
+ break;
236
+ }
237
+ return _context.abrupt("return", false);
238
+ case 5:
239
+ previousEmojiProvider = provider;
240
+ return _context.abrupt("return", (_api$core$actions$exe = api === null || api === void 0 ? void 0 : api.core.actions.execute(function (_ref9) {
241
+ var tr = _ref9.tr;
242
+ return setProviderTr(provider)(tr);
243
+ })) !== null && _api$core$actions$exe !== void 0 ? _api$core$actions$exe : false);
244
+ case 7:
245
+ case "end":
246
+ return _context.stop();
247
+ }
248
+ }, _callee);
220
249
  }));
221
- }
250
+ function setProvider(_x) {
251
+ return _setProvider.apply(this, arguments);
252
+ }
253
+ return setProvider;
254
+ }()
222
255
  },
223
256
  commands: {
224
257
  insertEmoji: insertEmoji(api === null || api === void 0 || (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions)
225
258
  },
226
259
  pluginsOptions: {
227
- quickInsert: function quickInsert(_ref9) {
228
- var formatMessage = _ref9.formatMessage;
260
+ quickInsert: function quickInsert(_ref10) {
261
+ var formatMessage = _ref10.formatMessage;
229
262
  return [{
230
263
  id: 'emoji',
231
264
  title: formatMessage(messages.emoji),
@@ -236,9 +269,9 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
236
269
  return /*#__PURE__*/React.createElement(IconEmoji, null);
237
270
  },
238
271
  action: function action(insert, state) {
239
- var _api$typeAhead2;
272
+ var _api$typeAhead;
240
273
  var tr = insert(undefined);
241
- api === null || api === void 0 || (_api$typeAhead2 = api.typeAhead) === null || _api$typeAhead2 === void 0 || _api$typeAhead2.actions.openAtTransaction({
274
+ api === null || api === void 0 || (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 || _api$typeAhead.actions.openAtTransaction({
242
275
  triggerHandler: typeAhead,
243
276
  inputMethod: INPUT_METHOD.QUICK_INSERT
244
277
  })(tr);
@@ -255,20 +288,11 @@ export var emojiPlugin = function emojiPlugin(_ref2) {
255
288
  * Actions
256
289
  */
257
290
 
258
- export var ACTIONS = {
259
- SET_PROVIDER: 'SET_PROVIDER',
260
- SET_RESULTS: 'SET_RESULTS',
261
- SET_ASCII_MAP: 'SET_ASCII_MAP'
262
- };
263
291
  var setAsciiMap = function setAsciiMap(asciiMap) {
264
292
  return function (state, dispatch) {
265
293
  if (dispatch) {
266
- dispatch(state.tr.setMeta(emojiPluginKey, {
267
- action: ACTIONS.SET_ASCII_MAP,
268
- params: {
269
- asciiMap: asciiMap
270
- }
271
- }));
294
+ var _tr = setAsciiMapAction(asciiMap)(state.tr);
295
+ dispatch(_tr);
272
296
  }
273
297
  return true;
274
298
  };
@@ -310,28 +334,29 @@ var logRateWarning = function logRateWarning() {
310
334
  console.error('The emoji provider injected in the Editor is being reloaded frequently, this will cause a slow Editor experience.');
311
335
  }
312
336
  };
313
- export var setProvider = createRateLimitReachedFunction(function (provider) {
314
- return function (state, dispatch) {
315
- if (dispatch) {
316
- dispatch(state.tr.setMeta(emojiPluginKey, {
317
- action: ACTIONS.SET_PROVIDER,
318
- params: {
319
- provider: provider
320
- }
321
- }));
322
- }
323
- return true;
337
+ export var setProviderTr = createRateLimitReachedFunction(function (provider) {
338
+ return function (tr) {
339
+ return setProviderAction(provider)(tr);
324
340
  };
325
341
  },
326
342
  // If we change the emoji provider more than three times every 5 seconds we should warn.
327
343
  // This seems like a really long time but the performance can be that laggy that we don't
328
344
  // even get 3 events in 3 seconds and miss this indicator.
329
345
  5000, 3, logRateWarning);
346
+ export var setProvider = function setProvider(provider) {
347
+ return function (state, dispatch) {
348
+ if (dispatch) {
349
+ var _tr2 = setProviderTr(provider)(state.tr);
350
+ dispatch(_tr2);
351
+ }
352
+ return true;
353
+ };
354
+ };
330
355
  export var emojiPluginKey = new PluginKey('emojiPlugin');
331
356
  export function getEmojiPluginState(state) {
332
357
  return emojiPluginKey.getState(state) || {};
333
358
  }
334
- export function createEmojiPlugin(pmPluginFactoryParams, options) {
359
+ export function createEmojiPlugin(pmPluginFactoryParams, options, api) {
335
360
  return new SafePlugin({
336
361
  key: emojiPluginKey,
337
362
  state: {
@@ -339,25 +364,29 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
339
364
  return {};
340
365
  },
341
366
  apply: function apply(tr, pluginState) {
342
- var _ref10 = tr.getMeta(emojiPluginKey) || {
367
+ var _ref11 = tr.getMeta(emojiPluginKey) || {
343
368
  action: null,
344
369
  params: null
345
370
  },
346
- action = _ref10.action,
347
- params = _ref10.params;
371
+ action = _ref11.action,
372
+ params = _ref11.params;
348
373
  var newPluginState = pluginState;
349
374
  switch (action) {
350
375
  case ACTIONS.SET_PROVIDER:
351
376
  newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
352
377
  emojiProvider: params.provider
353
378
  });
354
- pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
379
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
380
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
381
+ }
355
382
  return newPluginState;
356
383
  case ACTIONS.SET_ASCII_MAP:
357
384
  newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
358
385
  asciiMap: params.asciiMap
359
386
  });
360
- pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
387
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
388
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
389
+ }
361
390
  return newPluginState;
362
391
  }
363
392
  return newPluginState;
@@ -370,7 +399,8 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
370
399
  Component: EmojiNodeView,
371
400
  extraComponentProps: {
372
401
  providerFactory: pmPluginFactoryParams.providerFactory,
373
- options: options
402
+ options: options,
403
+ api: api
374
404
  }
375
405
  })
376
406
  }
@@ -380,28 +410,36 @@ export function createEmojiPlugin(pmPluginFactoryParams, options) {
380
410
  switch (name) {
381
411
  case 'emojiProvider':
382
412
  if (!providerPromise) {
383
- var _setProvider;
384
- return setProvider === null || setProvider === void 0 || (_setProvider = setProvider(undefined)) === null || _setProvider === void 0 ? void 0 : _setProvider(editorView.state, editorView.dispatch);
413
+ var _setProvider2;
414
+ return setProvider === null || setProvider === void 0 || (_setProvider2 = setProvider(undefined)) === null || _setProvider2 === void 0 ? void 0 : _setProvider2(editorView.state, editorView.dispatch);
385
415
  }
386
416
  providerPromise.then(function (provider) {
387
- var _setProvider2;
388
- setProvider === null || setProvider === void 0 || (_setProvider2 = setProvider(provider)) === null || _setProvider2 === void 0 || _setProvider2(editorView.state, editorView.dispatch);
417
+ var _setProvider3;
418
+ setProvider === null || setProvider === void 0 || (_setProvider3 = setProvider(provider)) === null || _setProvider3 === void 0 || _setProvider3(editorView.state, editorView.dispatch);
389
419
  provider.getAsciiMap().then(function (asciiMap) {
390
420
  setAsciiMap(asciiMap)(editorView.state, editorView.dispatch);
391
421
  });
392
422
  }).catch(function () {
393
- var _setProvider3;
394
- return setProvider === null || setProvider === void 0 || (_setProvider3 = setProvider(undefined)) === null || _setProvider3 === void 0 ? void 0 : _setProvider3(editorView.state, editorView.dispatch);
423
+ var _setProvider4;
424
+ return setProvider === null || setProvider === void 0 || (_setProvider4 = setProvider(undefined)) === null || _setProvider4 === void 0 ? void 0 : _setProvider4(editorView.state, editorView.dispatch);
395
425
  });
396
426
  break;
397
427
  }
398
428
  return;
399
429
  };
400
- pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
430
+ if (fg('platform_editor_get_emoji_provider_from_config')) {
431
+ if (options !== null && options !== void 0 && options.emojiProvider) {
432
+ providerHandler('emojiProvider', options.emojiProvider);
433
+ }
434
+ } else {
435
+ pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
436
+ }
401
437
  return {
402
438
  destroy: function destroy() {
403
- if (pmPluginFactoryParams.providerFactory) {
404
- pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
439
+ if (!fg('platform_editor_get_emoji_provider_from_config')) {
440
+ if (pmPluginFactoryParams.providerFactory) {
441
+ pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
442
+ }
405
443
  }
406
444
  }
407
445
  };
@@ -0,0 +1,35 @@
1
+ import { emojiPluginKey } from '../plugin';
2
+ export var ACTIONS = {
3
+ SET_PROVIDER: 'SET_PROVIDER',
4
+ SET_RESULTS: 'SET_RESULTS',
5
+ SET_ASCII_MAP: 'SET_ASCII_MAP'
6
+ };
7
+ export var setAsciiMap = function setAsciiMap(asciiMap) {
8
+ return function (tr) {
9
+ return tr.setMeta(emojiPluginKey, {
10
+ action: ACTIONS.SET_ASCII_MAP,
11
+ params: {
12
+ asciiMap: asciiMap
13
+ }
14
+ });
15
+ };
16
+ };
17
+ export var openTypeAhead = function openTypeAhead(typeaheadHandler, api) {
18
+ return function (inputMethod) {
19
+ var _api$typeAhead;
20
+ return Boolean(api === null || api === void 0 || (_api$typeAhead = api.typeAhead) === null || _api$typeAhead === void 0 ? void 0 : _api$typeAhead.actions.open({
21
+ triggerHandler: typeaheadHandler,
22
+ inputMethod: inputMethod
23
+ }));
24
+ };
25
+ };
26
+ export var setProvider = function setProvider(provider) {
27
+ return function (tr) {
28
+ return tr.setMeta(emojiPluginKey, {
29
+ action: ACTIONS.SET_PROVIDER,
30
+ params: {
31
+ provider: provider
32
+ }
33
+ });
34
+ };
35
+ };