Skip to content

Commit f3ffc75

Browse files
task 23 done
1 parent cdd3796 commit f3ffc75

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

src/composables/useLocalStorage.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1-
export function useLocalStorage(key, defaultValue) {
2-
return defaultValue
1+
import type { Ref } from 'vue'
2+
import { shallowRef, watchEffect, toValue, onMounted, onUnmounted } from 'vue'
3+
4+
export const useLocalStorage = (
5+
key: string,
6+
defaultValue: string,
7+
): Ref<string> => {
8+
const value = shallowRef<string>(localStorage.getItem(key) ?? defaultValue)
9+
10+
watchEffect(() => localStorage.setItem(key, toValue(value)))
11+
12+
const listener = (event: StorageEvent) => {
13+
if (event.key !== key) {
14+
return
15+
}
16+
17+
value.value = event.newValue ?? defaultValue
18+
}
19+
20+
onMounted(() => {
21+
window.addEventListener('storage', listener)
22+
})
23+
24+
onUnmounted(() => {
25+
window.removeEventListener('storage', listener)
26+
})
27+
28+
return value
329
}

tests/useLocalStorage.spec.ts

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,51 @@
11
import { describe, it, expect, beforeEach } from 'vitest'
2+
import { createApp } from 'vue'
23
import { useLocalStorage } from '../src/composables/useLocalStorage'
34

45
const storageKey = 'test'
56

6-
describe('useLocalStorage', () => {
7-
beforeEach(function () {
8-
localStorage.clear()
7+
const withSetup = (composable) => {
8+
let result
9+
const app = createApp({
10+
setup() {
11+
result = composable()
12+
13+
return () => {}
14+
},
915
})
16+
17+
app.mount(document.createElement('div'))
18+
19+
return [result, app]
20+
}
21+
22+
beforeEach(() => localStorage.clear())
23+
24+
describe('useLocalStorage', () => {
1025
it('should work w/ default value', () => {
11-
const storage = useLocalStorage(storageKey, 'default')
26+
const [storage, app] = withSetup(() => {
27+
return useLocalStorage(storageKey, 'default')
28+
})
29+
1230
expect(storage.value).toBe('default')
1331
expect(localStorage.getItem(storageKey)).toBe('default')
32+
33+
app.unmount()
1434
})
1535

1636
it('should work w/ storage event', () => {
17-
const storage = useLocalStorage(storageKey, 'default')
37+
const [storage, app] = withSetup(() => {
38+
return useLocalStorage(storageKey, 'default')
39+
})
1840
const storageEvent = new StorageEvent('storage', {
1941
key: storageKey,
2042
newValue: 'new value',
2143
})
44+
2245
window.dispatchEvent(storageEvent)
46+
2347
expect(storage.value).toBe('new value')
48+
49+
app.unmount()
2450
})
2551
})

0 commit comments

Comments
 (0)