diff --git a/src/hooks/useTheme.ts b/src/hooks/useTheme.ts index 154c1d9..80f11dc 100644 --- a/src/hooks/useTheme.ts +++ b/src/hooks/useTheme.ts @@ -3,11 +3,13 @@ import { useState, useEffect } from 'react'; type Theme = 'light' | 'dark'; export function useTheme() { - const [theme, setTheme] = useState(() => { - const savedTheme = localStorage.getItem('theme'); + const getInitialTheme = (): Theme => { + const savedTheme = localStorage.getItem('theme') as Theme; if (savedTheme === 'dark' || savedTheme === 'light') return savedTheme; return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; - }); + }; + + const [theme, setTheme] = useState(getInitialTheme); useEffect(() => { const root = window.document.documentElement; @@ -17,8 +19,22 @@ export function useTheme() { }, [theme]); const toggleTheme = () => { - setTheme(prev => prev === 'light' ? 'dark' : 'light'); + setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light')); }; + useEffect(() => { + const handleMediaChange = (event: MediaQueryListEvent) => { + setTheme(event.matches ? 'dark' : 'light'); + }; + + const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)'); + mediaQueryList.addEventListener('change', handleMediaChange); + + // Cleanup listener on unmount + return () => { + mediaQueryList.removeEventListener('change', handleMediaChange); + }; + }, []); + return { theme, toggleTheme }; } \ No newline at end of file