Fix missing cleanup of dark mode listeners (#1906)

This commit is contained in:
ekzyis 2025-02-14 18:37:24 +01:00 committed by GitHub
parent 15bd1c3fc5
commit 87b5bb80fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -34,20 +34,23 @@ const setTheme = (dark) => {
const listenForThemeChange = (onChange) => {
const mql = window.matchMedia(PREFER_DARK_QUERY)
mql.onchange = mql => {
const onMqlChange = () => {
const { user, dark } = getTheme()
if (!user) {
handleThemeChange(dark)
onChange({ user, dark })
}
}
window.onstorage = e => {
mql.addEventListener('change', onMqlChange)
const onStorage = (e) => {
if (e.key === STORAGE_KEY) {
const dark = JSON.parse(e.newValue)
setTheme(dark)
onChange({ user: true, dark })
}
}
window.addEventListener('storage', onStorage)
const root = window.document.documentElement
const observer = new window.MutationObserver(() => {
@ -56,7 +59,11 @@ const listenForThemeChange = (onChange) => {
})
observer.observe(root, { attributes: true, attributeFilter: ['data-bs-theme'] })
return () => observer.disconnect()
return () => {
observer.disconnect()
mql.removeEventListener('change', onMqlChange)
window.removeEventListener('storage', onStorage)
}
}
export default function useDarkMode () {
@ -65,7 +72,7 @@ export default function useDarkMode () {
useEffect(() => {
const { user, dark } = getTheme()
setDark({ user, dark })
listenForThemeChange(setDark)
return listenForThemeChange(setDark)
}, [])
return [dark?.dark, () => {