Repository URL to install this package:
|
Version:
0.1.1 ▾
|
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
const exotic_1 = require("exotic");
const mobx_1 = require("xmobx/mobx");
const mobx_react_1 = require("xmobx/mobx-react");
// import { toComponentName } from '@skava/identifier'
exports.toComponentName = (Target) => Target.displayName || Target.constructor.name;
exports.updatingRegistry = new WeakSet();
/**
* @IDEA: can I get properties that were passed into that type as generic out? props
* @alias updateForProps
*/
function observerWithObservableProps(Target) {
let Decorated = class Decorated extends Target {
/**
* @see https://mobx.js.org/refguide/autorun.html
* @note without `@computed` it returned 2x as often
* @note without `updatingRegistry` it ran 3x as often
*/
componentDidMount() {
/**
* @description this destructures props, triggering them as being accessed
*/
const observableProps = mobx_1.computed(() => (Object.assign({}, this.props)));
// so we do not update state on first mount
let isMounting = true;
this.disposer = mobx_1.autorun(() => {
const props = observableProps.get();
if (exports.updatingRegistry.has(props)) {
// console.info('[updateForProps]{autorun} already had')
}
else {
// console.info('[updateForProps]{autorun} updating')
exports.updatingRegistry.add(props);
/**
* @note usually for perf we would use else here
* but it is already too deep
*
* @todo split this out cleanly, currently depends on isMounting
* for skipping first mount
*
* @todo enable this, currently commented out to avoid pre-optimization
*/
if (isMounting) {
// console.info('[updateForProps]{autorun} skipped because mounting')
return;
}
const inherited = this;
inherited.updateState(props);
}
});
isMounting = false;
if (exotic_1.isFunction(super.componentDidMount)) {
super.componentDidMount();
}
}
componentWillUnmount() {
if (exotic_1.isFunction(this.disposer)) {
this.disposer();
}
if (exotic_1.isFunction(super.componentWillUnmount)) {
super.componentWillUnmount();
}
}
};
Decorated.defaultProps = Target.defaultProps;
Decorated.displayName = 'ObservableProps(' + exports.toComponentName(Target) + ')';
Decorated = __decorate([
mobx_react_1.observer
], Decorated);
return Decorated;
}
exports.observerWithObservableProps = observerWithObservableProps;
//# sourceMappingURL=observerWithObservableProps.js.map