mirror of
https://github.com/reduxjs/redux-devtools.git
synced 2025-02-23 06:50:39 +03:00
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
export default function persistState(sessionId, stateDeserializer = null, actionDeserializer = null) {
|
|
if (!sessionId) {
|
|
return next => (...args) => next(...args);
|
|
}
|
|
|
|
function deserializeState(fullState) {
|
|
return {
|
|
...fullState,
|
|
committedState: stateDeserializer(fullState.committedState),
|
|
computedStates: fullState.computedStates.map((computedState) => {
|
|
return {
|
|
...computedState,
|
|
state: stateDeserializer(computedState.state)
|
|
};
|
|
})
|
|
};
|
|
}
|
|
|
|
function deserializeActions(fullState) {
|
|
return {
|
|
...fullState,
|
|
stagedActions: fullState.stagedActions.map((action) => {
|
|
return actionDeserializer(action);
|
|
})
|
|
};
|
|
}
|
|
|
|
function deserialize(fullState) {
|
|
if (!fullState) {
|
|
return fullState;
|
|
}
|
|
let deserializedState = fullState;
|
|
if (typeof stateDeserializer === 'function') {
|
|
deserializedState = deserializeState(deserializedState);
|
|
}
|
|
if (typeof actionDeserializer === 'function') {
|
|
deserializedState = deserializeActions(deserializedState);
|
|
}
|
|
return deserializedState;
|
|
}
|
|
|
|
return next => (reducer, initialState) => {
|
|
const key = `redux-dev-session-${sessionId}`;
|
|
|
|
let finalInitialState;
|
|
try {
|
|
finalInitialState = deserialize(JSON.parse(localStorage.getItem(key))) || initialState;
|
|
next(reducer, initialState);
|
|
} catch (e) {
|
|
console.warn('Could not read debug session from localStorage:', e);
|
|
try {
|
|
localStorage.removeItem(key);
|
|
} finally {
|
|
finalInitialState = undefined;
|
|
}
|
|
}
|
|
|
|
const store = next(reducer, finalInitialState);
|
|
|
|
return {
|
|
...store,
|
|
dispatch(action) {
|
|
store.dispatch(action);
|
|
|
|
try {
|
|
localStorage.setItem(key, JSON.stringify(store.getState()));
|
|
} catch (e) {
|
|
console.warn('Could not write debug session to localStorage:', e);
|
|
}
|
|
|
|
return action;
|
|
}
|
|
};
|
|
};
|
|
}
|