/** * Create the store with dynamic reducers */ import { createStore, applyMiddleware, compose } from 'redux'; import { routerMiddleware } from 'connected-react-router'; import createSagaMiddleware from 'redux-saga'; import createReducer from 'reducers'; const sagaMiddleware = createSagaMiddleware(); declare interface IWindow extends Window { __REDUX_DEVTOOLS_EXTENSION_COMPOSE__: any; // redux-dev-tools definitions not needed } declare const window: IWindow; export default function configureStore(initialState = {}, history) { // Create the store with two middlewares // 1. sagaMiddleware: Makes redux-sagas work // 2. routerMiddleware: Syncs the location/URL path to the state const middlewares = [sagaMiddleware, routerMiddleware(history)]; const enhancers = [applyMiddleware(...middlewares)]; // tslint:disable-next-line:max-line-length // If Redux DevTools Extension is installed use it, otherwise use Redux compose /* eslint-disable no-underscore-dangle, indent */ const composeEnhancers = process.env.NODE_ENV !== 'production' && typeof window === 'object' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}) : compose; /* eslint-enable */ const store = createStore( createReducer(), initialState, composeEnhancers(...enhancers), ) as any; // FIX: disable any // Extensions store.runSaga = sagaMiddleware.run; store.injectedReducers = {}; // Reducer registry store.injectedSagas = {}; // Saga registry // Make reducers hot reloadable, see http://mxs.is/googmo /* istanbul ignore next */ if (module['hot']) { module['hot'].accept('./reducers', () => { store.replaceReducer(createReducer(store.injectedReducers)); }); } return store; }