All files / src setupStore.js

0% Statements 0/46
0% Branches 0/18
0% Functions 0/6
0% Lines 0/19
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79                                                                                                                                                             
import Immutable from 'immutable';
import installDevTools from 'immutable-devtools';
 
import thunk from 'redux-thunk';
import { createStore, applyMiddleware, compose } from 'redux';
import { combineReducers } from 'redux-immutable';
import { useRouterHistory } from 'react-router';
import { createHistory, useBasename, useBeforeUnload } from 'history';
import { syncHistoryWithStore, routerMiddleware, LOCATION_CHANGE } from 'react-router-redux';
import { createUserManager, loadUser, reducer as oidcStateReducer } from 'data/SingleSignOn';
import { reducer as privileges } from 'containers/Privileges';
import { reducer as impersonate } from 'containers/Impersonate';
import { reducer as apiCalls } from 'containers/ApiCalls';
import createLoggerMiddleware from 'domain/createLoggerMiddleware';
import createSignInRedirectMiddleware from 'domain/createSignInRedirectMiddleware';
import createNotificationsMiddleware from 'domain/createNotificationsMiddleware';
import Config from 'domain/Config';
 
if (! PRODUCTION) {
  installDevTools(Immutable);
}
 
export function setupStore(reducer) {
  const browserHistory = useRouterHistory(useBeforeUnload(useBasename(createHistory)))({
    basename: '',
  });
 
  const notificationsTriggerConfig = Config.get('notificationsTrigger');
 
  const reduxRouterMiddleware = routerMiddleware(browserHistory);
  const createStoreWithMiddleware = compose(
    applyMiddleware.apply(this, [
      reduxRouterMiddleware,
      thunk,
      createSignInRedirectMiddleware(),
      createLoggerMiddleware(),
      notificationsTriggerConfig ?
          createNotificationsMiddleware(notificationsTriggerConfig) :
          undefined,
    ].filter((i) => i))
  )(createStore);
 
  const store = createStoreWithMiddleware(createReducer(reducer),
      window.devToolsExtension && window.devToolsExtension());
 
  const syncBrowserHistory = syncHistoryWithStore(browserHistory, store, {
    selectLocationState: (state) => state.get('routing').toJS(),
  });
 
  if (Config.get('featureLogin')) {
    loadUser(store, createUserManager());
  }
 
  return { store, syncBrowserHistory };
}
 
function createReducer(reducer) {
  return combineReducers({
    rootReducer: combineReducers(reducer),
    routing,
    singleSignOn: oidcStateReducer,
    privileges,
    impersonate,
    apiCalls,
  });
}
 
function routing(state = Immutable.fromJS({ locationBeforeTransitions: null }), action) {
  if (action.type === LOCATION_CHANGE) {
    return state.merge({
      locationBeforeTransitions: action.payload,
    });
  }
 
  return state;
}
 
export default setupStore;