rxjs-hooks
Version:
React hooks for RxJS
48 lines • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useEventCallback = void 0;
var tslib_1 = require("tslib");
var react_1 = require("react");
var use_constant_1 = tslib_1.__importDefault(require("use-constant"));
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var shim_1 = require("use-sync-external-store/shim");
function useEventCallback(callback, initialState, inputs) {
var initialValue = (typeof initialState !== 'undefined' ? initialState : null);
var event$ = (0, use_constant_1.default)(function () { return new rxjs_1.Subject(); });
var state$ = (0, use_constant_1.default)(function () { return new rxjs_1.BehaviorSubject(initialValue); });
var inputs$ = (0, use_constant_1.default)(function () { return new rxjs_1.BehaviorSubject(typeof inputs === 'undefined' ? null : inputs); });
(0, react_1.useEffect)(function () {
return function () {
state$.complete();
inputs$.complete();
event$.complete();
};
}, []);
var returnedCallback = (0, react_1.useCallback)(function eventCallback(e) {
event$.next(e);
}, []);
(0, react_1.useEffect)(function () {
inputs$.next(inputs);
}, inputs || []);
var subscribe = (0, react_1.useMemo)(function () {
var value$;
if (!inputs) {
value$ = callback(event$, state$);
}
else {
value$ = callback(event$, state$, inputs$);
}
return function (onStorageChange) {
var subscription = value$.pipe((0, operators_1.tap)(function (s) { return state$.next(s); })).subscribe(onStorageChange);
return function () { return subscription.unsubscribe(); };
};
}, []);
var getSnapShot = (0, react_1.useMemo)(function () {
return function () { return state$.getValue(); };
}, []);
var state = (0, shim_1.useSyncExternalStore)(subscribe, getSnapShot, getSnapShot);
return [returnedCallback, state];
}
exports.useEventCallback = useEventCallback;
//# sourceMappingURL=use-event-callback.js.map