Skip to content

AI Tools

Code Generator

Prompt TypeScript · strict
output.tsx Lint clean
import { useCallback, useEffect, useState } from "react";

export function useDebouncedSearch<T>(
  fetcher: (q: string, signal: AbortSignal) => Promise<T[]>,
  delay = 320
) {
  const [query, setQuery] = useState("");
  const [results, setResults] = useState<T[]>([]);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    if (!query.trim()) {
      setResults([]);
      return;
    }
    const ac = new AbortController();
    const t = window.setTimeout(async () => {
      setLoading(true);
      try {
        const data = await fetcher(query, ac.signal);
        setResults(data);
      } finally {
        setLoading(false);
      }
    }, delay);
    return () => {
      clearTimeout(t);
      ac.abort();
    };
  }, [query, delay, fetcher]);

  const onChange = useCallback((v: string) => setQuery(v), []);
  return { query, onChange, results, loading };
}