@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
50 lines (49 loc) • 1.86 kB
JavaScript
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);
}
};
}