Skip to content

Commit c948b56

Browse files
committed
Persists entire Redux store to/from sessionStorage
1 parent 67e4669 commit c948b56

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

client/persistState.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
Based on: https://github.com/elgerlambert/redux-localstorage
3+
*/
4+
export default function persistState() {
5+
const key = 'p5js-editor';
6+
const storage = sessionStorage;
7+
8+
return next => (reducer, initialStateOrEnhancer, enhancerOrUndefined) => {
9+
let initialState = initialStateOrEnhancer;
10+
let enhancer = enhancerOrUndefined;
11+
12+
if (typeof initialStateOrEnhancer === 'function' &&
13+
typeof enhancerOrUndefined === 'undefined') {
14+
initialState = undefined;
15+
enhancer = initialStateOrEnhancer;
16+
}
17+
18+
let persistedState;
19+
let finalInitialState;
20+
21+
try {
22+
persistedState = JSON.parse(storage.getItem(key));
23+
finalInitialState = Object.assign({}, initialState, persistedState);
24+
} catch (error) {
25+
console.warn('Failed to retrieve initialize state from storage:', error);
26+
}
27+
28+
const store = next(reducer, finalInitialState, enhancer);
29+
30+
store.subscribe(() => {
31+
const state = store.getState();
32+
33+
try {
34+
storage.setItem(key, JSON.stringify(state));
35+
} catch (error) {
36+
console.warn('Unable to persist state to storage:', error);
37+
}
38+
});
39+
40+
return store;
41+
};
42+
}

client/store.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { createStore, applyMiddleware, compose } from 'redux';
22
import thunk from 'redux-thunk';
33
import DevTools from './modules/App/components/DevTools';
44
import rootReducer from './reducers';
5+
import persistState from './persistState';
56

67
export default function configureStore(initialState) {
78
const enhancers = [
89
applyMiddleware(thunk),
10+
persistState(),
911
];
1012

1113
if (process.env.CLIENT && process.env.NODE_ENV === 'development') {

0 commit comments

Comments
 (0)