@atlaskit/editor-plugin-emoji 0.1.2 → 0.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +24 -3
  3. package/dist/cjs/commands/insert-emoji.js +47 -0
  4. package/dist/cjs/index.js +8 -1
  5. package/dist/cjs/messages.js +15 -0
  6. package/dist/cjs/nodeviews/emoji.js +34 -0
  7. package/dist/cjs/plugin.js +414 -0
  8. package/dist/cjs/pm-plugins/ascii-input-rules.js +235 -0
  9. package/dist/cjs/ui/Emoji/index.js +19 -0
  10. package/dist/es2019/commands/insert-emoji.js +40 -0
  11. package/dist/es2019/index.js +1 -1
  12. package/dist/es2019/messages.js +8 -0
  13. package/dist/es2019/nodeviews/emoji.js +29 -0
  14. package/dist/es2019/plugin.js +386 -0
  15. package/dist/es2019/pm-plugins/ascii-input-rules.js +168 -0
  16. package/dist/es2019/ui/Emoji/index.js +13 -0
  17. package/dist/esm/commands/insert-emoji.js +39 -0
  18. package/dist/esm/index.js +1 -1
  19. package/dist/esm/messages.js +8 -0
  20. package/dist/esm/nodeviews/emoji.js +27 -0
  21. package/dist/esm/plugin.js +396 -0
  22. package/dist/esm/pm-plugins/ascii-input-rules.js +224 -0
  23. package/dist/esm/ui/Emoji/index.js +12 -0
  24. package/dist/types/commands/insert-emoji.d.ts +4 -0
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/messages.d.ts +7 -0
  27. package/dist/types/nodeviews/emoji.d.ts +7 -0
  28. package/dist/types/plugin.d.ts +42 -0
  29. package/dist/types/pm-plugins/ascii-input-rules.d.ts +10 -0
  30. package/dist/types/ui/Emoji/index.d.ts +4 -0
  31. package/dist/types-ts4.5/commands/insert-emoji.d.ts +4 -0
  32. package/dist/types-ts4.5/index.d.ts +1 -0
  33. package/dist/types-ts4.5/messages.d.ts +7 -0
  34. package/dist/types-ts4.5/nodeviews/emoji.d.ts +7 -0
  35. package/dist/types-ts4.5/plugin.d.ts +42 -0
  36. package/dist/types-ts4.5/pm-plugins/ascii-input-rules.d.ts +10 -0
  37. package/dist/types-ts4.5/ui/Emoji/index.d.ts +4 -0
  38. package/package.json +31 -25
  39. package/report.api.md +3 -0
  40. package/tmp/api-report-tmp.d.ts +46 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @atlaskit/editor-plugin-emoji
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`ad3c5c21079`](https://bitbucket.org/atlassian/atlassian-frontend/commits/ad3c5c21079) - Updating all plugins with minor version to correct issue with semver.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+
13
+ ## 0.2.0
14
+
15
+ ### Minor Changes
16
+
17
+ - [`113fcc02759`](https://bitbucket.org/atlassian/atlassian-frontend/commits/113fcc02759) - ED-19433 Extract Emoji Plugin to its own package
18
+
3
19
  ## 0.1.2
4
20
 
5
21
  ### Patch Changes
package/README.md CHANGED
@@ -1,9 +1,30 @@
1
- # EditorPluginEmoji
1
+ # Editor plugin emoji
2
2
 
3
3
  Emoji plugin for @atlaskit/editor-core
4
4
 
5
+ **Note:** This component is designed for internal Atlassian development.
6
+ External contributors will be able to use this component but will not be able to submit issues.
7
+
8
+ ## Install
9
+ ---
10
+ - **Install** - *yarn add @atlaskit/editor-plugin-emoji*
11
+ - **npm** - [@atlaskit/editor-plugin-emoji](https://www.npmjs.com/package/@atlaskit/editor-plugin-emoji)
12
+ - **Source** - [Bitbucket](https://bitbucket.org/atlassian/atlassian-frontend/src/master/packages/editor/editor-plugin-emoji)
13
+ - **Bundle** - [unpkg.com](https://unpkg.com/@atlaskit/editor-plugin-emoji/dist/)
14
+
5
15
  ## Usage
16
+ ---
17
+ **Internal use only**
18
+
19
+ @atlaskit/editor-plugin-emoji is intended for internal use by the @atlaskit/editor-core and as a plugin dependency of the Editor within your product.
20
+
21
+ Direct use of this component is not supported.
6
22
 
7
- `import { EmojiPlugin } from '@atlaskit/editor-plugin-emoji';`
23
+ Please see [Atlaskit - Editor plugin emoji](https://atlaskit.atlassian.com/packages/editor/editor-plugin-emoji) for documentation and examples for this package.
8
24
 
9
- Detailed docs and example usage can be found [here](https://atlaskit.atlassian.com/packages/editor/editor-plugin-emoji).
25
+ ## Support
26
+ ---
27
+ For internal Atlassian, visit the slack channel [#help-editor](https://atlassian.slack.com/archives/CFG3PSQ9E) for support or visit [go/editor-help](https://go/editor-help) to submit a bug.
28
+ ## License
29
+ ---
30
+ Please see [Atlassian Frontend - License](https://developer.atlassian.com/cloud/framework/atlassian-frontend/#license) for more licensing information.
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.insertEmoji = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _analytics = require("@atlaskit/editor-common/analytics");
10
+ var _model = require("@atlaskit/editor-prosemirror/model");
11
+ var _state = require("@atlaskit/editor-prosemirror/state");
12
+ var _utils = require("@atlaskit/editor-prosemirror/utils");
13
+ 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; }
14
+ 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; }
15
+ var insertEmoji = function insertEmoji(editorAnalyticsAPI) {
16
+ return function (emojiId, inputMethod) {
17
+ return function (_ref) {
18
+ var tr = _ref.tr;
19
+ var doc = tr.doc,
20
+ selection = tr.selection;
21
+ var emoji = tr.doc.type.schema.nodes.emoji;
22
+ if (emoji && emojiId) {
23
+ var node = emoji.createChecked(_objectSpread(_objectSpread({}, emojiId), {}, {
24
+ text: emojiId.fallback || emojiId.shortName
25
+ }));
26
+ var textNode = doc.type.schema.text(' ');
27
+ var fragment = _model.Fragment.fromArray([node, textNode]);
28
+ var newTr = (0, _utils.safeInsert)(fragment)(tr);
29
+ if (inputMethod) {
30
+ editorAnalyticsAPI === null || editorAnalyticsAPI === void 0 ? void 0 : editorAnalyticsAPI.attachAnalyticsEvent({
31
+ action: _analytics.ACTION.INSERTED,
32
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
33
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.EMOJI,
34
+ attributes: {
35
+ inputMethod: inputMethod
36
+ },
37
+ eventType: _analytics.EVENT_TYPE.TRACK
38
+ })(newTr);
39
+ }
40
+ newTr.setSelection(_state.Selection.near(newTr.doc.resolve(selection.$from.pos + fragment.size)));
41
+ return newTr;
42
+ }
43
+ return null;
44
+ };
45
+ };
46
+ };
47
+ exports.insertEmoji = insertEmoji;
package/dist/cjs/index.js CHANGED
@@ -2,4 +2,11 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
- });
5
+ });
6
+ Object.defineProperty(exports, "emojiPlugin", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _plugin.emojiPlugin;
10
+ }
11
+ });
12
+ var _plugin = require("./plugin");
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.messages = void 0;
7
+ var _reactIntlNext = require("react-intl-next");
8
+ var messages = (0, _reactIntlNext.defineMessages)({
9
+ emojiNodeLabel: {
10
+ id: 'fabric.emoji.label',
11
+ defaultMessage: 'Emoji',
12
+ description: 'Label to indicate emoji node to Screen reader users'
13
+ }
14
+ });
15
+ exports.messages = messages;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.EmojiNodeView = EmojiNodeView;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _reactIntlNext = require("react-intl-next");
10
+ var _messages = require("../messages");
11
+ var _Emoji = _interopRequireDefault(require("../ui/Emoji"));
12
+ var EmojiAssistiveTextComponent = /*#__PURE__*/_react.default.memo(function (_ref) {
13
+ var emojiShortName = _ref.emojiShortName;
14
+ var intl = (0, _reactIntlNext.useIntl)();
15
+ return /*#__PURE__*/_react.default.createElement("span", {
16
+ className: 'assistive'
17
+ }, "".concat(intl.formatMessage(_messages.messages.emojiNodeLabel), " ").concat(emojiShortName));
18
+ });
19
+ function EmojiNodeView(props) {
20
+ var _props$node$attrs = props.node.attrs,
21
+ shortName = _props$node$attrs.shortName,
22
+ id = _props$node$attrs.id,
23
+ text = _props$node$attrs.text;
24
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(EmojiAssistiveTextComponent, {
25
+ emojiShortName: shortName
26
+ }), /*#__PURE__*/_react.default.createElement("span", {
27
+ "aria-hidden": "true"
28
+ }, /*#__PURE__*/_react.default.createElement(_Emoji.default, {
29
+ providers: props.providerFactory,
30
+ id: id,
31
+ shortName: shortName,
32
+ fallback: text
33
+ })));
34
+ }
@@ -0,0 +1,414 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ACTIONS = void 0;
8
+ exports.createEmojiPlugin = createEmojiPlugin;
9
+ exports.createRateLimitReachedFunction = createRateLimitReachedFunction;
10
+ exports.emojiToTypeaheadItem = exports.emojiPluginKey = exports.emojiPlugin = exports.defaultListLimit = void 0;
11
+ exports.getEmojiPluginState = getEmojiPluginState;
12
+ exports.memoize = memoize;
13
+ exports.setProvider = void 0;
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+ var _react = _interopRequireDefault(require("react"));
16
+ var _adfSchema = require("@atlaskit/adf-schema");
17
+ var _analytics = require("@atlaskit/editor-common/analytics");
18
+ var _messages = require("@atlaskit/editor-common/messages");
19
+ var _quickInsert = require("@atlaskit/editor-common/quick-insert");
20
+ var _reactNodeView = require("@atlaskit/editor-common/react-node-view");
21
+ var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
22
+ var _typeAhead = require("@atlaskit/editor-common/type-ahead");
23
+ var _model = require("@atlaskit/editor-prosemirror/model");
24
+ var _state = require("@atlaskit/editor-prosemirror/state");
25
+ var _emoji2 = require("@atlaskit/emoji");
26
+ var _insertEmoji = require("./commands/insert-emoji");
27
+ var _emoji3 = require("./nodeviews/emoji");
28
+ var _asciiInputRules = require("./pm-plugins/ascii-input-rules");
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; }
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; }
31
+ var emojiToTypeaheadItem = function emojiToTypeaheadItem(emoji, emojiProvider) {
32
+ return {
33
+ title: emoji.shortName || '',
34
+ key: emoji.id || emoji.shortName,
35
+ render: function render(_ref) {
36
+ var isSelected = _ref.isSelected,
37
+ onClick = _ref.onClick,
38
+ onHover = _ref.onHover;
39
+ return /*#__PURE__*/_react.default.createElement(_emoji2.EmojiTypeAheadItem, {
40
+ emoji: emoji,
41
+ selected: isSelected,
42
+ onMouseMove: onHover,
43
+ onSelection: onClick,
44
+ emojiProvider: emojiProvider
45
+ });
46
+ },
47
+ emoji: emoji
48
+ };
49
+ };
50
+ exports.emojiToTypeaheadItem = emojiToTypeaheadItem;
51
+ function memoize(fn) {
52
+ // Cache results here
53
+ var seen = new Map();
54
+ function memoized(emoji, emojiProvider) {
55
+ // Check cache for hits
56
+ var hit = seen.get(emoji.id || emoji.shortName);
57
+ if (hit) {
58
+ return hit;
59
+ }
60
+
61
+ // Generate new result and cache it
62
+ var result = fn(emoji, emojiProvider);
63
+ seen.set(emoji.id || emoji.shortName, result);
64
+ return result;
65
+ }
66
+ return {
67
+ call: memoized,
68
+ clear: seen.clear.bind(seen)
69
+ };
70
+ }
71
+ var memoizedToItem = memoize(emojiToTypeaheadItem);
72
+ var defaultListLimit = 50;
73
+ exports.defaultListLimit = defaultListLimit;
74
+ var isFullShortName = function isFullShortName(query) {
75
+ return query && query.length > 1 && query.charAt(0) === ':' && query.charAt(query.length - 1) === ':';
76
+ };
77
+ var TRIGGER = ':';
78
+
79
+ /**
80
+ * Emoji plugin to be added to an `EditorPresetBuilder` and used with `ComposableEditor`
81
+ * from `@atlaskit/editor-core`.
82
+ */
83
+ var emojiPlugin = function emojiPlugin(_ref2) {
84
+ var _api$analytics5;
85
+ var options = _ref2.config,
86
+ api = _ref2.api;
87
+ var typeAhead = {
88
+ id: _typeAhead.TypeAheadAvailableNodes.EMOJI,
89
+ trigger: TRIGGER,
90
+ // Custom regex must have a capture group around trigger
91
+ // so it's possible to use it without needing to scan through all triggers again
92
+ customRegex: '\\(?(:)',
93
+ headless: options ? options.headless : undefined,
94
+ getItems: function getItems(_ref3) {
95
+ var query = _ref3.query,
96
+ editorState = _ref3.editorState;
97
+ var pluginState = getEmojiPluginState(editorState);
98
+ var emojiProvider = pluginState.emojiProvider;
99
+ if (!emojiProvider) {
100
+ return Promise.resolve([]);
101
+ }
102
+ return new Promise(function (resolve) {
103
+ var emojiProviderChangeHandler = {
104
+ result: function result(emojiResult) {
105
+ if (!emojiResult || !emojiResult.emojis) {
106
+ resolve([]);
107
+ } else {
108
+ var emojiItems = emojiResult.emojis.map(function (emoji) {
109
+ return memoizedToItem.call(emoji, emojiProvider);
110
+ });
111
+ resolve(emojiItems);
112
+ }
113
+ emojiProvider.unsubscribe(emojiProviderChangeHandler);
114
+ }
115
+ };
116
+ emojiProvider.subscribe(emojiProviderChangeHandler);
117
+ emojiProvider.filter(TRIGGER.concat(query), {
118
+ limit: defaultListLimit,
119
+ skinTone: emojiProvider.getSelectedTone(),
120
+ sort: !query.length ? _emoji2.SearchSort.UsageFrequency : _emoji2.SearchSort.Default
121
+ });
122
+ });
123
+ },
124
+ forceSelect: function forceSelect(_ref4) {
125
+ var query = _ref4.query,
126
+ items = _ref4.items,
127
+ editorState = _ref4.editorState;
128
+ var _ref5 = emojiPluginKey.getState(editorState) || {},
129
+ asciiMap = _ref5.asciiMap;
130
+ var normalizedQuery = TRIGGER.concat(query);
131
+
132
+ // if the query has space at the end
133
+ // check the ascii map for emojis
134
+ if (asciiMap && normalizedQuery.length >= 3 && normalizedQuery.endsWith(' ') && asciiMap.has(normalizedQuery.trim())) {
135
+ var _emoji = asciiMap.get(normalizedQuery.trim());
136
+ return {
137
+ title: (_emoji === null || _emoji === void 0 ? void 0 : _emoji.name) || '',
138
+ emoji: _emoji
139
+ };
140
+ }
141
+ var matchedItem = isFullShortName(normalizedQuery) ? items.find(function (item) {
142
+ return item.title.toLowerCase() === normalizedQuery;
143
+ }) : undefined;
144
+ return matchedItem;
145
+ },
146
+ selectItem: function selectItem(state, item, insert, _ref6) {
147
+ var _api$analytics3;
148
+ var mode = _ref6.mode;
149
+ var _item$emoji = item.emoji,
150
+ _item$emoji$id = _item$emoji.id,
151
+ id = _item$emoji$id === void 0 ? '' : _item$emoji$id,
152
+ fallback = _item$emoji.fallback,
153
+ shortName = _item$emoji.shortName;
154
+ var text = fallback || shortName;
155
+ var emojiPluginState = emojiPluginKey.getState(state);
156
+ if (emojiPluginState.emojiProvider && emojiPluginState.emojiProvider.recordSelection && item.emoji) {
157
+ var _api$analytics$shared, _api$analytics, _api$analytics$shared2, _api$analytics$shared3, _api$analytics2, _api$analytics2$share;
158
+ emojiPluginState.emojiProvider.recordSelection(item.emoji).then((0, _emoji2.recordSelectionSucceededSli)({
159
+ createAnalyticsEvent: (_api$analytics$shared = api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : (_api$analytics$shared2 = _api$analytics.sharedState.currentState()) === null || _api$analytics$shared2 === void 0 ? void 0 : _api$analytics$shared2.createAnalyticsEvent) !== null && _api$analytics$shared !== void 0 ? _api$analytics$shared : undefined
160
+ })).catch((0, _emoji2.recordSelectionFailedSli)({
161
+ createAnalyticsEvent: (_api$analytics$shared3 = api === null || api === void 0 ? void 0 : (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : (_api$analytics2$share = _api$analytics2.sharedState.currentState()) === null || _api$analytics2$share === void 0 ? void 0 : _api$analytics2$share.createAnalyticsEvent) !== null && _api$analytics$shared3 !== void 0 ? _api$analytics$shared3 : undefined
162
+ }));
163
+ }
164
+ var emojiNode = state.schema.nodes.emoji.createChecked({
165
+ shortName: shortName,
166
+ id: id,
167
+ text: text
168
+ });
169
+ var space = state.schema.text(' ');
170
+ var tr = insert(_model.Fragment.from([emojiNode, space]));
171
+ api === null || api === void 0 ? void 0 : (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions.attachAnalyticsEvent({
172
+ action: _analytics.ACTION.INSERTED,
173
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
174
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.EMOJI,
175
+ attributes: {
176
+ inputMethod: _analytics.INPUT_METHOD.TYPEAHEAD
177
+ },
178
+ eventType: _analytics.EVENT_TYPE.TRACK
179
+ })(tr);
180
+ return tr;
181
+ }
182
+ };
183
+ return {
184
+ name: 'emoji',
185
+ nodes: function nodes() {
186
+ return [{
187
+ name: 'emoji',
188
+ node: _adfSchema.emoji
189
+ }];
190
+ },
191
+ pmPlugins: function pmPlugins() {
192
+ return [{
193
+ name: 'emoji',
194
+ plugin: function plugin(pmPluginFactoryParams) {
195
+ return createEmojiPlugin(pmPluginFactoryParams);
196
+ }
197
+ }, {
198
+ name: 'emojiAsciiInputRule',
199
+ plugin: function plugin(_ref7) {
200
+ var _api$analytics4;
201
+ var schema = _ref7.schema,
202
+ providerFactory = _ref7.providerFactory,
203
+ featureFlags = _ref7.featureFlags;
204
+ return (0, _asciiInputRules.inputRulePlugin)(schema, providerFactory, featureFlags, api === null || api === void 0 ? void 0 : (_api$analytics4 = api.analytics) === null || _api$analytics4 === void 0 ? void 0 : _api$analytics4.actions);
205
+ }
206
+ }];
207
+ },
208
+ getSharedState: function getSharedState(editorState) {
209
+ if (!editorState) {
210
+ return undefined;
211
+ }
212
+ return emojiPluginKey.getState(editorState);
213
+ },
214
+ commands: {
215
+ insertEmoji: (0, _insertEmoji.insertEmoji)(api === null || api === void 0 ? void 0 : (_api$analytics5 = api.analytics) === null || _api$analytics5 === void 0 ? void 0 : _api$analytics5.actions)
216
+ },
217
+ pluginsOptions: {
218
+ quickInsert: function quickInsert(_ref8) {
219
+ var formatMessage = _ref8.formatMessage;
220
+ return [{
221
+ id: 'emoji',
222
+ title: formatMessage(_messages.toolbarInsertBlockMessages.emoji),
223
+ description: formatMessage(_messages.toolbarInsertBlockMessages.emojiDescription),
224
+ priority: 500,
225
+ keyshortcut: ':',
226
+ icon: function icon() {
227
+ return /*#__PURE__*/_react.default.createElement(_quickInsert.IconEmoji, null);
228
+ },
229
+ action: function action(insert, state) {
230
+ var _api$analytics6;
231
+ var tr = insert(undefined);
232
+ api === null || api === void 0 ? void 0 : api.typeAhead.commands.openTypeAheadAtCursor({
233
+ triggerHandler: typeAhead,
234
+ inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
235
+ })({
236
+ tr: tr
237
+ });
238
+ api === null || api === void 0 ? void 0 : (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 ? void 0 : _api$analytics6.actions.attachAnalyticsEvent({
239
+ action: _analytics.ACTION.INVOKED,
240
+ actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD,
241
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.TYPEAHEAD_EMOJI,
242
+ attributes: {
243
+ inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
244
+ },
245
+ eventType: _analytics.EVENT_TYPE.UI
246
+ })(tr);
247
+ return tr;
248
+ }
249
+ }];
250
+ },
251
+ typeAhead: typeAhead
252
+ }
253
+ };
254
+ };
255
+
256
+ /**
257
+ * Actions
258
+ */
259
+ exports.emojiPlugin = emojiPlugin;
260
+ var ACTIONS = {
261
+ SET_PROVIDER: 'SET_PROVIDER',
262
+ SET_RESULTS: 'SET_RESULTS',
263
+ SET_ASCII_MAP: 'SET_ASCII_MAP'
264
+ };
265
+ exports.ACTIONS = ACTIONS;
266
+ var setAsciiMap = function setAsciiMap(asciiMap) {
267
+ return function (state, dispatch) {
268
+ if (dispatch) {
269
+ dispatch(state.tr.setMeta(emojiPluginKey, {
270
+ action: ACTIONS.SET_ASCII_MAP,
271
+ params: {
272
+ asciiMap: asciiMap
273
+ }
274
+ }));
275
+ }
276
+ return true;
277
+ };
278
+ };
279
+
280
+ /**
281
+ *
282
+ * Wrapper to call `onLimitReached` when a specified number of calls of that function
283
+ * have been made within a time period.
284
+ *
285
+ * Note: It does not rate limit
286
+ *
287
+ * @param fn Function to wrap
288
+ * @param limitTime Time limit in milliseconds
289
+ * @param limitCount Number of function calls before `onRateReached` is called (per time period)
290
+ * @returns Wrapped function
291
+ */
292
+ function createRateLimitReachedFunction(fn, limitTime, limitCount, onLimitReached) {
293
+ var lastCallTime = 0;
294
+ var callCount = 0;
295
+ return function wrappedFn() {
296
+ var now = Date.now();
297
+ if (now - lastCallTime < limitTime) {
298
+ if (++callCount > limitCount) {
299
+ onLimitReached === null || onLimitReached === void 0 ? void 0 : onLimitReached();
300
+ }
301
+ } else {
302
+ lastCallTime = now;
303
+ callCount = 1;
304
+ }
305
+ return fn.apply(void 0, arguments);
306
+ };
307
+ }
308
+
309
+ // At this stage console.error only
310
+ var logRateWarning = function logRateWarning() {
311
+ if (process.env.NODE_ENV === 'development') {
312
+ // eslint-disable-next-line no-console
313
+ console.error('The emoji provider injected in the Editor is being reloaded frequently, this will cause a slow Editor experience.');
314
+ }
315
+ };
316
+ var setProvider = createRateLimitReachedFunction(function (provider) {
317
+ return function (state, dispatch) {
318
+ if (dispatch) {
319
+ dispatch(state.tr.setMeta(emojiPluginKey, {
320
+ action: ACTIONS.SET_PROVIDER,
321
+ params: {
322
+ provider: provider
323
+ }
324
+ }));
325
+ }
326
+ return true;
327
+ };
328
+ },
329
+ // If we change the emoji provider more than three times every 5 seconds we should warn.
330
+ // This seems like a really long time but the performance can be that laggy that we don't
331
+ // even get 3 events in 3 seconds and miss this indicator.
332
+ 5000, 3, logRateWarning);
333
+ exports.setProvider = setProvider;
334
+ var emojiPluginKey = new _state.PluginKey('emojiPlugin');
335
+ exports.emojiPluginKey = emojiPluginKey;
336
+ function getEmojiPluginState(state) {
337
+ return emojiPluginKey.getState(state) || {};
338
+ }
339
+ function createEmojiPlugin(pmPluginFactoryParams) {
340
+ return new _safePlugin.SafePlugin({
341
+ key: emojiPluginKey,
342
+ state: {
343
+ init: function init() {
344
+ return {};
345
+ },
346
+ apply: function apply(tr, pluginState) {
347
+ var _ref9 = tr.getMeta(emojiPluginKey) || {
348
+ action: null,
349
+ params: null
350
+ },
351
+ action = _ref9.action,
352
+ params = _ref9.params;
353
+ var newPluginState = pluginState;
354
+ switch (action) {
355
+ case ACTIONS.SET_PROVIDER:
356
+ newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
357
+ emojiProvider: params.provider
358
+ });
359
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
360
+ return newPluginState;
361
+ case ACTIONS.SET_ASCII_MAP:
362
+ newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
363
+ asciiMap: params.asciiMap
364
+ });
365
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
366
+ return newPluginState;
367
+ }
368
+ return newPluginState;
369
+ }
370
+ },
371
+ props: {
372
+ nodeViews: {
373
+ emoji: (0, _reactNodeView.getInlineNodeViewProducer)({
374
+ pmPluginFactoryParams: pmPluginFactoryParams,
375
+ Component: _emoji3.EmojiNodeView,
376
+ extraComponentProps: {
377
+ providerFactory: pmPluginFactoryParams.providerFactory
378
+ }
379
+ })
380
+ }
381
+ },
382
+ view: function view(editorView) {
383
+ var providerHandler = function providerHandler(name, providerPromise) {
384
+ switch (name) {
385
+ case 'emojiProvider':
386
+ if (!providerPromise) {
387
+ var _setProvider;
388
+ return setProvider === null || setProvider === void 0 ? void 0 : (_setProvider = setProvider(undefined)) === null || _setProvider === void 0 ? void 0 : _setProvider(editorView.state, editorView.dispatch);
389
+ }
390
+ providerPromise.then(function (provider) {
391
+ var _setProvider2;
392
+ setProvider === null || setProvider === void 0 ? void 0 : (_setProvider2 = setProvider(provider)) === null || _setProvider2 === void 0 ? void 0 : _setProvider2(editorView.state, editorView.dispatch);
393
+ provider.getAsciiMap().then(function (asciiMap) {
394
+ setAsciiMap(asciiMap)(editorView.state, editorView.dispatch);
395
+ });
396
+ }).catch(function () {
397
+ var _setProvider3;
398
+ return setProvider === null || setProvider === void 0 ? void 0 : (_setProvider3 = setProvider(undefined)) === null || _setProvider3 === void 0 ? void 0 : _setProvider3(editorView.state, editorView.dispatch);
399
+ });
400
+ break;
401
+ }
402
+ return;
403
+ };
404
+ pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
405
+ return {
406
+ destroy: function destroy() {
407
+ if (pmPluginFactoryParams.providerFactory) {
408
+ pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
409
+ }
410
+ }
411
+ };
412
+ }
413
+ });
414
+ }