UNPKG

react-obsidian

Version:

Dependency injection framework for React and React Native applications

27 lines (20 loc) 906 B
import { useEffect, useState } from 'react'; import { MediatorObservable } from './mediator/MediatorObservable'; import { ObservedValues, Unsubscribe } from './types'; import { mapObservablesToValues } from './mapObservablesToValues'; export function useObservers<T extends Record<string, any>>(observables: T): ObservedValues<T> { const [values, setValues] = useState(() => mapObservablesToValues(observables)); useEffect(() => { const mediator = new MediatorObservable(); const unsubscribers: Unsubscribe[] = []; Object.keys(observables).forEach((key) => { const onNext = (value: any) => setValues({ ...values, [key]: value }); mediator.addSource(observables[key], onNext); unsubscribers.push(() => { observables[key].unsubscribe(onNext); }); }); return () => unsubscribers.forEach(unsubscribe => unsubscribe()); }, []); return values; }