hooks.ts
import { useEffect, useState } from "react";

export function useDebouncedValue<T>(value: T, delay = 200) {
  const [debounced, setDebounced] = useState(value);

  useEffect(() => {
    const id = setTimeout(() => setDebounced(value), delay);
    return () => clearTimeout(id);
  }, [value, delay]);

  return debounced;
}

export function useThrottledCallback<A extends unknown[]>(
  callback: (...args: A) => void,
  delay = 200,
) {
  const lastRun = useRef(0);
  const timer = useRef<ReturnType<typeof setTimeout> | null>(null);

  return (...args: A) => {
    const now = Date.now();
    const elapsed = now - lastRun.current;

    if (elapsed >= delay) {
      lastRun.current = now;
      callback(...args);
      return;
    }

    if (timer.current) clearTimeout(timer.current);
    timer.current = setTimeout(() => {
      lastRun.current = Date.now();
      callback(...args);
    }, delay - elapsed);
  };
}