UNPKG

@1771technologies/lytenyte-pro

Version:

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

42 lines (41 loc) 1.73 kB
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 }; }