@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.
- package/CHANGELOG.md +21 -0
- package/dist/cjs/nodeviews/emoji.js +1 -0
- package/dist/cjs/plugin.js +93 -56
- package/dist/cjs/pm-plugins/actions.js +41 -0
- package/dist/cjs/pm-plugins/ascii-input-rules.js +19 -6
- package/dist/cjs/ui/Emoji/emoji-next.js +55 -0
- package/dist/cjs/ui/Emoji/index.js +3 -1
- package/dist/es2019/nodeviews/emoji.js +1 -0
- package/dist/es2019/plugin.js +54 -41
- package/dist/es2019/pm-plugins/actions.js +29 -0
- package/dist/es2019/pm-plugins/ascii-input-rules.js +20 -6
- package/dist/es2019/ui/Emoji/emoji-next.js +51 -0
- package/dist/es2019/ui/Emoji/index.js +3 -1
- package/dist/esm/nodeviews/emoji.js +1 -0
- package/dist/esm/plugin.js +90 -52
- package/dist/esm/pm-plugins/actions.js +35 -0
- package/dist/esm/pm-plugins/ascii-input-rules.js +19 -6
- package/dist/esm/ui/Emoji/emoji-next.js +48 -0
- package/dist/esm/ui/Emoji/index.js +3 -1
- package/dist/types/nodeviews/emoji.d.ts +3 -1
- package/dist/types/plugin.d.ts +4 -11
- package/dist/types/pm-plugins/actions.d.ts +13 -0
- package/dist/types/pm-plugins/ascii-input-rules.d.ts +4 -3
- package/dist/types/types.d.ts +3 -1
- package/dist/types/ui/Emoji/emoji-next.d.ts +16 -0
- package/dist/types/ui/Emoji/index.d.ts +1 -1
- package/dist/types-ts4.5/nodeviews/emoji.d.ts +3 -1
- package/dist/types-ts4.5/plugin.d.ts +4 -11
- package/dist/types-ts4.5/pm-plugins/actions.d.ts +13 -0
- package/dist/types-ts4.5/pm-plugins/ascii-input-rules.d.ts +4 -3
- package/dist/types-ts4.5/types.d.ts +3 -1
- package/dist/types-ts4.5/ui/Emoji/emoji-next.d.ts +16 -0
- package/dist/types-ts4.5/ui/Emoji/index.d.ts +1 -1
- package/package.json +7 -5
package/dist/es2019/plugin.js
CHANGED
|
@@ -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 =>
|
|
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(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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$
|
|
244
|
+
var _api$typeAhead;
|
|
233
245
|
const tr = insert(undefined);
|
|
234
|
-
api === null || api === void 0 ? void 0 : (_api$
|
|
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
|
-
|
|
258
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
395
|
-
pmPluginFactoryParams.providerFactory
|
|
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
|
-
|
|
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,
|
package/dist/esm/plugin.js
CHANGED
|
@@ -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:
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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(
|
|
228
|
-
var 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$
|
|
272
|
+
var _api$typeAhead;
|
|
240
273
|
var tr = insert(undefined);
|
|
241
|
-
api === null || api === void 0 || (_api$
|
|
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
|
-
|
|
267
|
-
|
|
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
|
|
314
|
-
return function (
|
|
315
|
-
|
|
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
|
|
367
|
+
var _ref11 = tr.getMeta(emojiPluginKey) || {
|
|
343
368
|
action: null,
|
|
344
369
|
params: null
|
|
345
370
|
},
|
|
346
|
-
action =
|
|
347
|
-
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
|
-
|
|
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
|
-
|
|
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
|
|
384
|
-
return setProvider === null || setProvider === void 0 || (
|
|
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
|
|
388
|
-
setProvider === null || setProvider === void 0 || (
|
|
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
|
|
394
|
-
return setProvider === null || setProvider === void 0 || (
|
|
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
|
-
|
|
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 (
|
|
404
|
-
pmPluginFactoryParams.providerFactory
|
|
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
|
+
};
|