Skip to content

Commit e39c020

Browse files
author
Guilherme Monte
committed
fix(use-storage): using with SSR
1 parent cc09c01 commit e39c020

File tree

1 file changed

+31
-1
lines changed

1 file changed

+31
-1
lines changed

packages/use-storage/src/index.ts

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,34 @@ const canUseDOM =
2424
typeof window.sessionStorage !== 'undefined'
2525
)
2626

27+
const createMemoryStorage = (): Storage => {
28+
const storage: { [key: string]: string | null } = {}
29+
30+
return {
31+
length: Object.entries(storage).length,
32+
clear() {
33+
Object.keys(storage).forEach(key => {
34+
delete storage[key]
35+
})
36+
},
37+
key(index) {
38+
return Object.values(storage)[index] ?? null
39+
},
40+
getItem(key) {
41+
return storage[key] ?? null
42+
},
43+
setItem(key, value) {
44+
storage[key] = value
45+
},
46+
removeItem(key) {
47+
delete storage[key]
48+
},
49+
}
50+
}
51+
52+
const getStorage = (name: 'localStorage' | 'sessionStorage') =>
53+
canUseDOM ? window[name] : createMemoryStorage()
54+
2755
const subscribeStorage = (callback: () => void) => {
2856
if (canUseDOM) {
2957
window.addEventListener('storage', callback)
@@ -47,7 +75,9 @@ const useStorage = <T>(
4775
): [T | null, (value: T | undefined) => void] => {
4876
const storage = useMemo(
4977
() =>
50-
options?.kind === 'session' ? window.sessionStorage : window.localStorage,
78+
options?.kind === 'session'
79+
? getStorage('sessionStorage')
80+
: getStorage('localStorage'),
5181
[options?.kind],
5282
)
5383

0 commit comments

Comments
 (0)