import React, { useEffect, useRef, EffectCallback, DependencyList } from "react"; const useIsoMorphicEffect = (effect: EffectCallback, deps?: DependencyList | undefined) => { useEffect(effect, deps); }; function useLatestValue(value: T) { const cache = useRef(value); useIsoMorphicEffect(() => { cache.current = value; }, [value]); return cache; } // TODO: Add React.useEvent ?? once the useEvent hook is available function useEvent any, P extends any[] = Parameters, R = ReturnType>( cb: (...args: P) => R ) { const cache = useLatestValue(cb); return React.useCallback((...args: P) => cache.current(...args), [cache]); }; export default useEvent;