import { browserHistory } from 'react-router'; import { compose } from 'redux'; import { createApolloClient, configureStore, addAction, getActions, addReducer, getReducers, addMiddleware, getMiddlewares, } from '../modules/index.js'; let context; export const initContext = () => { // init const history = browserHistory; const loginToken = global.localStorage['Meteor.loginToken']; let apolloClient; // init context context = { history, loginToken, addAction, // context.addAction same as addAction getActions, // context.getActions same as getActions addReducer, // context.addReducer same as addReducer getReducers, // context.getReducers same as getReducers addMiddleware, // context.addMiddleware same as addMiddleware getMiddlewares, // context.getMiddlewares same as getMiddlewares }; // defer creation of apolloClient until it is first used Object.defineProperty(context, 'apolloClient', { enumerable: true, get: () => { if (!apolloClient) { apolloClient = createApolloClient(); addReducer({ apollo: apolloClient.reducer() }); addMiddleware(apolloClient.middleware()); } return apolloClient; }, }); // init store context.store = configureStore(context.getReducers, {}, (store) => { let chain, newDispatch; return next => (action) => { if (!chain) { chain = context.getMiddlewares().map(middleware => middleware(store)); newDispatch = compose(...chain)(next) } return newDispatch(action); }; }) } // render context object export const renderContext = { get: () => { if (typeof context === 'undefined') { initContext(); } return context } }; // render context get function export const getRenderContext = () => renderContext.get(); // withRenderContext make it easy to access context export const withRenderContext = (func) => { func(context); };