UNPKG

2.26 kBJavaScriptView Raw
1/* global __DEV__ */
2/* global __SERVER__ */
3/* global __LOGREDUX__ */
4
5import {combineReducers, createStore, applyMiddleware, compose} from "redux";
6import {routerMiddleware, routerReducer} from "react-router-redux";
7import thunk from "redux-thunk";
8import appReducers from "reducers";
9import {createLogger} from "redux-logger";
10
11import promiseMiddleware from "./middlewares/promiseMiddleware";
12
13import auth from "./reducers/auth";
14import fetchData from "./reducers/fetchData";
15import loading from "./reducers/loading";
16import loadingProgress from "./reducers/loadingProgress";
17
18/**
19 @param {Object} initialState initial state to bootstrap our stores with for server-side rendering
20 @param {Object} history a history object. We use `createMemoryHistory` for server-side rendering, while using browserHistory for client-side rendering.
21*/
22export default function storeConfig(initialState, history, reduxMiddleware = false) {
23
24 // Installs hooks that always keep react-router and redux store in sync
25 const middleware = [thunk, promiseMiddleware, routerMiddleware(history)];
26 if (__DEV__ && !__SERVER__ && __LOGREDUX__) middleware.push(createLogger());
27
28 // Custom middleware
29 const appliedMiddleware = reduxMiddleware
30 ? reduxMiddleware(applyMiddleware, middleware)
31 : applyMiddleware(...middleware);
32
33 const canonReducer = combineReducers(Object.assign({
34 auth,
35 data: fetchData,
36 env: (state = {}) => state,
37 i18n: (state = {}) => state,
38 legal: (state = {}) => state,
39 loading,
40 loadingProgress,
41 location: (state = {}) => state,
42 mailgun: (state = false) => state,
43 routing: routerReducer,
44 social: (state = []) => state
45 }, appReducers));
46
47 const composeEnhancers =
48 __DEV__ && !__SERVER__ && typeof window === "object" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
49 ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
50 : compose;
51
52 const enhancers = composeEnhancers(appliedMiddleware);
53 const store = createStore(canonReducer, initialState, enhancers);
54
55 if (module.hot) {
56 // Enable Webpack hot module replacement for reducers
57 module.hot.accept("reducers", () => {
58 const nextReducer = require("reducers");
59 store.replaceReducer(nextReducer);
60 });
61 }
62
63 return store;
64
65}