import { Dispatch, SetStateAction, useCallback, useRef, useState } from 'react'; export interface StateMediator { (newState: any): S; (newState: any, dispatch: Dispatch>): void; } export type UseMediatedStateReturn = [S, Dispatch>]; export function useMediatedState( mediator: StateMediator ): UseMediatedStateReturn; export function useMediatedState(mediator: StateMediator, initialState: S): UseMediatedStateReturn; export function useMediatedState(mediator: StateMediator, initialState?: S): UseMediatedStateReturn { const mediatorFn = useRef(mediator); const [state, setMediatedState] = useState(initialState!); const setState = useCallback( (newState: any) => { if (mediatorFn.current.length === 2) { mediatorFn.current(newState, setMediatedState); } else { setMediatedState(mediatorFn.current(newState)); } }, [state] ); return [state, setState]; }