import { createEditor } from '@prosekit/core'
import { defineMention } from '@prosekit/extensions'
// Mock user database
const users = [
{ id: '1', username: 'john', name: 'John Doe' },
{ id: '2', username: 'jane', name: 'Jane Smith' },
{ id: '3', username: 'bob', name: 'Bob Wilson' },
]
function createMentionEditor() {
const editor = createEditor({
extensions: [defineMention()],
})
// Setup autocomplete UI (pseudo-code)
let autocompleteActive = false
let autocompleteQuery = ''
editor.view.dom.addEventListener('keydown', (event) => {
// Detect '@' trigger
if (event.key === '@') {
autocompleteActive = true
autocompleteQuery = ''
}
// Update query while autocomplete is active
if (autocompleteActive) {
if (event.key === 'Escape') {
autocompleteActive = false
} else if (event.key === 'Backspace') {
autocompleteQuery = autocompleteQuery.slice(0, -1)
} else if (event.key.length === 1) {
autocompleteQuery += event.key
}
// Filter and show suggestions
const suggestions = users.filter(user =>
user.name.toLowerCase().includes(autocompleteQuery.toLowerCase())
)
showAutocompleteSuggestions(suggestions)
}
})
return editor
}
function selectMention(editor, user) {
// Delete the '@query' text
const { from, to } = editor.state.selection
const transaction = editor.state.tr.delete(from - autocompleteQuery.length - 1, to)
editor.view.dispatch(transaction)
// Insert mention
editor.commands.insertMention({
id: user.id,
value: `@${user.username}`,
kind: 'user',
})
}