2017-06-15 06:27:23 +02:00
|
|
|
import { createLogger } from "redux-logger";
|
2017-11-13 22:02:23 +01:00
|
|
|
import appReducer from "redux/reducers/app";
|
|
|
|
import availabilityReducer from "redux/reducers/availability";
|
|
|
|
import claimsReducer from "redux/reducers/claims";
|
|
|
|
import contentReducer from "redux/reducers/content";
|
|
|
|
import costInfoReducer from "redux/reducers/cost_info";
|
|
|
|
import fileInfoReducer from "redux/reducers/file_info";
|
|
|
|
import navigationReducer from "redux/reducers/navigation";
|
|
|
|
import rewardsReducer from "redux/reducers/rewards";
|
|
|
|
import searchReducer from "redux/reducers/search";
|
|
|
|
import settingsReducer from "redux/reducers/settings";
|
|
|
|
import userReducer from "redux/reducers/user";
|
|
|
|
import walletReducer from "redux/reducers/wallet";
|
2017-06-15 06:27:23 +02:00
|
|
|
import { persistStore, autoRehydrate } from "redux-persist";
|
|
|
|
import createCompressor from "redux-persist-transform-compress";
|
|
|
|
import createFilter from "redux-persist-transform-filter";
|
2017-08-30 14:48:32 +02:00
|
|
|
//import { REHYDRATE } from "redux-persist/constants";
|
|
|
|
//import createActionBuffer from "redux-action-buffer";
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-06-15 06:27:23 +02:00
|
|
|
const localForage = require("localforage");
|
|
|
|
const redux = require("redux");
|
|
|
|
const thunk = require("redux-thunk").default;
|
|
|
|
const env = ENV;
|
2017-04-07 07:15:22 +02:00
|
|
|
|
|
|
|
function isFunction(object) {
|
2017-06-15 06:27:23 +02:00
|
|
|
return typeof object === "function";
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function isNotFunction(object) {
|
2017-06-15 06:27:23 +02:00
|
|
|
return !isFunction(object);
|
2017-04-07 07:15:22 +02:00
|
|
|
}
|
|
|
|
|
2017-04-26 19:08:26 +02:00
|
|
|
function createBulkThunkMiddleware() {
|
2017-06-15 06:27:23 +02:00
|
|
|
return ({ dispatch, getState }) => next => action => {
|
|
|
|
if (action.type === "BATCH_ACTIONS") {
|
|
|
|
action.actions
|
|
|
|
.filter(isFunction)
|
|
|
|
.map(actionFn => actionFn(dispatch, getState));
|
|
|
|
}
|
|
|
|
return next(action);
|
|
|
|
};
|
2017-04-26 19:08:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function enableBatching(reducer) {
|
2017-06-15 06:27:23 +02:00
|
|
|
return function batchingReducer(state, action) {
|
|
|
|
switch (action.type) {
|
|
|
|
case "BATCH_ACTIONS":
|
|
|
|
return action.actions
|
|
|
|
.filter(isNotFunction)
|
|
|
|
.reduce(batchingReducer, state);
|
|
|
|
default:
|
|
|
|
return reducer(state, action);
|
|
|
|
}
|
|
|
|
};
|
2017-04-26 19:08:26 +02:00
|
|
|
}
|
|
|
|
|
2017-04-07 07:15:22 +02:00
|
|
|
const reducers = redux.combineReducers({
|
2017-06-01 18:20:12 +02:00
|
|
|
app: appReducer,
|
2017-08-30 14:48:32 +02:00
|
|
|
navigation: navigationReducer,
|
2017-06-01 18:20:12 +02:00
|
|
|
availability: availabilityReducer,
|
|
|
|
claims: claimsReducer,
|
|
|
|
fileInfo: fileInfoReducer,
|
|
|
|
content: contentReducer,
|
|
|
|
costInfo: costInfoReducer,
|
|
|
|
rewards: rewardsReducer,
|
|
|
|
search: searchReducer,
|
|
|
|
settings: settingsReducer,
|
|
|
|
wallet: walletReducer,
|
|
|
|
user: userReducer,
|
2017-04-07 07:15:22 +02:00
|
|
|
});
|
|
|
|
|
2017-06-06 06:21:55 +02:00
|
|
|
const bulkThunk = createBulkThunkMiddleware();
|
|
|
|
const middleware = [thunk, bulkThunk];
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-06-15 06:27:23 +02:00
|
|
|
if (env === "development") {
|
|
|
|
const logger = createLogger({
|
|
|
|
collapsed: true,
|
|
|
|
});
|
|
|
|
middleware.push(logger);
|
2017-05-12 01:28:43 +02:00
|
|
|
}
|
2017-04-07 07:15:22 +02:00
|
|
|
|
2017-06-22 02:09:30 +02:00
|
|
|
// middleware.push(createActionBuffer(REHYDRATE)); // was causing issues with authentication reducers not firing
|
2017-11-17 21:35:37 +01:00
|
|
|
const composeEnhancers =
|
|
|
|
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || redux.compose;
|
|
|
|
const createStoreWithMiddleware = composeEnhancers(
|
2017-06-15 06:27:23 +02:00
|
|
|
autoRehydrate(),
|
|
|
|
redux.applyMiddleware(...middleware)
|
2017-04-07 07:15:22 +02:00
|
|
|
)(redux.createStore);
|
|
|
|
|
2017-04-26 19:08:26 +02:00
|
|
|
const reduxStore = createStoreWithMiddleware(enableBatching(reducers));
|
2017-06-15 06:27:23 +02:00
|
|
|
const compressor = createCompressor();
|
2017-07-10 16:44:49 +02:00
|
|
|
const saveClaimsFilter = createFilter("claims", ["byId", "claimsByUri"]);
|
2017-06-15 06:27:23 +02:00
|
|
|
|
|
|
|
const persistOptions = {
|
2017-07-08 10:03:12 +02:00
|
|
|
whitelist: ["claims"],
|
2017-06-15 06:27:23 +02:00
|
|
|
// Order is important. Needs to be compressed last or other transforms can't
|
|
|
|
// read the data
|
2017-07-08 10:03:12 +02:00
|
|
|
transforms: [saveClaimsFilter, compressor],
|
2017-07-01 13:03:51 +02:00
|
|
|
debounce: 10000,
|
2017-06-15 06:27:23 +02:00
|
|
|
storage: localForage,
|
|
|
|
};
|
2017-06-16 07:43:43 +02:00
|
|
|
window.cacheStore = persistStore(reduxStore, persistOptions);
|
2017-04-07 07:15:22 +02:00
|
|
|
|
|
|
|
export default reduxStore;
|