import { DependencyList, useEffect, useRef, useState } from 'react'; import { ReadonlyStateWire } from '../state-wire/readonly-state-wire'; import { StateWire } from '../state-wire/state-wire'; import { createStateSelector, ReadOnlySelectorOptions, SelectorOptions, WritableSelectorOptions, } from './create-state-selector'; export function useStateSelector( options: WritableSelectorOptions, deps?: DependencyList, ): StateWire; export function useStateSelector( options: ReadOnlySelectorOptions, deps?: DependencyList, ): ReadonlyStateWire; export function useStateSelector( options: SelectorOptions, deps: DependencyList = [], ): ReadonlyStateWire | StateWire { const [[selector, connect]] = useState(() => { return createStateSelector(options); }); const reconnectRef = useRef | null>(null); useEffect(() => { const reconnect = reconnectRef.current; reconnect && reconnect(options); // eslint-disable-next-line }, deps); useEffect(() => { const reconnect = connect(); reconnectRef.current = reconnect; return () => { reconnect(); reconnectRef.current = null; }; }, [connect]); return selector; }