UNPKG

mobx-roof

Version:

Simple React data management by mobx.

45 lines (44 loc) 1.44 kB
import React, { Component } from 'react'; import { observer as originObserver } from 'mobx-react'; import { addMobxContextToComponent } from '../common/utils'; import { CONTEXT_NAME } from '../common/constants'; /** * @param {String | Array<String> | Object } mobxModels * @returns {Function} */ export default function createObserver(mobxModels = {}) { let modelKeys; if (typeof mobxModels === 'string') { mobxModels = [...arguments]; } if (Array.isArray(mobxModels)) { modelKeys = mobxModels; } else { modelKeys = Object.keys(mobxModels); } return function (WrappedComponent) { const ObserverComponent = originObserver(WrappedComponent); // If empty, use mobx @observer if (modelKeys.length === 0) return ObserverComponent; class ObserverContainer extends Component { constructor() { super(...arguments); if (!this.getMobxContext()) { throw new Error('[@Observer] Please Add decorator "@Context(...)" in your Root Component.'); } this.getMobxContext().checkMobxModels(mobxModels); } getMobxContext() { return this.context[CONTEXT_NAME]; } render() { const contextProps = this.getMobxContext().pick(...modelKeys); return ( <ObserverComponent {...contextProps} {...this.props} /> ); } } addMobxContextToComponent(ObserverContainer); return ObserverContainer; }; }