Doodle3D-Transform/src/js/store.js

65 lines
2.0 KiB
JavaScript

import { createStore, compose, applyMiddleware } from 'redux';
import thunkMiddleware from 'redux-thunk';
import promiseMiddleware from 'redux-promise-middleware';
import { browserHistory, hashHistory } from 'react-router';
import { routerMiddleware } from 'react-router-redux';
import createLogger from 'redux-logger';
import { makePersistantMiddleware } from 'src/js/services/localStore.js';
import { LOCAL_STORE_READ } from 'src/js/actions/localStore.js';
import { platform } from 'src/js/constants/envs.js';
import promptMiddleware from 'redux-prompt/middleware';
import debugOverlappingDispatches from './utils/debugOverlappingDispatches.js';
import createDebug from 'debug';
// in dev mode when finds debug key in localStorage
// (which is also used by debug module)
const devMode = createDebug.load() !== undefined;
const debug = createDebug('d3d:store');
// create router middleware that handles route actions
const reduxRouterMiddleware = routerMiddleware(platform === 'ios-app' ? hashHistory : browserHistory);
export default function configureStore(reducers, initialState) {
let store;
let middleware = [
reduxRouterMiddleware,
thunkMiddleware,
promiseMiddleware(),
promptMiddleware(),
makePersistantMiddleware(state => state.localStore, LOCAL_STORE_READ),
debugOverlappingDispatches()
];
if (devMode) {
// add development middleware
const logger = createLogger({
predicate: (_, action) => action.log !== false,
collapsed: true,
logErrors: false
});
middleware = [
...middleware,
logger
];
}
store = createStore(
reducers,
initialState,
compose( // compose store enhancers
applyMiddleware(...middleware)
)
);
if (module.hot) {
module.hot.accept('./reducers/index.js', () => {
const reducer = require('./reducers/index.js').default;
debug('Reducers changed, replacing reducers of store');
store.replaceReducer(reducer);
});
}
return store;
}