import isEqual from 'lodash/isEqual'; import type { Dispatch, SetStateAction } from 'react'; import { useState, useCallback, useRef } from 'react'; const useDifferentState = ( initialState: S | (() => S) ): [S, Dispatch>] => { const [state, setState] = useState(initialState); const StateRef = useRef(state); const onChange = useCallback>>((v) => { const value = typeof v === 'function' ? (v as (prevState: S) => S)(StateRef.current) : v; if (!isEqual(value, StateRef.current)) { setState(value); StateRef.current = value; } }, []); return [state, onChange]; }; export default useDifferentState;