Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/state / dist / observerWithObservableProps.js
Size: Mime:
"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