Skip to content

Commit

Permalink
perf: improve read status hook performance
Browse files Browse the repository at this point in the history
  • Loading branch information
Yukaii committed Jul 9, 2023
1 parent b85c94a commit ef5b029
Showing 1 changed file with 37 additions and 12 deletions.
49 changes: 37 additions & 12 deletions lib/hooks/useReadStatus.js
@@ -1,21 +1,46 @@
// A react hooks that use localstorage to store the read status of a post
import { useEffect, useState } from 'react'
import { debounce } from 'lodash'
import { useEffect, useRef, useState } from 'react'

const READ_STATUS_KEY = 'read-status'

export const useReadStatus = (slug) => {
const [readStatus, setReadStatus] = useState(false)
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
}
})

useEffect(() => {
const readStatuses = JSON.parse(localStorage.getItem(READ_STATUS_KEY)) || {}
setReadStatus(readStatuses[slug] || false)
}, [slug])
const setLocalStorageValue = useRef(
debounce((value) => {
try {
window.localStorage.setItem(key, JSON.stringify(value))
} catch (error) {
console.log(error)
}
}, 300)
)

useEffect(() => {
const readStatuses = JSON.parse(localStorage.getItem(READ_STATUS_KEY)) || {}
readStatuses[slug] = readStatus
localStorage.setItem(READ_STATUS_KEY, JSON.stringify(readStatuses))
}, [readStatus, slug])
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]
}
Expand Down

0 comments on commit ef5b029

Please sign in to comment.