Fix missing cleanup of dark mode listeners (#1906)
This commit is contained in:
		
							parent
							
								
									15bd1c3fc5
								
							
						
					
					
						commit
						87b5bb80fd
					
				@ -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, () => {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user