rxjs-hooks
Version:
React hooks for RxJS
43 lines • 1.79 kB
JavaScript
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