UNPKG

mobx-roof

Version:

Simple React data management by mobx.

50 lines (48 loc) 1.53 kB
import React, { Component, PropTypes } from 'react'; import { CONTEXT_NAME } from '../common/constants'; import { observer as originObserver } from 'mobx-react'; import { addMobxContextToComponent } from '../common/utils'; import MobxContext from '../core/MobxContext'; /** * @param {Object} contextInitData * @param {Object} opts * - middlewares * - transfer * - subscribe * @return {Function} */ export default function createContext(contextInitData, opts = {}) { return function (WrappedComponent) { const ObserverComponent = originObserver(WrappedComponent); addMobxContextToComponent(ObserverComponent); class ContextContainer extends Component { static childContextTypes = { [CONTEXT_NAME]: PropTypes.object.isRequired, } constructor() { super(...arguments); if (contextInitData instanceof MobxContext) { this[CONTEXT_NAME] = contextInitData; } else { const parentContext = this.getParentContext(); this[CONTEXT_NAME] = new MobxContext(contextInitData, { ...opts, parentContext }); } } getChildContext() { return { [CONTEXT_NAME]: this[CONTEXT_NAME], }; } componentWillUnmount() { this[CONTEXT_NAME].destroy(); } getParentContext() { return this.context[CONTEXT_NAME]; } render() { return <ObserverComponent {...this[CONTEXT_NAME].data} {...this.props} />; } } return ContextContainer; }; }