import { useCallback, useRef, } from 'react' export const useSerialAsyncCallback = ( fn: (...args: Args) => Promise | Result, shouldSkip?: () => boolean, ) => { const queueRef = useRef>(Promise.resolve()) return useCallback((...args: Args) => { if (shouldSkip?.()) return Promise.resolve(undefined as Result) const lastPromise = queueRef.current.catch(() => undefined) const nextPromise = lastPromise.then(() => fn(...args)) queueRef.current = nextPromise return nextPromise }, [fn, shouldSkip]) }