* Added NOTICE.txt * Add creators to intro sentence * Removed react-addons-pure-render-mixin from NOTICE.txt since it's part of react * Copied fbjs keymirror into utils * Renamed deepFreezeAndThrowOnMutation to deep_freeze * Fixed merge conflict
57 lines
1.7 KiB
JavaScript
57 lines
1.7 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/deep_freeze';
|
|
|
|
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;
|
|
};
|
|
}
|