import { useCallback, useRef, useState } from 'react'; import type { Dispatch, SetStateAction, MutableRefObject } from 'react'; import isFunction from 'lodash-es/isFunction'; type StateType = T | (() => T); export default function useRefState( initialState: StateType ): [T, Dispatch>, MutableRefObject] { const [state, setState] = useState(initialState); const ref = useRef(state); const setRafState = useCallback( patch => { setState(prevState => { // eslint-disable-next-line no-return-assign return (ref.current = isFunction(patch) ? patch(prevState) : patch); }); }, [state] ); return [state, setRafState, ref]; }