Skip to content

Instantly share code, notes, and snippets.

@shierro
Created October 27, 2018 03:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shierro/0c9bb943975dadee1da3b32df90552bd to your computer and use it in GitHub Desktop.
Save shierro/0c9bb943975dadee1da3b32df90552bd to your computer and use it in GitHub Desktop.
store configuration of a react app
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