@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.
- package/CHANGELOG.md +6 -0
- package/dist/cjs/commands/insert-emoji.js +47 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/messages.js +15 -0
- package/dist/cjs/nodeviews/emoji.js +34 -0
- package/dist/cjs/plugin.js +409 -0
- package/dist/cjs/pm-plugins/ascii-input-rules.js +235 -0
- package/dist/cjs/ui/Emoji/index.js +19 -0
- package/dist/es2019/commands/insert-emoji.js +40 -0
- package/dist/es2019/index.js +1 -1
- package/dist/es2019/messages.js +8 -0
- package/dist/es2019/nodeviews/emoji.js +29 -0
- package/dist/es2019/plugin.js +381 -0
- package/dist/es2019/pm-plugins/ascii-input-rules.js +168 -0
- package/dist/es2019/ui/Emoji/index.js +13 -0
- package/dist/esm/commands/insert-emoji.js +39 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/messages.js +8 -0
- package/dist/esm/nodeviews/emoji.js +27 -0
- package/dist/esm/plugin.js +391 -0
- package/dist/esm/pm-plugins/ascii-input-rules.js +224 -0
- package/dist/esm/ui/Emoji/index.js +12 -0
- package/dist/types/commands/insert-emoji.d.ts +4 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/messages.d.ts +7 -0
- package/dist/types/nodeviews/emoji.d.ts +7 -0
- package/dist/types/plugin.d.ts +38 -0
- package/dist/types/pm-plugins/ascii-input-rules.d.ts +10 -0
- package/dist/types/ui/Emoji/index.d.ts +4 -0
- package/dist/types-ts4.5/commands/insert-emoji.d.ts +4 -0
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/messages.d.ts +7 -0
- package/dist/types-ts4.5/nodeviews/emoji.d.ts +7 -0
- package/dist/types-ts4.5/plugin.d.ts +38 -0
- package/dist/types-ts4.5/pm-plugins/ascii-input-rules.d.ts +10 -0
- package/dist/types-ts4.5/ui/Emoji/index.d.ts +4 -0
- package/package.json +29 -23
- package/report.api.md +3 -0
- package/tmp/api-report-tmp.d.ts +46 -0
package/CHANGELOG.md
CHANGED
|
@@ -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
|
@@ -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
|
+
}
|