rmux
Version:
146 lines (133 loc) • 4.39 kB
JavaScript
/*!
* rmux.js v0.0.1-alpha.16
* (c) 2018-2019 空鱼
* Released under the MIT License.
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react-remux'), require('react'), require('mux-lib'), require('rmux-router'), require('rmux-fetch')) :
typeof define === 'function' && define.amd ? define(['exports', 'react-remux', 'react', 'mux-lib', 'rmux-router', 'rmux-fetch'], factory) :
(global = global || self, factory(global.rmux = global.rmux || {}, global.reactRemux, global.React, global.muxLib, global.rmuxRouter, global.rmuxFetch));
}(this, (function (exports, reactRemux, React, muxLib, rmuxRouter, rmuxFetch) { 'use strict';
React = React && React.hasOwnProperty('default') ? React['default'] : React;
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;
Object.defineProperty(exports, '__esModule', { value: true });
})));