const getStore = (initialState={}) => { const well = PromiseWell.create(); const thunk = Thunker.create(); const nav = navigationMiddleware.create(routes); const storeReducers = combineReducers({ ...reducers, platform, }); const storeMiddleware = middleware.concat([nav, thunk, well.middleware]); const store = createStore(storeReducers, initialState, applyMiddleware(...storeMiddleware)); class StoreWrapper extends React.Component { render() { return ( <Provider store={ store }> { this.props.children } </Provider> ); } } return { store, StoreWrapper }; };
export default config => { const { container='container', dataVar='___r', modifyData=data => data, appComponent=<div/>, reducers={}, reduxMiddleware=[], routes=[], debug=false, } = config; const well = PromiseWell.create(); const thunk = Thunker.create(); const nav = navigationMiddleware.create(routes); const reds = combineReducers({ ...reducers, platform }); const wares = reduxMiddleware.concat([nav, thunk, well.middleware]); if (debug) { wares.push(Logger); } return () => { const $container = document.getElementById(container); let data; try { const temp = window[dataVar]; data = modifyData(temp); } catch (e) { data = {}; } const store = createStore(reds, data, compose( applyMiddleware(...wares), window.devToolsExtension ? window.devToolsExtension() : f => f )); ReactDOM.render( <Provider store={ store }> { appComponent } </Provider> ,$container ); return store; }; };
const handleRoute = async (ctx) => { const nav = navigationMiddleware.create(routes); const well = PromiseWell.create(); const thunk = Thunker.create(); const r = combineReducers({ ...reducers, platform }); const store = createStore(r, {}, applyMiddleware( ...reduxMiddleware, nav, thunk, well.middleware, )); store.dispatch(async (dispatch, getState, utils) => { await dispatchBeforeNavigation(ctx, dispatch, getState, utils); }); store.dispatch(actions.navigateToUrl( ctx.request.method.toLowerCase(), ctx.path, { queryParams: ctx.request.query, bodyParams: ctx.request.body, referrer: ctx.headers.referer, } )); await well.onComplete(); const state = store.getState(); // check for redirects const currentUrl = state.platform.currentPage.url; const currentQuery = state.platform.currentPage.queryParams; if (!isEqual(currentUrl, ctx.path) || !isEqual(currentQuery, ctx.request.query)) { if (currentUrl) { let newUrl = currentUrl; if (!isEmpty(currentQuery)) { newUrl += createQuery(currentQuery); } ctx.redirect(newUrl); } else { ctx.redirect('/'); } } else { ctx.body = template(state, store); } };