import { applyMiddleware, createStore } from 'redux'; import createSagaMiddleware from 'redux-saga'; import { createLogger } from 'redux-logger'; import { rootReducer } from 'reducers'; import { rootSaga } from 'sagas'; const SKIP_LOG_ACTIONS = (process.env.SKIP_LOG_ACTIONS || '').split(','); export function getStoreMiddleware(__DEV__) { const middleware = [rootReducer]; if (__DEV__) { const devToolsMiddleware = window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__({ actionsBlacklist: SKIP_LOG_ACTIONS }); middleware.push(devToolsMiddleware); } return middleware; } export function makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware) { const middleware = [sagaMiddleware]; if (__DEV__) { const logger = createLogger({ collapsed: true, predicate: (getState, action) => !SKIP_LOG_ACTIONS.includes(action.type) }); middleware.push(logger); } return applyMiddleware(...middleware)(createStore); } function createCustomStore() { const __DEV__ = process.env.NODE_ENV === 'development'; const __TEST__ = process.env.NODE_ENV === 'test'; if (__TEST__) { return createStore(rootReducer); } const sagaMiddleware = createSagaMiddleware(); const createStoreWithMiddleware = makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware); const store = createStoreWithMiddleware(...getStoreMiddleware(__DEV__)); let sagaTask = sagaMiddleware.run(function *getSagas() { yield rootSaga(); }); if (__DEV__ && module.hot) { module.hot.accept('./reducers', () => { // eslint-disable-next-line global-require store.replaceReducer(require('./reducers').rootReducer); }); module.hot.accept('./sagas', () => { // eslint-disable-next-line global-require const newRootSaga = require('./sagas').rootSaga; sagaTask.cancel(); sagaTask.done.then(() => { sagaTask = sagaMiddleware.run(function *replacedSaga() { yield newRootSaga(); }); }); }); } return store; } export { createCustomStore as createStore };