Vulcan/packages/nova-lib/lib/client/render_context.js
2017-02-07 09:27:02 +08:00

46 lines
1.2 KiB
JavaScript

import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
import { createApolloClient, addReducer, addMiddleware, getReducers, getMiddlewares } from '../modules/index.js';
const loginToken = global.localStorage['Meteor.loginToken'];
const apolloClient = createApolloClient();
const reducers = addReducer({ apollo: apolloClient.reducer() });
const middlewares = addMiddleware(apolloClient.middleware());
const STORE_RELOADED = 'STORE_RELOADED';
function mainMiddleware(store) {
let chain;
return next => (action) => {
if (!chain || action.type === STORE_RELOADED) {
chain = getMiddlewares().map(middleware => middleware(store));
}
return compose(...chain)(next)(action);
};
}
const store = createStore(s => s, {}, compose(
applyMiddleware(mainMiddleware),
typeof window !== 'undefined' && window.devToolsExtension ? window.devToolsExtension() : f => f,
));
store.reload = function reload() {
const rootReducer = combineReducers(getReducers());
this.replaceReducer(rootReducer);
this.dispatch({ type: STORE_RELOADED });
};
const context = {
loginToken,
apolloClient,
reducers,
middlewares,
store,
};
export const renderContext = {
get() {
return context;
},
};