2026-04-12 13:14:18 +02:00
|
|
|
import type React from 'react'
|
|
|
|
|
|
|
|
|
|
interface HandleSuggestionKeysArgs {
|
|
|
|
|
event: React.KeyboardEvent<HTMLDivElement>
|
|
|
|
|
suggestionsOpen: boolean
|
|
|
|
|
onCycleSuggestions: (direction: 1 | -1) => void
|
|
|
|
|
onSelectSuggestion: () => void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSuggestionKeys({
|
|
|
|
|
event,
|
|
|
|
|
suggestionsOpen,
|
|
|
|
|
onCycleSuggestions,
|
|
|
|
|
onSelectSuggestion,
|
|
|
|
|
}: HandleSuggestionKeysArgs): boolean {
|
|
|
|
|
if (!suggestionsOpen) return false
|
|
|
|
|
|
|
|
|
|
if (event.key === 'ArrowDown') {
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
onCycleSuggestions(1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (event.key === 'ArrowUp') {
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
onCycleSuggestions(-1)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (event.key === 'Enter') {
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
onSelectSuggestion()
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface HandleDeleteKeysArgs {
|
|
|
|
|
event: React.KeyboardEvent<HTMLDivElement>
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent: (direction: 'backward' | 'forward') => void
|
2026-04-12 13:14:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleDeleteKeys({
|
|
|
|
|
event,
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent,
|
2026-04-12 13:14:18 +02:00
|
|
|
}: HandleDeleteKeysArgs): boolean {
|
2026-04-13 13:26:38 +02:00
|
|
|
if (event.key === 'Backspace') {
|
2026-04-12 13:14:18 +02:00
|
|
|
event.preventDefault()
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent('backward')
|
2026-04-12 13:14:18 +02:00
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-13 13:26:38 +02:00
|
|
|
if (event.key === 'Delete') {
|
2026-04-12 13:14:18 +02:00
|
|
|
event.preventDefault()
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent('forward')
|
2026-04-12 13:14:18 +02:00
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-13 13:26:38 +02:00
|
|
|
interface HandleInsertTextArgs {
|
|
|
|
|
event: React.KeyboardEvent<HTMLDivElement>
|
|
|
|
|
onInsertText: (text: string) => void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleInsertText({
|
|
|
|
|
event,
|
|
|
|
|
onInsertText,
|
|
|
|
|
}: HandleInsertTextArgs): boolean {
|
|
|
|
|
if (event.metaKey || event.ctrlKey || event.altKey) return false
|
|
|
|
|
if (event.isComposing) return false
|
|
|
|
|
if (event.key.length !== 1) return false
|
|
|
|
|
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
onInsertText(event.key)
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-12 13:14:18 +02:00
|
|
|
interface HandleSubmitKeyArgs {
|
|
|
|
|
event: React.KeyboardEvent<HTMLDivElement>
|
|
|
|
|
canSubmit: boolean
|
|
|
|
|
onSubmit: () => void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSubmitKey({
|
|
|
|
|
event,
|
|
|
|
|
canSubmit,
|
|
|
|
|
onSubmit,
|
|
|
|
|
}: HandleSubmitKeyArgs): boolean {
|
|
|
|
|
if (!canSubmit) return false
|
|
|
|
|
if (event.key !== 'Enter' || event.shiftKey) return false
|
|
|
|
|
|
|
|
|
|
event.preventDefault()
|
|
|
|
|
onSubmit()
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface HandleInlineWikilinkKeyDownArgs {
|
|
|
|
|
event: React.KeyboardEvent<HTMLDivElement>
|
|
|
|
|
disabled: boolean
|
|
|
|
|
suggestionsOpen: boolean
|
|
|
|
|
onCycleSuggestions: (direction: 1 | -1) => void
|
|
|
|
|
onSelectSuggestion: () => void
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent: (direction: 'backward' | 'forward') => void
|
|
|
|
|
onInsertText: (text: string) => void
|
2026-04-12 13:14:18 +02:00
|
|
|
canSubmit: boolean
|
|
|
|
|
onSubmit: () => void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function handleInlineWikilinkKeyDown({
|
|
|
|
|
event,
|
|
|
|
|
disabled,
|
|
|
|
|
suggestionsOpen,
|
|
|
|
|
onCycleSuggestions,
|
|
|
|
|
onSelectSuggestion,
|
2026-04-13 13:26:38 +02:00
|
|
|
onDeleteContent,
|
|
|
|
|
onInsertText,
|
2026-04-12 13:14:18 +02:00
|
|
|
canSubmit,
|
|
|
|
|
onSubmit,
|
|
|
|
|
}: HandleInlineWikilinkKeyDownArgs) {
|
|
|
|
|
if (disabled) return
|
|
|
|
|
|
|
|
|
|
if (handleSuggestionKeys({
|
|
|
|
|
event,
|
|
|
|
|
suggestionsOpen,
|
|
|
|
|
onCycleSuggestions,
|
|
|
|
|
onSelectSuggestion,
|
|
|
|
|
})) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-13 13:26:38 +02:00
|
|
|
if (handleDeleteKeys({ event, onDeleteContent })) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (handleInsertText({ event, onInsertText })) {
|
2026-04-12 13:14:18 +02:00
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
handleSubmitKey({ event, canSubmit, onSubmit })
|
|
|
|
|
}
|