react-magic-state
Version:
React state management without the hassle.
46 lines (45 loc) • 1.86 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const symbols = require("../symbols");
const observer_1 = require("../observer");
const changeTracker_1 = require("../changeTracker");
const wrapObservable_1 = require("../wrapObservable");
const canObserve_1 = require("../canObserve");
class BaseHandler {
constructor(target) {
this._target = target;
}
get(target, propKey, receiver) {
var _a, _b, _c;
switch (propKey) {
case symbols.observable:
return true;
case symbols.target:
return target;
}
(_a = observer_1.Observer.active) === null || _a === void 0 ? void 0 : _a.registerAccess(this._target, propKey);
const value = Reflect.get(target, propKey, receiver);
if (canObserve_1.canObserve(value)) {
const propDesc = Reflect.getOwnPropertyDescriptor(target, propKey);
if (((_b = propDesc) === null || _b === void 0 ? void 0 : _b.configurable) || ((_c = propDesc) === null || _c === void 0 ? void 0 : _c.enumerable)) {
return wrapObservable_1.wrapObservable(value);
}
}
return value;
}
set(target, propKey, value, receiver) {
if (observer_1.Observer.active) {
throw new Error(`Attempting to modify property ${propKey.toString()} during observation. Please keep observer functions pure.`);
}
const previousValue = target[propKey];
try {
return Reflect.set(target, propKey, value, receiver);
}
finally {
if (target == this._target && previousValue !== value) {
changeTracker_1.changeTracker.registerChange(target, propKey);
}
}
}
}
exports.BaseHandler = BaseHandler;