|
1 | 1 | /* eslint-disable @typescript-eslint/ban-ts-comment */ |
2 | | -import TiptapEmoji from '@tiptap/extension-emoji'; |
3 | | -import { ReactRenderer } from '@tiptap/react'; |
| 2 | +import TiptapEmoji, { type EmojiOptions } from '@tiptap/extension-emoji'; |
| 3 | +import { Extension } from '@tiptap/react'; |
4 | 4 |
|
5 | | -import { updatePosition } from '@/utils/updatePosition'; |
| 5 | +import { renderNodeViewClosure } from '@/utils/renderNodeView'; |
6 | 6 |
|
7 | 7 | import EmojiNodeView from './components/EmojiList/EmojiNodeView'; |
8 | 8 |
|
9 | 9 | export * from '@/extensions/Emoji/components/RichTextEmoji'; |
10 | 10 |
|
11 | 11 | export const EXTENSION_PRIORITY_HIGHEST = 200; |
12 | 12 |
|
13 | | -export const Emoji = /* @__PURE__ */ TiptapEmoji.extend({ |
| 13 | +export const Emoji = /* @__PURE__ */ Extension.create<EmojiOptions>({ |
| 14 | + name: 'richTextEmojiWrapper', |
14 | 15 | priority: EXTENSION_PRIORITY_HIGHEST, |
15 | 16 | // emojis: gitHubEmojis, |
16 | 17 | enableEmoticons: true, |
@@ -38,60 +39,20 @@ export const Emoji = /* @__PURE__ */ TiptapEmoji.extend({ |
38 | 39 | }; |
39 | 40 | }, |
40 | 41 |
|
41 | | -}).configure({ |
42 | | - suggestion: { |
43 | | - // items: ({ query }: any) => { |
44 | | - // return emojiSearch(query); |
45 | | - // }, |
46 | | - |
47 | | - allowSpaces: false, |
48 | | - |
49 | | - render: () => { |
50 | | - let reactRenderer: any; |
51 | | - |
52 | | - return { |
53 | | - onStart: (props: any) => { |
54 | | - if (!props.clientRect) { |
55 | | - return; |
56 | | - } |
57 | | - |
58 | | - reactRenderer = new ReactRenderer(EmojiNodeView, { |
59 | | - props, |
60 | | - editor: props.editor, |
61 | | - }); |
62 | | - |
63 | | - reactRenderer.element.style.position = 'absolute'; |
64 | | - |
65 | | - document.body.appendChild(reactRenderer.element); |
66 | | - |
67 | | - updatePosition(props.editor, reactRenderer.element); |
68 | | - }, |
69 | | - |
70 | | - onUpdate(props) { |
71 | | - reactRenderer.updateProps(props); |
72 | | - |
73 | | - if (!props.clientRect) { |
74 | | - return; |
75 | | - } |
76 | | - updatePosition(props.editor, reactRenderer.element); |
77 | | - }, |
78 | | - |
79 | | - onKeyDown(props) { |
80 | | - if (props.event.key === 'Escape') { |
81 | | - reactRenderer.destroy(); |
82 | | - reactRenderer.element.remove(); |
83 | | - |
84 | | - return true; |
85 | | - } |
86 | | - |
87 | | - return reactRenderer.ref?.onKeyDown(props); |
88 | | - }, |
| 42 | + addExtensions() { |
| 43 | + const config: any = { |
| 44 | + ...this.options |
| 45 | + }; |
89 | 46 |
|
90 | | - onExit() { |
91 | | - reactRenderer.destroy(); |
92 | | - reactRenderer.element.remove(); |
93 | | - }, |
| 47 | + if (this.options?.suggestion) { |
| 48 | + config['suggestion'] = { |
| 49 | + render: renderNodeViewClosure(EmojiNodeView), |
| 50 | + ...this.options.suggestion, |
94 | 51 | }; |
95 | | - }, |
96 | | - } |
| 52 | + } |
| 53 | + |
| 54 | + return [TiptapEmoji.configure({ |
| 55 | + ...config, |
| 56 | + })]; |
| 57 | + }, |
97 | 58 | }); |
0 commit comments