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);
};
}