lbry-desktop/src/renderer/store.js

124 lines
3.7 KiB
JavaScript
Raw Normal View History

import { createLogger } from 'redux-logger';
import appReducer from 'redux/reducers/app';
import availabilityReducer from 'redux/reducers/availability';
import contentReducer from 'redux/reducers/content';
2018-04-18 06:03:01 +02:00
import {
claimsReducer,
costInfoReducer,
fileInfoReducer,
searchReducer,
walletReducer,
2018-04-19 18:51:18 +02:00
notificationsReducer,
2018-04-24 20:17:11 +02:00
blacklistReducer,
2018-04-18 06:03:01 +02:00
} from 'lbry-redux';
import navigationReducer from 'redux/reducers/navigation';
import rewardsReducer from 'redux/reducers/rewards';
import settingsReducer from 'redux/reducers/settings';
import userReducer from 'redux/reducers/user';
import shapeShiftReducer from 'redux/reducers/shape_shift';
import subscriptionsReducer from 'redux/reducers/subscriptions';
2018-03-26 23:32:43 +02:00
import publishReducer from 'redux/reducers/publish';
import { persistStore, autoRehydrate } from 'redux-persist';
import createCompressor from 'redux-persist-transform-compress';
import createFilter from 'redux-persist-transform-filter';
import localForage from 'localforage';
import { createStore, applyMiddleware, compose, combineReducers } from 'redux';
import thunk from 'redux-thunk';
2017-04-07 07:15:22 +02:00
function isFunction(object) {
return typeof object === 'function';
2017-04-07 07:15:22 +02:00
}
function isNotFunction(object) {
return !isFunction(object);
2017-04-07 07:15:22 +02:00
}
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);
}
};
}
2017-12-08 21:14:35 +01:00
const reducers = combineReducers({
2017-06-01 18:20:12 +02:00
app: appReducer,
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-12-01 04:51:55 +01:00
shapeShift: shapeShiftReducer,
2017-12-08 21:14:35 +01:00
subscriptions: subscriptionsReducer,
2018-03-26 23:32:43 +02:00
publish: publishReducer,
2018-04-19 18:51:18 +02:00
notifications: notificationsReducer,
2018-04-24 20:17:11 +02:00
blacklist: blacklistReducer,
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
if (app.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
// eslint-disable-next-line no-underscore-dangle
2017-12-08 21:14:35 +01:00
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
enableBatching(reducers),
{}, // initial state
composeEnhancers(
autoRehydrate({
log: app.env === 'development',
2017-12-08 21:14:35 +01:00
}),
applyMiddleware(...middleware)
)
);
2017-04-07 07:15:22 +02:00
const compressor = createCompressor();
const saveClaimsFilter = createFilter('claims', ['byId', 'claimsByUri']);
const subscriptionsFilter = createFilter('subscriptions', ['subscriptions']);
const contentFilter = createFilter('content', ['positions', 'history']);
2018-04-18 06:03:01 +02:00
// We only need to persist the receiveAddress for the wallet
const walletFilter = createFilter('wallet', ['receiveAddress']);
const persistOptions = {
whitelist: ['claims', 'subscriptions', 'publish', 'wallet', 'content'],
// Order is important. Needs to be compressed last or other transforms can't
// read the data
transforms: [saveClaimsFilter, subscriptionsFilter, walletFilter, contentFilter, compressor],
debounce: 10000,
storage: localForage,
};
2017-04-07 07:15:22 +02:00
2017-12-08 21:14:35 +01:00
window.cacheStore = persistStore(store, persistOptions, err => {
if (err) {
2018-03-26 23:32:43 +02:00
console.error('Unable to load saved settings'); // eslint-disable-line no-console
2017-12-08 21:14:35 +01:00
}
});
export default store;