import {useState} from "./index"; import {Ref, ref as useRef, watch} from 'vue'; import {SetStateAction} from './misc/types' declare type Dispatch = (value: T) => void export interface StateMediator { (newState: any): S; (newState: any, dispatch: Dispatch>): void; } export type UseMediatedStateReturn = [Ref, Dispatch>]; export function useMediatedState( mediator: StateMediator ): UseMediatedStateReturn; export function useMediatedState( mediator: StateMediator, initialState: S ): UseMediatedStateReturn; export default function useMediatedState( mediator: StateMediator, initialState?: S ): UseMediatedStateReturn { const mediatorFn = useRef(mediator); const [state, setMediatedState] = useState(initialState!); const setState = (newState: any) => { if (mediatorFn.value.length === 2) { mediatorFn.value(newState, setMediatedState); } else { setMediatedState(mediatorFn.value(newState)); } }; watch(state, (newState) => { if (mediatorFn.value.length === 2) { mediatorFn.value(newState, setMediatedState); } else { setMediatedState(mediatorFn.value(newState)); } }); return [state, setState]; }