rmux
Version:
146 lines (133 loc) • 3.78 kB
JavaScript
/*!
* rmux.js v0.0.1-alpha.16
* (c) 2018-2019 空鱼
* Released under the MIT License.
*/
;
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;