import { useCallback, useDebugValue } from 'react'; import shim from 'use-sync-external-store/shim'; import { Defined } from '../utils/type-utils'; import { ReadonlyStateWire, WireState } from './readonly-state-wire'; const { useSyncExternalStore } = shim; export function useWireValue( wire: null | undefined, defaultValue?: unknown, ): undefined; export function useWireValue>( wire: W, ): WireState; export function useWireValue>( wire: W | null | undefined, defaultValue: Defined>, ): Defined>; export function useWireValue>( wire: W, defaultValue?: WireState | undefined, ): WireState; export function useWireValue>( wire: W | null | undefined, defaultValue?: WireState, ): WireState | undefined; export function useWireValue>( wire: W | null | undefined, defaultValue?: WireState, ): WireState | undefined { type Value = WireState; const subscribe: (onStoreChange: () => void) => () => void = useCallback( (fn) => wire?.subscribe(() => fn()) ?? (() => {}), [wire], ); const getSnapshot: () => Value | undefined = useCallback( () => wire?.getValue(), [wire], ); const getServerSnapshot: () => Value | undefined = useCallback( () => wire?.getValue(), [wire], ); const stateValue = useSyncExternalStore( subscribe, getSnapshot, getServerSnapshot, ); const valueToReturn = stateValue === undefined ? defaultValue : stateValue; useDebugValue(valueToReturn); return valueToReturn; }