|
|
@@ -0,0 +1,80 @@
|
|
|
+import { applyMiddleware, createStore } from 'redux';
|
|
|
+import createSagaMiddleware from 'redux-saga';
|
|
|
+import { createLogger } from 'redux-logger';
|
|
|
+
|
|
|
+import { rootReducer } from 'reducers';
|
|
|
+import { rootSaga } from 'sagas';
|
|
|
+
|
|
|
+const SKIP_LOG_ACTIONS = (process.env.SKIP_LOG_ACTIONS || '').split(',');
|
|
|
+
|
|
|
+export function getStoreMiddleware(__DEV__) {
|
|
|
+ const middleware = [rootReducer];
|
|
|
+
|
|
|
+ if (__DEV__) {
|
|
|
+ const devToolsMiddleware = window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__({
|
|
|
+ actionsBlacklist: SKIP_LOG_ACTIONS
|
|
|
+ });
|
|
|
+
|
|
|
+ middleware.push(devToolsMiddleware);
|
|
|
+ }
|
|
|
+
|
|
|
+ return middleware;
|
|
|
+}
|
|
|
+
|
|
|
+export function makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware) {
|
|
|
+ const middleware = [sagaMiddleware];
|
|
|
+
|
|
|
+ if (__DEV__) {
|
|
|
+ const logger = createLogger({
|
|
|
+ collapsed: true,
|
|
|
+ predicate: (getState, action) => !SKIP_LOG_ACTIONS.includes(action.type)
|
|
|
+ });
|
|
|
+
|
|
|
+ middleware.push(logger);
|
|
|
+ }
|
|
|
+
|
|
|
+ return applyMiddleware(...middleware)(createStore);
|
|
|
+}
|
|
|
+
|
|
|
+function createCustomStore() {
|
|
|
+ const __DEV__ = process.env.NODE_ENV === 'development';
|
|
|
+ const __TEST__ = process.env.NODE_ENV === 'test';
|
|
|
+
|
|
|
+ if (__TEST__) {
|
|
|
+ return createStore(rootReducer);
|
|
|
+ }
|
|
|
+
|
|
|
+ const sagaMiddleware = createSagaMiddleware();
|
|
|
+
|
|
|
+ const createStoreWithMiddleware = makeCreateStoreWithMiddleware(__DEV__, sagaMiddleware);
|
|
|
+
|
|
|
+ const store = createStoreWithMiddleware(...getStoreMiddleware(__DEV__));
|
|
|
+
|
|
|
+ let sagaTask = sagaMiddleware.run(function *getSagas() {
|
|
|
+ yield rootSaga();
|
|
|
+ });
|
|
|
+
|
|
|
+ if (__DEV__ && module.hot) {
|
|
|
+ module.hot.accept('./reducers', () => {
|
|
|
+ // eslint-disable-next-line global-require
|
|
|
+ store.replaceReducer(require('./reducers').default);
|
|
|
+ });
|
|
|
+
|
|
|
+ module.hot.accept('./sagas', () => {
|
|
|
+ // eslint-disable-next-line global-require
|
|
|
+ const newRootSaga = require('./sagas').rootSaga;
|
|
|
+
|
|
|
+ sagaTask.cancel();
|
|
|
+ sagaTask.done.then(() => {
|
|
|
+ sagaTask = sagaMiddleware.run(function *replacedSaga() {
|
|
|
+ yield newRootSaga();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ return store;
|
|
|
+}
|
|
|
+
|
|
|
+export { createCustomStore as createStore };
|
|
|
+
|