import { routerMiddleware } from 'connected-react-router/immutable'; import { Iterable } from 'immutable'; import { applyMiddleware, compose, createStore } from 'redux'; import { createLogger } from 'redux-logger'; import createSagaMiddleware from 'redux-saga'; import thunk from 'redux-thunk'; import createReducer from './reducers'; const logger = createLogger({ stateTransformer: state => { if (Iterable.isIterable(state)) return state.toJS(); return state; }, }); export default function configureStore(initialState = {}, history) { let composeEnhancers = compose; let reduxSagaMonitorOptions = {}; /* istanbul ignore next */ if (process.env.NODE_ENV !== 'production' && typeof window === 'object') { /* eslint-disable no-underscore-dangle */ if (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({}); if (window.__SAGA_MONITOR_EXTENSION__) reduxSagaMonitorOptions = { sagaMonitor: window.__SAGA_MONITOR_EXTENSION__, }; /* eslint-enable */ } const sagaMiddleware = createSagaMiddleware(reduxSagaMonitorOptions); const middlewares = [sagaMiddleware, routerMiddleware(history), logger, thunk]; const enhancers = [applyMiddleware(...middlewares)]; const store = createStore(createReducer(), initialState, composeEnhancers(...enhancers)); // Extensions store.runSaga = sagaMiddleware.run; store.injectedReducers = {}; // Reducer registry store.injectedSagas = {}; // Saga registry if (module.hot) { module.hot.accept('./reducers', () => { store.replaceReducer(createReducer(store.injectedReducers)); }); } return store; }