import {useState, useEffect} from './index'; import {IHookStateInitAction, IHookStateSetAction, resolveHookState} from './misc/hookState'; import {Ref} from "vue"; export function createGlobalState( initialState: IHookStateInitAction ): () => [Ref, (state: IHookStateSetAction) => void]; export function createGlobalState(): () => [ Ref, (state: IHookStateSetAction) => void ]; export function createGlobalState(initialState?: S) { const store: { state: S; setState: (state: IHookStateSetAction) => void; setters: any[]; } = { state: initialState instanceof Function ? initialState() : initialState, setState(nextState: IHookStateSetAction) { store.state = resolveHookState(nextState, store.state); store.setters.forEach((setter) => setter(store.state)); }, setters: [], }; return () => { const [globalState, stateSetter] = useState(store.state); useEffect(() => () => { store.setters = store.setters.filter((setter) => setter !== stateSetter); }); useEffect(() => { if (!store.setters.includes(stateSetter)) { store.setters.push(stateSetter); } }); return [globalState, store.setState]; }; } export default createGlobalState;