@atlaskit/editor-plugin-emoji 0.1.2 → 0.2.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 (39) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/commands/insert-emoji.js +47 -0
  3. package/dist/cjs/index.js +8 -1
  4. package/dist/cjs/messages.js +15 -0
  5. package/dist/cjs/nodeviews/emoji.js +34 -0
  6. package/dist/cjs/plugin.js +409 -0
  7. package/dist/cjs/pm-plugins/ascii-input-rules.js +235 -0
  8. package/dist/cjs/ui/Emoji/index.js +19 -0
  9. package/dist/es2019/commands/insert-emoji.js +40 -0
  10. package/dist/es2019/index.js +1 -1
  11. package/dist/es2019/messages.js +8 -0
  12. package/dist/es2019/nodeviews/emoji.js +29 -0
  13. package/dist/es2019/plugin.js +381 -0
  14. package/dist/es2019/pm-plugins/ascii-input-rules.js +168 -0
  15. package/dist/es2019/ui/Emoji/index.js +13 -0
  16. package/dist/esm/commands/insert-emoji.js +39 -0
  17. package/dist/esm/index.js +1 -1
  18. package/dist/esm/messages.js +8 -0
  19. package/dist/esm/nodeviews/emoji.js +27 -0
  20. package/dist/esm/plugin.js +391 -0
  21. package/dist/esm/pm-plugins/ascii-input-rules.js +224 -0
  22. package/dist/esm/ui/Emoji/index.js +12 -0
  23. package/dist/types/commands/insert-emoji.d.ts +4 -0
  24. package/dist/types/index.d.ts +1 -0
  25. package/dist/types/messages.d.ts +7 -0
  26. package/dist/types/nodeviews/emoji.d.ts +7 -0
  27. package/dist/types/plugin.d.ts +38 -0
  28. package/dist/types/pm-plugins/ascii-input-rules.d.ts +10 -0
  29. package/dist/types/ui/Emoji/index.d.ts +4 -0
  30. package/dist/types-ts4.5/commands/insert-emoji.d.ts +4 -0
  31. package/dist/types-ts4.5/index.d.ts +1 -0
  32. package/dist/types-ts4.5/messages.d.ts +7 -0
  33. package/dist/types-ts4.5/nodeviews/emoji.d.ts +7 -0
  34. package/dist/types-ts4.5/plugin.d.ts +38 -0
  35. package/dist/types-ts4.5/pm-plugins/ascii-input-rules.d.ts +10 -0
  36. package/dist/types-ts4.5/ui/Emoji/index.d.ts +4 -0
  37. package/package.json +29 -23
  38. package/report.api.md +3 -0
  39. package/tmp/api-report-tmp.d.ts +46 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/editor-plugin-emoji
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`113fcc02759`](https://bitbucket.org/atlassian/atlassian-frontend/commits/113fcc02759) - ED-19433 Extract Emoji Plugin to its own package
8
+
3
9
  ## 0.1.2
4
10
 
5
11
  ### Patch Changes
@@ -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(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
14
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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,409 @@
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(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
30
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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
+ var emojiPlugin = function emojiPlugin(_ref2) {
79
+ var _api$analytics5;
80
+ var options = _ref2.config,
81
+ api = _ref2.api;
82
+ var typeAhead = {
83
+ id: _typeAhead.TypeAheadAvailableNodes.EMOJI,
84
+ trigger: TRIGGER,
85
+ // Custom regex must have a capture group around trigger
86
+ // so it's possible to use it without needing to scan through all triggers again
87
+ customRegex: '\\(?(:)',
88
+ headless: options ? options.headless : undefined,
89
+ getItems: function getItems(_ref3) {
90
+ var query = _ref3.query,
91
+ editorState = _ref3.editorState;
92
+ var pluginState = getEmojiPluginState(editorState);
93
+ var emojiProvider = pluginState.emojiProvider;
94
+ if (!emojiProvider) {
95
+ return Promise.resolve([]);
96
+ }
97
+ return new Promise(function (resolve) {
98
+ var emojiProviderChangeHandler = {
99
+ result: function result(emojiResult) {
100
+ if (!emojiResult || !emojiResult.emojis) {
101
+ resolve([]);
102
+ } else {
103
+ var emojiItems = emojiResult.emojis.map(function (emoji) {
104
+ return memoizedToItem.call(emoji, emojiProvider);
105
+ });
106
+ resolve(emojiItems);
107
+ }
108
+ emojiProvider.unsubscribe(emojiProviderChangeHandler);
109
+ }
110
+ };
111
+ emojiProvider.subscribe(emojiProviderChangeHandler);
112
+ emojiProvider.filter(TRIGGER.concat(query), {
113
+ limit: defaultListLimit,
114
+ skinTone: emojiProvider.getSelectedTone(),
115
+ sort: !query.length ? _emoji2.SearchSort.UsageFrequency : _emoji2.SearchSort.Default
116
+ });
117
+ });
118
+ },
119
+ forceSelect: function forceSelect(_ref4) {
120
+ var query = _ref4.query,
121
+ items = _ref4.items,
122
+ editorState = _ref4.editorState;
123
+ var _ref5 = emojiPluginKey.getState(editorState) || {},
124
+ asciiMap = _ref5.asciiMap;
125
+ var normalizedQuery = TRIGGER.concat(query);
126
+
127
+ // if the query has space at the end
128
+ // check the ascii map for emojis
129
+ if (asciiMap && normalizedQuery.length >= 3 && normalizedQuery.endsWith(' ') && asciiMap.has(normalizedQuery.trim())) {
130
+ var _emoji = asciiMap.get(normalizedQuery.trim());
131
+ return {
132
+ title: (_emoji === null || _emoji === void 0 ? void 0 : _emoji.name) || '',
133
+ emoji: _emoji
134
+ };
135
+ }
136
+ var matchedItem = isFullShortName(normalizedQuery) ? items.find(function (item) {
137
+ return item.title.toLowerCase() === normalizedQuery;
138
+ }) : undefined;
139
+ return matchedItem;
140
+ },
141
+ selectItem: function selectItem(state, item, insert, _ref6) {
142
+ var _api$analytics3;
143
+ var mode = _ref6.mode;
144
+ var _item$emoji = item.emoji,
145
+ _item$emoji$id = _item$emoji.id,
146
+ id = _item$emoji$id === void 0 ? '' : _item$emoji$id,
147
+ fallback = _item$emoji.fallback,
148
+ shortName = _item$emoji.shortName;
149
+ var text = fallback || shortName;
150
+ var emojiPluginState = emojiPluginKey.getState(state);
151
+ if (emojiPluginState.emojiProvider && emojiPluginState.emojiProvider.recordSelection && item.emoji) {
152
+ var _api$analytics$shared, _api$analytics, _api$analytics$shared2, _api$analytics$shared3, _api$analytics2, _api$analytics2$share;
153
+ emojiPluginState.emojiProvider.recordSelection(item.emoji).then((0, _emoji2.recordSelectionSucceededSli)({
154
+ 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
155
+ })).catch((0, _emoji2.recordSelectionFailedSli)({
156
+ 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
157
+ }));
158
+ }
159
+ var emojiNode = state.schema.nodes.emoji.createChecked({
160
+ shortName: shortName,
161
+ id: id,
162
+ text: text
163
+ });
164
+ var space = state.schema.text(' ');
165
+ var tr = insert(_model.Fragment.from([emojiNode, space]));
166
+ api === null || api === void 0 ? void 0 : (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 ? void 0 : _api$analytics3.actions.attachAnalyticsEvent({
167
+ action: _analytics.ACTION.INSERTED,
168
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
169
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.EMOJI,
170
+ attributes: {
171
+ inputMethod: _analytics.INPUT_METHOD.TYPEAHEAD
172
+ },
173
+ eventType: _analytics.EVENT_TYPE.TRACK
174
+ })(tr);
175
+ return tr;
176
+ }
177
+ };
178
+ return {
179
+ name: 'emoji',
180
+ nodes: function nodes() {
181
+ return [{
182
+ name: 'emoji',
183
+ node: _adfSchema.emoji
184
+ }];
185
+ },
186
+ pmPlugins: function pmPlugins() {
187
+ return [{
188
+ name: 'emoji',
189
+ plugin: function plugin(pmPluginFactoryParams) {
190
+ return createEmojiPlugin(pmPluginFactoryParams);
191
+ }
192
+ }, {
193
+ name: 'emojiAsciiInputRule',
194
+ plugin: function plugin(_ref7) {
195
+ var _api$analytics4;
196
+ var schema = _ref7.schema,
197
+ providerFactory = _ref7.providerFactory,
198
+ featureFlags = _ref7.featureFlags;
199
+ 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);
200
+ }
201
+ }];
202
+ },
203
+ getSharedState: function getSharedState(editorState) {
204
+ if (!editorState) {
205
+ return undefined;
206
+ }
207
+ return emojiPluginKey.getState(editorState);
208
+ },
209
+ commands: {
210
+ 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)
211
+ },
212
+ pluginsOptions: {
213
+ quickInsert: function quickInsert(_ref8) {
214
+ var formatMessage = _ref8.formatMessage;
215
+ return [{
216
+ id: 'emoji',
217
+ title: formatMessage(_messages.toolbarInsertBlockMessages.emoji),
218
+ description: formatMessage(_messages.toolbarInsertBlockMessages.emojiDescription),
219
+ priority: 500,
220
+ keyshortcut: ':',
221
+ icon: function icon() {
222
+ return /*#__PURE__*/_react.default.createElement(_quickInsert.IconEmoji, null);
223
+ },
224
+ action: function action(insert, state) {
225
+ var _api$analytics6;
226
+ var tr = insert(undefined);
227
+ api === null || api === void 0 ? void 0 : api.typeAhead.commands.openTypeAheadAtCursor({
228
+ triggerHandler: typeAhead,
229
+ inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
230
+ })({
231
+ tr: tr
232
+ });
233
+ api === null || api === void 0 ? void 0 : (_api$analytics6 = api.analytics) === null || _api$analytics6 === void 0 ? void 0 : _api$analytics6.actions.attachAnalyticsEvent({
234
+ action: _analytics.ACTION.INVOKED,
235
+ actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD,
236
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.TYPEAHEAD_EMOJI,
237
+ attributes: {
238
+ inputMethod: _analytics.INPUT_METHOD.QUICK_INSERT
239
+ },
240
+ eventType: _analytics.EVENT_TYPE.UI
241
+ })(tr);
242
+ return tr;
243
+ }
244
+ }];
245
+ },
246
+ typeAhead: typeAhead
247
+ }
248
+ };
249
+ };
250
+
251
+ /**
252
+ * Actions
253
+ */
254
+ exports.emojiPlugin = emojiPlugin;
255
+ var ACTIONS = {
256
+ SET_PROVIDER: 'SET_PROVIDER',
257
+ SET_RESULTS: 'SET_RESULTS',
258
+ SET_ASCII_MAP: 'SET_ASCII_MAP'
259
+ };
260
+ exports.ACTIONS = ACTIONS;
261
+ var setAsciiMap = function setAsciiMap(asciiMap) {
262
+ return function (state, dispatch) {
263
+ if (dispatch) {
264
+ dispatch(state.tr.setMeta(emojiPluginKey, {
265
+ action: ACTIONS.SET_ASCII_MAP,
266
+ params: {
267
+ asciiMap: asciiMap
268
+ }
269
+ }));
270
+ }
271
+ return true;
272
+ };
273
+ };
274
+
275
+ /**
276
+ *
277
+ * Wrapper to call `onLimitReached` when a specified number of calls of that function
278
+ * have been made within a time period.
279
+ *
280
+ * Note: It does not rate limit
281
+ *
282
+ * @param fn Function to wrap
283
+ * @param limitTime Time limit in milliseconds
284
+ * @param limitCount Number of function calls before `onRateReached` is called (per time period)
285
+ * @returns Wrapped function
286
+ */
287
+ function createRateLimitReachedFunction(fn, limitTime, limitCount, onLimitReached) {
288
+ var lastCallTime = 0;
289
+ var callCount = 0;
290
+ return function wrappedFn() {
291
+ var now = Date.now();
292
+ if (now - lastCallTime < limitTime) {
293
+ if (++callCount > limitCount) {
294
+ onLimitReached === null || onLimitReached === void 0 ? void 0 : onLimitReached();
295
+ }
296
+ } else {
297
+ lastCallTime = now;
298
+ callCount = 1;
299
+ }
300
+ return fn.apply(void 0, arguments);
301
+ };
302
+ }
303
+
304
+ // At this stage console.error only
305
+ var logRateWarning = function logRateWarning() {
306
+ if (process.env.NODE_ENV === 'development') {
307
+ // eslint-disable-next-line no-console
308
+ console.error('The emoji provider injected in the Editor is being reloaded frequently, this will cause a slow Editor experience.');
309
+ }
310
+ };
311
+ var setProvider = createRateLimitReachedFunction(function (provider) {
312
+ return function (state, dispatch) {
313
+ if (dispatch) {
314
+ dispatch(state.tr.setMeta(emojiPluginKey, {
315
+ action: ACTIONS.SET_PROVIDER,
316
+ params: {
317
+ provider: provider
318
+ }
319
+ }));
320
+ }
321
+ return true;
322
+ };
323
+ },
324
+ // If we change the emoji provider more than three times every 5 seconds we should warn.
325
+ // This seems like a really long time but the performance can be that laggy that we don't
326
+ // even get 3 events in 3 seconds and miss this indicator.
327
+ 5000, 3, logRateWarning);
328
+ exports.setProvider = setProvider;
329
+ var emojiPluginKey = new _state.PluginKey('emojiPlugin');
330
+ exports.emojiPluginKey = emojiPluginKey;
331
+ function getEmojiPluginState(state) {
332
+ return emojiPluginKey.getState(state) || {};
333
+ }
334
+ function createEmojiPlugin(pmPluginFactoryParams) {
335
+ return new _safePlugin.SafePlugin({
336
+ key: emojiPluginKey,
337
+ state: {
338
+ init: function init() {
339
+ return {};
340
+ },
341
+ apply: function apply(tr, pluginState) {
342
+ var _ref9 = tr.getMeta(emojiPluginKey) || {
343
+ action: null,
344
+ params: null
345
+ },
346
+ action = _ref9.action,
347
+ params = _ref9.params;
348
+ var newPluginState = pluginState;
349
+ switch (action) {
350
+ case ACTIONS.SET_PROVIDER:
351
+ newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
352
+ emojiProvider: params.provider
353
+ });
354
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
355
+ return newPluginState;
356
+ case ACTIONS.SET_ASCII_MAP:
357
+ newPluginState = _objectSpread(_objectSpread({}, pluginState), {}, {
358
+ asciiMap: params.asciiMap
359
+ });
360
+ pmPluginFactoryParams.dispatch(emojiPluginKey, newPluginState);
361
+ return newPluginState;
362
+ }
363
+ return newPluginState;
364
+ }
365
+ },
366
+ props: {
367
+ nodeViews: {
368
+ emoji: (0, _reactNodeView.getInlineNodeViewProducer)({
369
+ pmPluginFactoryParams: pmPluginFactoryParams,
370
+ Component: _emoji3.EmojiNodeView,
371
+ extraComponentProps: {
372
+ providerFactory: pmPluginFactoryParams.providerFactory
373
+ }
374
+ })
375
+ }
376
+ },
377
+ view: function view(editorView) {
378
+ var providerHandler = function providerHandler(name, providerPromise) {
379
+ switch (name) {
380
+ case 'emojiProvider':
381
+ if (!providerPromise) {
382
+ var _setProvider;
383
+ return setProvider === null || setProvider === void 0 ? void 0 : (_setProvider = setProvider(undefined)) === null || _setProvider === void 0 ? void 0 : _setProvider(editorView.state, editorView.dispatch);
384
+ }
385
+ providerPromise.then(function (provider) {
386
+ var _setProvider2;
387
+ setProvider === null || setProvider === void 0 ? void 0 : (_setProvider2 = setProvider(provider)) === null || _setProvider2 === void 0 ? void 0 : _setProvider2(editorView.state, editorView.dispatch);
388
+ provider.getAsciiMap().then(function (asciiMap) {
389
+ setAsciiMap(asciiMap)(editorView.state, editorView.dispatch);
390
+ });
391
+ }).catch(function () {
392
+ var _setProvider3;
393
+ return setProvider === null || setProvider === void 0 ? void 0 : (_setProvider3 = setProvider(undefined)) === null || _setProvider3 === void 0 ? void 0 : _setProvider3(editorView.state, editorView.dispatch);
394
+ });
395
+ break;
396
+ }
397
+ return;
398
+ };
399
+ pmPluginFactoryParams.providerFactory.subscribe('emojiProvider', providerHandler);
400
+ return {
401
+ destroy: function destroy() {
402
+ if (pmPluginFactoryParams.providerFactory) {
403
+ pmPluginFactoryParams.providerFactory.unsubscribe('emojiProvider', providerHandler);
404
+ }
405
+ }
406
+ };
407
+ }
408
+ });
409
+ }