Created
October 27, 2018 03:43
-
-
Save shierro/0c9bb943975dadee1da3b32df90552bd to your computer and use it in GitHub Desktop.
store configuration of a react app
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { createStore, applyMiddleware, compose } from 'redux'; | |
import { routerMiddleware } from 'react-router-redux'; | |
import createSagaMiddleware from 'redux-saga'; | |
import { createLogger } from 'redux-logger'; | |
import { createOffline } from '@redux-offline/redux-offline'; | |
import offlineConfig from '@redux-offline/redux-offline/lib/defaults'; | |
import { | |
persist, | |
persistAutoRehydrate, | |
offlineStateLens, | |
} from 'redux-offline-immutable-config'; | |
import { Iterable } from 'immutable'; | |
import { | |
offlineMiddleware, | |
suspendSaga, | |
consumeActionMiddleware, | |
} from 'redux-offline-queue'; | |
import createReducer from './reducers'; | |
const persistOptions = { | |
key: 'root', | |
whitelist: [ | |
'mapPage', | |
'App', | |
'route', | |
'householderListPage', | |
'servicePage', | |
'offline', | |
], | |
blacklist: ['rehydrate'], | |
}; | |
const config = { | |
...offlineConfig, | |
persist, | |
persistAutoRehydrate, | |
persistOptions, | |
offlineStateLens, | |
}; | |
const sagaMiddleware = createSagaMiddleware(); | |
/* istanbul ignore next */ | |
const transform = state => { | |
if (Iterable.isIterable(state)) { | |
return state.toJS(); | |
} | |
return state; | |
}; | |
// If Redux DevTools Extension is installed use it, otherwise use Redux compose | |
/* eslint-disable no-underscore-dangle, indent */ | |
const getComposeEnhancers = () => | |
process.env.NODE_ENV !== 'production' && | |
typeof window === 'object' && | |
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ | |
? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ | |
// TODO Try to remove when `react-router-redux` is out of beta, LOCATION_CHANGE should not be fired more than once after hot reloading | |
// Prevent recomputing reducers for `replaceReducer` | |
shouldHotReload: false, | |
}) | |
: compose; | |
/* eslint-enable */ | |
/* eslint-disable no-param-reassign */ | |
const addExtentionsAndHotReload = store => { | |
// 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; | |
}; | |
export default function configureStore(initialState, history) { | |
const middlewares = [routerMiddleware(history)]; | |
/* istanbul ignore next */ | |
if (process.env.NODE_ENV === 'development') { | |
middlewares.push( | |
createLogger({ stateTransformer: state => transform(state) }), | |
); | |
} | |
/* istanbul ignore next */ | |
config.persistCallback = () => { | |
if (store.dispatch) { | |
store.dispatch({ type: 'REHYDRATE_STORE' }); | |
} | |
}; | |
const { | |
// middleware: reduxOfflineMiddleware, | |
enhanceReducer, | |
enhanceStore, | |
} = createOffline(config); | |
// middlewares.push(reduxOfflineMiddleware); | |
// these are the configs found on redux-offline-queue README | |
middlewares.push(offlineMiddleware()); | |
const suspendSagaMiddleware = suspendSaga(sagaMiddleware); | |
middlewares.push(suspendSagaMiddleware); | |
middlewares.push(consumeActionMiddleware()); | |
const middlewareList = applyMiddleware(...middlewares); | |
const store = createStore( | |
enhanceReducer(createReducer()), | |
undefined, | |
getComposeEnhancers()(enhanceStore, middlewareList), | |
); | |
return addExtentionsAndHotReload(store); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment