redux-persist
Version:
persist and rehydrate redux stores
67 lines (56 loc) • 2.08 kB
JavaScript
;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _require = require('redux');
var compose = _require.compose;
var bufferActions = require('./bufferActions');
var constants = require('./constants');
module.exports = function autoRehydrate(config) {
config = config || {};
return function (next) {
return function (reducer, initialState) {
var rehydrationReducer = createRehydrationReducer(reducer);
// buffer actions
var store = next(rehydrationReducer, initialState);
var dispatch = compose(bufferActions(onBufferEnd),
//@TODO middleware to unlift reducer?
store.dispatch);
return _extends({}, store, {
dispatch: dispatch
});
};
};
function onBufferEnd(err, queue) {
if (config.log) {
console.log('redux-persist/autoRehydrate Buffer Released', queue);
}
}
function createRehydrationReducer(reducer) {
return function (state, action) {
if (action.type === constants.REHYDRATE) {
var key = action.key;
var data = action.payload;
var reducedState = reducer(state, action);
if (state[key] !== reducedState[key]) {
if (config.log) {
console.log('redux-persist/autoRehydrate sub state for key "%s" modified, skipping autoRehydrate', key);
}
return reducedState;
}
var subState = {};
for (var subkey in reducedState[key]) {
subState[subkey] = reducedState[key][subkey];
}
for (var subkey in data) {
subState[subkey] = data[subkey];
}
reducedState[key] = subState;
if (config.log) {
console.log('redux-persist/autoRehydrate key: %s, rehydrated to:', key, subState);
}
return reducedState;
} else {
return reducer(state, action);
}
};
}
};