import { useState, useEffect, Dispatch, useCallback, useRef } from "react"; function useLoadingWithTimeout( timeout: number, ): [S | undefined, Dispatch]; function useLoadingWithTimeout( timeout: number, initialState: S, ): [S, Dispatch]; function useLoadingWithTimeout( timeout: number, initialState?: S, ) { const [state, setState] = useState(initialState); const timerRef = useRef(); const cleanTimer = useCallback(() => { clearTimeout(timerRef.current); timerRef.current = undefined; }, []); const setStateWithTimeout: Dispatch = useCallback( (value) => { cleanTimer(); if (value) { timerRef.current = window.setTimeout(() => { setState(value); }, timeout); } else { setState(value); } }, [cleanTimer, timeout], ); useEffect(() => { return () => cleanTimer(); }, [cleanTimer]); return [state, setStateWithTimeout]; } export default useLoadingWithTimeout;