vuse-rx
Version:
First-class rxjs support for Vue 3
57 lines • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useRxState = exports.defaultOptions = void 0;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const vue_1 = require("vue");
const until_1 = require("../operators/until");
const deepReplaceBuiltin_1 = require("./strategies/deepReplaceBuiltin");
exports.defaultOptions = {
mutationStrategy: deepReplaceBuiltin_1.deepReplaceBuiltin,
strategyContext: deepReplaceBuiltin_1.defaultBuiltin
};
function useRxState(initialState, options) {
const { mutationStrategy, strategyContext } = Object.assign(Object.assign({}, exports.defaultOptions), options);
const mergeKeys = mutationStrategy.bind(strategyContext);
return function (reducers, map$) {
const state = (0, vue_1.reactive)(callMeMaybe(initialState));
const actions = {};
const actions$ = {};
const actions$Arr = [];
let complete = false;
let error = undefined;
const context = {
error: e => { error = e; },
complete: () => { complete = true; }
};
for (const key in reducers) {
const mutations$ = new rxjs_1.Subject();
actions[key] = ((...args) => mutations$.next(reducers[key].apply(reducers, args)));
actions$Arr.push(actions$[`${key}$`] = ((0, operators_1.mergeScan)((prev, curr) => {
curr = callMeMaybe(curr, prev, context);
return ((0, rxjs_1.isObservable)(curr)
? curr
: (0, rxjs_1.of)(curr)).pipe((0, operators_1.map)(mergeKeys(prev, mergeKeys)), (0, operators_1.tap)({
next: () => error
? error = mutations$.error(error)
: complete && mutations$.complete()
}));
}, state)(mutations$)));
}
const merged$ = (0, rxjs_1.merge)(...actions$Arr);
return createRxResult({
actions,
state: (0, vue_1.readonly)(state),
state$: (0, until_1.untilUnmounted)(map$ ? map$(merged$, reducers, state, actions$, context).pipe((0, operators_1.scan)((prev, curr) => mergeKeys(prev, mergeKeys)(curr), state)) : merged$),
actions$: actions$,
});
};
}
exports.useRxState = useRxState;
const createRxResult = (result) => (Object.assign(Object.assign({}, result), { subscribe: (...args) => (Object.assign(Object.assign({}, result), { subscription: result.state$.subscribe(...args) })) }));
const callMeMaybe = (fn, ...args) => (typeof fn === 'function'
? fn(...args)
: fn);
;
;
//# sourceMappingURL=use-rx-state.js.map