rxjs-observable-store
Version:
A state management solution implemented using RxJS to mimic Redux architecture.
82 lines (81 loc) • 2.94 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Store = void 0;
var rxjs_1 = require("rxjs");
var operators_1 = require("rxjs/operators");
var Store = /** @class */ (function () {
function Store(initialState) {
this._state$ = new rxjs_1.BehaviorSubject(initialState);
this.state$ = this._state$.asObservable();
}
Object.defineProperty(Store.prototype, "state", {
get: function () {
return this._state$.getValue();
},
enumerable: false,
configurable: true
});
Store.prototype.setState = function (nextState) {
this._state$.next(nextState);
};
Store.prototype.patchState = function (value) {
var path = [];
for (var _i = 1; _i < arguments.length; _i++) {
path[_i - 1] = arguments[_i];
}
if (path.length < 1) {
return;
}
this.setState(this.getUpdatedState(value, this.state, path));
};
Store.prototype.onChanges = function () {
var path = [];
for (var _i = 0; _i < arguments.length; _i++) {
path[_i] = arguments[_i];
}
return this.state$.pipe((0, operators_1.map)(function (state) {
return path.reduce(function (result, part) {
if (result === undefined || result === null) {
return undefined;
}
return result[part];
}, state);
}), (0, operators_1.distinctUntilChanged)());
};
Store.prototype.getUpdatedState = function (value, stateSubtree, path) {
var _a, _b, _c;
var key = path[0];
if (path.length === 1) {
return __assign(__assign({}, stateSubtree), (_a = {}, _a[key] = value, _a));
}
if (stateSubtree[key] === undefined || stateSubtree[key] === null) {
return __assign(__assign({}, stateSubtree), (_b = {}, _b[key] = this.createStateSubtree(value, path.slice(1)), _b));
}
return __assign(__assign({}, stateSubtree), (_c = {}, _c[key] = this.getUpdatedState(value, stateSubtree[key], path.slice(1)), _c));
};
Store.prototype.createStateSubtree = function (value, path) {
var _a, _b;
var key = path[0];
if (path.length === 1) {
return _a = {},
_a[key] = value,
_a;
}
return _b = {},
_b[key] = this.createStateSubtree(value, path.slice(1)),
_b;
};
return Store;
}());
exports.Store = Store;