Files
cinny/src/app/hooks/useDebounce.ts
T
Lotus Bot 61a1f008d0 chore: upgrade i18next 26, prettier 3, fontsource-variable, domhandler 6, lint-staged 17
- i18next 23->26 + react-i18next 15->17
- prettier 2->3, reformat all files
- replace @fontsource/inter with @fontsource-variable/inter 5, update import path
- domhandler 5->6 (aligns with transitive deps)
- lint-staged 16->17
2026-05-21 23:30:50 -04:00

35 lines
891 B
TypeScript

import { useCallback, useRef } from 'react';
export interface DebounceOptions {
wait?: number;
immediate?: boolean;
}
export type DebounceCallback<T extends unknown[]> = (...args: T) => void;
export function useDebounce<T extends unknown[]>(
callback: DebounceCallback<T>,
options?: DebounceOptions,
): DebounceCallback<T> {
const timeoutIdRef = useRef<number>();
const { wait, immediate } = options ?? {};
const debounceCallback = useCallback(
(...cbArgs: T) => {
if (timeoutIdRef.current) {
clearTimeout(timeoutIdRef.current);
timeoutIdRef.current = undefined;
} else if (immediate) {
callback(...cbArgs);
}
timeoutIdRef.current = window.setTimeout(() => {
callback(...cbArgs);
timeoutIdRef.current = undefined;
}, wait);
},
[callback, wait, immediate],
);
return debounceCallback;
}