import { useState } from 'react'; import useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect'; export interface Observable { subscribe: ( listener: (value: T) => void ) => { unsubscribe: () => void; }; } function useObservable(observable$: Observable): T | undefined; function useObservable(observable$: Observable, initialValue: T): T; function useObservable(observable$: Observable, initialValue?: T): T | undefined { const [value, update] = useState(initialValue); useIsomorphicLayoutEffect(() => { const s = observable$.subscribe(update); return () => s.unsubscribe(); }, [observable$]); return value; } export default useObservable;