eunomia-controller
Version:
46 lines (39 loc) • 1.38 kB
JavaScript
// Boilerplate reduction for dynamic routes
const errorLoading = (err) => console.error('Dynamic page loading failed', err)
const loadModule = (cb) => (componentModule) => cb(null, componentModule.default)
const injectAndRender = (injectReducer, reducer, injectSagas, sagas, renderRoute, component) => {
injectReducer('home', reducer.default);
injectSagas(sagas.default);
renderRoute(component);
}
const createRoutes = (store, routes, getAsyncInjectors, createReducer) => {
const { injectReducer, injectSagas } = getAsyncInjectors(store, createReducer);
return routes.map(item => {
let result = {
path: item.path,
name: item.name
}
if (typeof item.component.length !== 'undefined') {
Object.assign(result, {
getComponent(nextState, cb) {
const renderRoute = loadModule(cb);
Promise.all(item.component).then(([reducer, sagas, component]) => injectAndRender(injectReducer, reducer, injectSagas, sagas, renderRoute, component)).catch(errorLoading);
}
})
}
else {
Object.assign(result, {
getComponent(nextState, cb) {
item.component.then(loadModule(cb)).catch(errorLoading)
}
})
}
return result
})
}
module.exports = ({
errorLoading: errorLoading,
loadModule: loadModule,
injectAndRender: injectAndRender,
createRoutes: createRoutes
})