mirror of
https://github.com/ueberdosis/tiptap.git
synced 2025-06-07 17:43:49 +08:00
73 lines
1.4 KiB
JavaScript
73 lines
1.4 KiB
JavaScript
import './MentionList.scss'
|
|
|
|
import React, {
|
|
forwardRef,
|
|
useEffect,
|
|
useImperativeHandle,
|
|
useState,
|
|
} from 'react'
|
|
|
|
export const MentionList = forwardRef((props, ref) => {
|
|
const [selectedIndex, setSelectedIndex] = useState(0)
|
|
|
|
const selectItem = index => {
|
|
const item = props.items[index]
|
|
|
|
if (item) {
|
|
props.command({ id: item })
|
|
}
|
|
}
|
|
|
|
const upHandler = () => {
|
|
setSelectedIndex(((selectedIndex + props.items.length) - 1) % props.items.length)
|
|
}
|
|
|
|
const downHandler = () => {
|
|
setSelectedIndex((selectedIndex + 1) % props.items.length)
|
|
}
|
|
|
|
const enterHandler = () => {
|
|
selectItem(selectedIndex)
|
|
}
|
|
|
|
useEffect(() => setSelectedIndex(0), [props.items])
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
onKeyDown: ({ event }) => {
|
|
if (event.key === 'ArrowUp') {
|
|
upHandler()
|
|
return true
|
|
}
|
|
|
|
if (event.key === 'ArrowDown') {
|
|
downHandler()
|
|
return true
|
|
}
|
|
|
|
if (event.key === 'Enter') {
|
|
enterHandler()
|
|
return true
|
|
}
|
|
|
|
return false
|
|
},
|
|
}))
|
|
|
|
return (
|
|
<div className="dropdown-menu">
|
|
{props.items.length
|
|
? props.items.map((item, index) => (
|
|
<button
|
|
className={index === selectedIndex ? 'is-selected' : ''}
|
|
key={index}
|
|
onClick={() => selectItem(index)}
|
|
>
|
|
{item}
|
|
</button>
|
|
))
|
|
: <div className="item">No result</div>
|
|
}
|
|
</div>
|
|
)
|
|
})
|