add actionDeserializer callback to persistState

This commit is contained in:
David Lu 2015-09-10 23:44:49 -04:00
parent 1d41c808a1
commit 3294864b7d

View File

@ -1,30 +1,42 @@
export default function persistState(sessionId, deserializer = null) {
export default function persistState(sessionId, stateDeserializer = null, actionDeserializer = null) {
if (!sessionId) {
return next => (...args) => next(...args);
}
function deserializeState(fullState) {
if (!fullState || typeof deserializer !== 'function') {
if (!fullState || typeof stateDeserializer !== 'function') {
return fullState;
}
return {
...fullState,
committedState: deserializer(fullState.committedState),
committedState: stateDeserializer(fullState.committedState),
computedStates: fullState.computedStates.map((computedState) => {
return {
...computedState,
state: deserializer(computedState.state)
state: stateDeserializer(computedState.state)
};
})
};
}
function deserializeActions(fullState) {
if (!fullState || typeof actionDeserializer !== 'function') {
return fullState;
}
return {
...fullState,
stagedActions: fullState.stagedActions.map((action) => {
return actionDeserializer(action);
})
};
}
return next => (reducer, initialState) => {
const key = `redux-dev-session-${sessionId}`;
let finalInitialState;
try {
finalInitialState = deserializeState(JSON.parse(localStorage.getItem(key))) || initialState;
finalInitialState = deserializeActions(deserializeState(JSON.parse(localStorage.getItem(key)))) || initialState;
next(reducer, initialState);
} catch (e) {
console.warn('Could not read debug session from localStorage:', e);