-
Notifications
You must be signed in to change notification settings - Fork 4
/
StateStorage.js
66 lines (60 loc) · 2.06 KB
/
StateStorage.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { isCompactArrayShallowEqual } from 'source/common/immutable/check'
const KEY_LIST_KEY = '@@KEY_LIST'
// sync
// immutable state
// split state save 1 level deeper (diff, may be faster)
const createSyncStateStorage = ({
keyPrefix = 'STATE', // for multi storage setup
setItem = (key, value) => window.localStorage.setItem(`${keyPrefix}|${key}`, JSON.stringify(value)),
getItem = (key) => JSON.parse(window.localStorage.getItem(`${keyPrefix}|${key}`)),
removeItem = (key) => window.localStorage.removeItem(`${keyPrefix}|${key}`)
}) => {
let persistState = {}
let persistKeyList = []
const reset = (initialPersistState) => {
persistState = {}
save(initialPersistState)
return persistState
}
const init = (initialState) => reset({
...initialState,
...load()
})
const save = (state) => {
// __DEV__ && console.log('[save] state:', state)
const keyList = Object.keys(state)
for (const key of keyList) {
__DEV__ && persistState[ key ] !== state[ key ] && console.log('[save] save key:', key)
persistState[ key ] !== state[ key ] && setItem(key, state[ key ])
}
for (const key of persistKeyList) {
__DEV__ && !state[ key ] && console.log('[save] drop key:', key)
!state[ key ] && removeItem(key)
}
if (!isCompactArrayShallowEqual(keyList, persistKeyList)) {
__DEV__ && console.log('[save] save keyList:', keyList)
setItem(KEY_LIST_KEY, keyList)
}
persistState = state
persistKeyList = keyList
}
const load = () => {
try {
const loadKeyList = getItem(KEY_LIST_KEY) || []
persistState = loadKeyList.reduce((o, key) => {
o[ key ] = getItem(key)
return o
}, {})
persistKeyList = loadKeyList // NOTE: set after load state success
__DEV__ && console.log('[load] persistState:', persistState)
} catch (error) { __DEV__ && console.log('[load] error:', error) }
return persistState
}
return {
reset, // will return result state
init, // will return result state
save,
load
}
}
export { createSyncStateStorage }