-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Expand file tree
/
Copy pathsuggestion.js
More file actions
73 lines (61 loc) · 1.71 KB
/
suggestion.js
File metadata and controls
73 lines (61 loc) · 1.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { computePosition } from '@floating-ui/dom'
import { ReactRenderer } from '@tiptap/react'
import { EmojiList } from './EmojiList.jsx'
export default {
items: ({ editor, query }) => {
return editor.storage.emoji.emojis
.filter(({ shortcodes, tags }) => {
return (
shortcodes.find(shortcode => shortcode.startsWith(query.toLowerCase())) ||
tags.find(tag => tag.startsWith(query.toLowerCase()))
)
})
.slice(0, 5)
},
allowSpaces: false,
render: () => {
let component
function repositionComponent(clientRect) {
if (!component || !component.element) {
return
}
const virtualElement = {
getBoundingClientRect() {
return clientRect
},
}
computePosition(virtualElement, component.element, {
placement: 'bottom-start',
}).then(pos => {
Object.assign(component.element.style, {
left: `${pos.x}px`,
top: `${pos.y}px`,
position: pos.strategy === 'fixed' ? 'fixed' : 'absolute',
})
})
}
return {
onStart: props => {
component = new ReactRenderer(EmojiList, {
props,
editor: props.editor,
})
document.body.appendChild(component.element)
repositionComponent(props.clientRect())
},
onUpdate(props) {
component.updateProps(props)
repositionComponent(props.clientRect())
},
onKeyDown(props) {
return component.ref?.onKeyDown(props)
},
onExit() {
if (document.body.contains(component.element)) {
document.body.removeChild(component.element)
}
component.destroy()
},
}
},
}