import * as React from 'react'; // allow the hook to work in SSR const useLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect; /** * Alternative to useCallback that doesn't update the callback when dependencies change * * @see https://reactjs.org/docs/hooks-faq.html#how-to-read-an-often-changing-value-from-usecallback * @see https://github.com/facebook/react/issues/14099#issuecomment-440013892 */ export function useInvariant< Args extends unknown[], Return>(fn: (...args: Args) => Return, ): ((...args: Args) => Return) { const ref = React.useRef<(...args: Args) => Return>(() => { throw new Error('Cannot call an event handler while rendering.'); }); useLayoutEffect(() => { ref.current = fn; }); return React.useCallback((...args: Args) => { return ref.current(...args); }, []); } export default useInvariant;