@equinor/fusion-observable
Version:
14 lines • 831 B
JavaScript
import { useCallback, useMemo, useState } from 'react';
import { from, Subject } from 'rxjs';
import { debounce, debounceTime, switchMap, tap } from 'rxjs/operators';
export const useDebounce = (fn, options) => {
const [idle, setIdle] = useState(true);
const [queuer] = useState(() => options?.queuer ?? new Subject());
const next = useCallback((...args) => queuer.next(args), [queuer]);
const debounceFn = useMemo(() => typeof options.debounce === 'function'
? debounce(options.debounce)
: debounceTime(options.debounce), [options.debounce]);
const value$ = useMemo(() => queuer.pipe(debounceFn, tap(() => setIdle(false)), switchMap((args) => from(fn(...args))), tap(() => setIdle(true))), [queuer, debounceFn, fn]);
return { idle, next, value$ };
};
//# sourceMappingURL=useDebounce.js.map