/
useReadStatus.js
48 lines (39 loc) · 1.13 KB
/
useReadStatus.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
import { debounce } from 'lodash'
import { useEffect, useRef, useState } from 'react'
const READ_STATUS_KEY = 'read-status'
const useLocalStorage = (key, initialValue) => {
const [storedValue, setStoredValue] = useState(() => {
try {
const item = window.localStorage.getItem(key)
return item ? JSON.parse(item) : initialValue
} catch (error) {
console.log(error)
return initialValue
}
})
const setLocalStorageValue = useRef(
debounce((value) => {
try {
window.localStorage.setItem(key, JSON.stringify(value))
} catch (error) {
console.log(error)
}
}, 300)
)
useEffect(() => {
setLocalStorageValue.current(storedValue)
}, [storedValue, setLocalStorageValue])
return [storedValue, setStoredValue]
}
export const useReadStatus = (slug) => {
const [readStatuses, setReadStatuses] = useLocalStorage(READ_STATUS_KEY, {})
const readStatus = readStatuses[slug] || false
const setReadStatus = (value) => {
setReadStatuses({
...readStatuses,
[slug]: value,
})
}
return [readStatus, setReadStatus]
}
export default useReadStatus