|
|
import { useState, useEffect } from 'react'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const useDarkMode = () => { |
|
|
const [darkMode, setDarkMode] = useState(() => { |
|
|
|
|
|
const savedPreference = localStorage.getItem('darkMode'); |
|
|
if (savedPreference !== null) { |
|
|
return JSON.parse(savedPreference); |
|
|
} |
|
|
|
|
|
|
|
|
if (typeof window !== 'undefined' && window.matchMedia) { |
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches; |
|
|
} |
|
|
|
|
|
|
|
|
return false; |
|
|
}); |
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
if (typeof window === 'undefined' || !window.matchMedia) return; |
|
|
|
|
|
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); |
|
|
|
|
|
const handleSystemThemeChange = (e) => { |
|
|
|
|
|
const savedPreference = localStorage.getItem('darkMode'); |
|
|
if (savedPreference === null) { |
|
|
setDarkMode(e.matches); |
|
|
} |
|
|
}; |
|
|
|
|
|
mediaQuery.addEventListener('change', handleSystemThemeChange); |
|
|
|
|
|
return () => { |
|
|
mediaQuery.removeEventListener('change', handleSystemThemeChange); |
|
|
}; |
|
|
}, []); |
|
|
|
|
|
|
|
|
const toggleDarkMode = () => { |
|
|
const newDarkMode = !darkMode; |
|
|
setDarkMode(newDarkMode); |
|
|
localStorage.setItem('darkMode', JSON.stringify(newDarkMode)); |
|
|
}; |
|
|
|
|
|
|
|
|
const resetToSystemPreference = () => { |
|
|
if (typeof window !== 'undefined' && window.matchMedia) { |
|
|
const systemPreference = window.matchMedia('(prefers-color-scheme: dark)').matches; |
|
|
setDarkMode(systemPreference); |
|
|
localStorage.removeItem('darkMode'); |
|
|
} |
|
|
}; |
|
|
|
|
|
return { |
|
|
darkMode, |
|
|
toggleDarkMode, |
|
|
resetToSystemPreference |
|
|
}; |
|
|
}; |
|
|
|