mattermost-mobile/service/store/configureStore.dev.js
Harrison Healey bd3bd45c36 Added deep freeze of stores in dev mode (#135)
* Added deep freeze of stores in dev mode

* Stopped deletePost and reducePosts reducer functions from mutating the store
2016-12-13 17:13:41 -03:00

57 lines
1.8 KiB
JavaScript

// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
import {applyMiddleware, compose, createStore, combineReducers} from 'redux';
import {enableBatching} from 'redux-batched-actions';
import devTools from 'remote-redux-devtools';
import thunk from 'redux-thunk';
import serviceReducer from 'service/reducers';
import deepFreezeAndThrowOnMutation from 'service/utils/deepFreezeAndThrowOnMutation';
export default function configureServiceStore(preloadedState, appReducer, getAppReducer) {
const store = createStore(
createReducer(serviceReducer, appReducer),
preloadedState,
compose(
applyMiddleware(thunk),
devTools({
name: 'Mattermost',
hostname: 'localhost',
port: 5678
})
)
);
if (module.hot) {
// Enable Webpack hot module replacement for reducers
module.hot.accept(() => {
const nextServiceReducer = require('../reducers').default; // eslint-disable-line global-require
let nextAppReducer;
if (getAppReducer) {
nextAppReducer = getAppReducer(); // eslint-disable-line global-require
}
store.replaceReducer(createReducer(nextServiceReducer, nextAppReducer));
});
}
return store;
}
function createReducer(...reducers) {
const baseReducer = combineReducers(Object.assign({}, ...reducers));
return enableFreezing(enableBatching(baseReducer));
}
function enableFreezing(reducer) {
return (state, action) => {
const nextState = reducer(state, action);
if (nextState !== state) {
deepFreezeAndThrowOnMutation(nextState);
}
return nextState;
};
}