UNPKG

rxjs-hooks

Version:
43 lines 1.79 kB
import { useEffect, useCallback, useMemo } from 'react'; import useConstant from 'use-constant'; import { BehaviorSubject, Subject } from 'rxjs'; import { tap } from 'rxjs/operators'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; export function useEventCallback(callback, initialState, inputs) { var initialValue = (typeof initialState !== 'undefined' ? initialState : null); var event$ = useConstant(function () { return new Subject(); }); var state$ = useConstant(function () { return new BehaviorSubject(initialValue); }); var inputs$ = useConstant(function () { return new BehaviorSubject(typeof inputs === 'undefined' ? null : inputs); }); useEffect(function () { return function () { state$.complete(); inputs$.complete(); event$.complete(); }; }, []); var returnedCallback = useCallback(function eventCallback(e) { event$.next(e); }, []); useEffect(function () { inputs$.next(inputs); }, inputs || []); var subscribe = useMemo(function () { var value$; if (!inputs) { value$ = callback(event$, state$); } else { value$ = callback(event$, state$, inputs$); } return function (onStorageChange) { var subscription = value$.pipe(tap(function (s) { return state$.next(s); })).subscribe(onStorageChange); return function () { return subscription.unsubscribe(); }; }; }, []); var getSnapShot = useMemo(function () { return function () { return state$.getValue(); }; }, []); var state = useSyncExternalStore(subscribe, getSnapShot, getSnapShot); return [returnedCallback, state]; } //# sourceMappingURL=use-event-callback.js.map