import React, { createContext, useContext, useEffect, useState } from 'react'; type Theme = 'light' | 'dark' | 'system'; interface ThemeContextType { theme: Theme; setTheme: (theme: Theme) => void; isDark: boolean; } const ThemeContext = createContext(undefined); export const useTheme = () => { const context = useContext(ThemeContext); if (context === undefined) { throw new Error('useTheme must be used within a ThemeProvider'); } return context; }; interface ThemeProviderProps { children: React.ReactNode; } export const ThemeProvider: React.FC = ({ children }) => { const [theme, setTheme] = useState(() => { const saved = localStorage.getItem('theme'); return (saved as Theme) || 'system'; }); const [isDark, setIsDark] = useState(false); useEffect(() => { const updateTheme = () => { const isDarkMode = theme === 'dark' || (theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches); setIsDark(isDarkMode); if (isDarkMode) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } }; updateTheme(); // 시스템 테마 변경 감지 const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); const handleChange = () => { if (theme === 'system') { updateTheme(); } }; mediaQuery.addEventListener('change', handleChange); return () => mediaQuery.removeEventListener('change', handleChange); }, [theme]); const handleSetTheme = (newTheme: Theme) => { setTheme(newTheme); localStorage.setItem('theme', newTheme); }; return ( {children} ); };