import { useCallback } from 'react'; import isFunction from 'lodash-es/isFunction'; import useRefState from './useRefState'; import useUnmountedRef from './useUnmountedRef'; // eslint-disable-next-line @typescript-eslint/ban-types const useSetState = ( initialState: T = {} as T ): [T, (patch: Partial | ((prevState: T) => Partial)) => void, React.MutableRefObject] => { const unmountedRef = useUnmountedRef(); const [state, setState, ref] = useRefState(initialState); const setMergeState = useCallback(patch => { if (unmountedRef.current) return; setState(prevState => ({ ...prevState, ...(isFunction(patch) ? patch(prevState) : patch) })); }, []); return [state, setMergeState, ref]; }; export default useSetState;