UNPKG

rmux

Version:
146 lines (133 loc) 3.78 kB
/*! * rmux.js v0.0.1-alpha.16 * (c) 2018-2019 空鱼 * Released under the MIT License. */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var reactRemux = require('react-remux'); var React = _interopDefault(require('react')); var muxLib = require('mux-lib'); var rmuxRouter = require('rmux-router'); var rmuxFetch = require('rmux-fetch'); class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, errorInfo) { // tslint:disable console.error("loading error: ", error, errorInfo); // tslint:enable this.setState({ hasError: true }); } render() { const { errorFallback = null, children } = this.props; const { hasError } = this.state; return hasError ? errorFallback : children; } } const BlockProvider = props => { const { model, plugins = {}, children, namespace, prefix, fetchOption, errorInterceptor, requestInterceptor, responseInterceptor, config } = props; muxLib.invariant(namespace !== undefined, `[rmux] namespace except get string,but get ${typeof namespace}`); const injectModel = { ...model, namespace: model.namespace === undefined ? namespace : model.namespace }; return React.createElement(reactRemux.Provider, { model: injectModel, plugins: plugins, config: config }, React.createElement(rmuxFetch.FetchProvider, { namespace: namespace, prefix: prefix, fetchOption: fetchOption, errorInterceptor: errorInterceptor, requestInterceptor: requestInterceptor, responseInterceptor: responseInterceptor }, children)); }; const Provider = props => { const { model, plugins = {}, children, loading, prefix, fetchOption, errorInterceptor, requestInterceptor, responseInterceptor, config, asyncLoader, errorFallback } = props; const { extraReducers = [], middlewares = [] } = plugins; const history = props.history || rmuxRouter.createBrowserHistory(); /** * 项目初始化的时候 全局的 model fetch 配置项都可以为空 * 只做 router 的初始化 */ if (muxLib.isPlainObject(model)) { const injectPlugins = { ...plugins, extraReducers: [{ router: rmuxRouter.connectRouter(history) }, ...extraReducers], middlewares: [rmuxRouter.routerMiddleware(history), ...middlewares] }; return React.createElement(ErrorBoundary, { errorFallback: errorFallback }, React.createElement(reactRemux.Provider, { model: model, plugins: injectPlugins, config: config }, React.createElement(rmuxFetch.RootFetchProvider, { prefix: prefix, fetchOption: fetchOption, errorInterceptor: errorInterceptor, requestInterceptor: requestInterceptor, responseInterceptor: responseInterceptor }, React.createElement(rmuxRouter.RouterProvider, { history: history, loading: loading, asyncLoader: asyncLoader }, children)))); } return React.createElement(ErrorBoundary, { errorFallback: errorFallback }, React.createElement(rmuxFetch.RootFetchProvider, { prefix: prefix, fetchOption: fetchOption, errorInterceptor: errorInterceptor, requestInterceptor: requestInterceptor, responseInterceptor: responseInterceptor }, React.createElement(rmuxRouter.RouterProvider, { history: history, loading: loading, asyncLoader: asyncLoader }, children))); }; exports.BlockProvider = BlockProvider; exports.Provider = Provider;