@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
42 lines (41 loc) • 1.73 kB
JavaScript
import { useCallback, useRef, useEffect } from "react";
import { getWordAtCursor } from "./get-word-at-cursor.js";
const DEBOUNCE_DELAY = 150;
export function useCompletionTrigger(config) {
const timerRef = useRef(null);
const configRef = useRef(config);
configRef.current = config;
const cancel = useCallback(() => {
if (timerRef.current !== null) {
clearTimeout(timerRef.current);
timerRef.current = null;
}
}, []);
useEffect(() => cancel, [cancel]);
const triggerManually = useCallback((value, cursorPosition) => {
cancel();
const { tokenize, onTrigger } = configRef.current;
const tokens = tokenize(value);
const word = getWordAtCursor(value, cursorPosition);
onTrigger(tokens, cursorPosition, word);
}, [cancel]);
const handleInputChange = useCallback((value, cursorPosition) => {
cancel();
const { triggerCharacters, tokenize, onTrigger } = configRef.current;
const charBeforeCursor = value[cursorPosition - 1] || "";
if (triggerCharacters.includes(charBeforeCursor)) {
const tokens = tokenize(value);
const word = getWordAtCursor(value, cursorPosition);
onTrigger(tokens, cursorPosition, word);
return;
}
const word = getWordAtCursor(value, cursorPosition);
if (word.word.length > 0) {
timerRef.current = setTimeout(() => {
const tokens = configRef.current.tokenize(value);
configRef.current.onTrigger(tokens, cursorPosition, word);
}, DEBOUNCE_DELAY);
}
}, [cancel]);
return { handleInputChange, triggerManually, cancel };
}