lbry-desktop/ui/js/store.js
2017-06-17 12:02:19 +07:00

106 lines
2.9 KiB
JavaScript

import { createLogger } from "redux-logger";
import appReducer from "reducers/app";
import availabilityReducer from "reducers/availability";
import claimsReducer from "reducers/claims";
import contentReducer from "reducers/content";
import costInfoReducer from "reducers/cost_info";
import fileInfoReducer from "reducers/file_info";
import rewardsReducer from "reducers/rewards";
import searchReducer from "reducers/search";
import settingsReducer from "reducers/settings";
import userReducer from "reducers/user";
import walletReducer from "reducers/wallet";
import { persistStore, autoRehydrate } from "redux-persist";
import createCompressor from "redux-persist-transform-compress";
import createFilter from "redux-persist-transform-filter";
import { REHYDRATE } from "redux-persist/constants";
import createActionBuffer from "redux-action-buffer";
const localForage = require("localforage");
const redux = require("redux");
const thunk = require("redux-thunk").default;
const env = ENV;
function isFunction(object) {
return typeof object === "function";
}
function isNotFunction(object) {
return !isFunction(object);
}
function createBulkThunkMiddleware() {
return ({ dispatch, getState }) => next => action => {
if (action.type === "BATCH_ACTIONS") {
action.actions
.filter(isFunction)
.map(actionFn => actionFn(dispatch, getState));
}
return next(action);
};
}
function enableBatching(reducer) {
return function batchingReducer(state, action) {
switch (action.type) {
case "BATCH_ACTIONS":
return action.actions
.filter(isNotFunction)
.reduce(batchingReducer, state);
default:
return reducer(state, action);
}
};
}
const reducers = redux.combineReducers({
app: appReducer,
availability: availabilityReducer,
claims: claimsReducer,
fileInfo: fileInfoReducer,
content: contentReducer,
costInfo: costInfoReducer,
rewards: rewardsReducer,
search: searchReducer,
settings: settingsReducer,
wallet: walletReducer,
user: userReducer,
});
const bulkThunk = createBulkThunkMiddleware();
const middleware = [thunk, bulkThunk];
if (env === "development") {
const logger = createLogger({
collapsed: true,
});
middleware.push(logger);
}
middleware.push(createActionBuffer(REHYDRATE));
const createStoreWithMiddleware = redux.compose(
autoRehydrate(),
redux.applyMiddleware(...middleware)
)(redux.createStore);
const reduxStore = createStoreWithMiddleware(enableBatching(reducers));
const compressor = createCompressor();
const saveClaimsFilter = createFilter("claims", [
"byId",
"claimsByUri",
"myClaims",
"myChannelClaims",
]);
const persistOptions = {
whitelist: ["claims"],
// Order is important. Needs to be compressed last or other transforms can't
// read the data
transforms: [saveClaimsFilter, compressor],
debounce: 1000,
storage: localForage,
};
window.cacheStore = persistStore(reduxStore, persistOptions);
export default reduxStore;