UNPKG

@1771technologies/lytenyte-pro

Version:

Blazingly fast headless React data grid with 100s of features.

50 lines (49 loc) 1.86 kB
import { handleCompletionKeyDown } from "./handle-completion-key-down.js"; import { handleEnterKey } from "./handle-enter-key.js"; import { isManualTrigger } from "./handle-manual-trigger.js"; export function createKeyDownHandler(deps) { return (e) => { if (deps.onExternalKeyDown) { deps.onExternalKeyDown(e); if (e.defaultPrevented) return; } if (deps.isPopoverOpen) { const action = handleCompletionKeyDown(e.key, deps.keybindings); if (action.type === "navigate") { e.preventDefault(); deps.onNavigate(action.direction); return; } if (action.type === "accept" && deps.selectedItem && deps.wordAtCursor) { e.preventDefault(); deps.onAcceptCompletion(deps.selectedItem, deps.wordAtCursor); return; } if (action.type === "dismiss") { e.preventDefault(); deps.onDismiss(); deps.onCancelTrigger(); return; } } if (isManualTrigger(e)) { e.preventDefault(); deps.onManualTrigger(); return; } if (e.key === "Enter") { const { value, selectionStart, selectionEnd } = e.currentTarget; const result = handleEnterKey(value, selectionStart, selectionEnd, deps.multiline); if (result === null) { e.preventDefault(); return; } e.preventDefault(); e.currentTarget.value = result.value; e.currentTarget.selectionStart = result.cursorPosition; e.currentTarget.selectionEnd = result.cursorPosition; deps.onValueChange(result.value); } }; }