Home Manual Reference Source

App/Store/Store.js

import { createStore, applyMiddleware, compose } from 'redux';
import { autoRehydrate } from 'redux-persist';
import createLogger from 'redux-logger';
import rootReducer from '../Reducers/';
import Config from '../Config/DebugSettings';
import createSagaMiddleware from 'redux-saga';
import sagas from '../Sagas/';
import R from 'ramda';
import RehydrationServices from '../Services/RehydrationServices';
import ReduxPersist from '../Config/ReduxPersist';

// the logger master switch
const USE_LOGGING = Config.reduxLogging;
// silence these saga-based messages
const SAGA_LOGGING_BLACKLIST = ['EFFECT_TRIGGERED', 'EFFECT_RESOLVED', 'EFFECT_REJECTED', 'persist/REHYDRATE'];
// create the logger
const logger = createLogger({
  predicate: (getState, { type }) => USE_LOGGING && R.not(R.contains(type, SAGA_LOGGING_BLACKLIST))
});

let middleware = [];
const sagaMiddleware = createSagaMiddleware();
middleware.push(sagaMiddleware);

// Don't ship these
if (__DEV__) {
  middleware.push(logger);
}

// a function which can create our store and auto-persist the data
export default () => {
  let store = {};

  // Add rehydrate enhancer if ReduxPersist is active
  if (ReduxPersist.active) {
    const enhancers = compose(
      applyMiddleware(...middleware),
      autoRehydrate()
    );

    store = createStore(
      rootReducer,
      enhancers
    );

    // configure persistStore and check reducer version number
    RehydrationServices.updateReducers(store);
  } else {
    const enhancers = compose(
      applyMiddleware(...middleware)
    );

    store = createStore(
      rootReducer,
      enhancers
    );
  }

  // run sagas
  sagaMiddleware.run(sagas);

  return store;
};