diff --git a/frontend/src/contexts/ThemeContext.tsx b/frontend/src/contexts/ThemeContext.tsx index 3f4c46f..d3467cb 100644 --- a/frontend/src/contexts/ThemeContext.tsx +++ b/frontend/src/contexts/ThemeContext.tsx @@ -1,59 +1,40 @@ -import React, { useEffect, useState, type ReactNode } from 'react'; +import React, { createContext, useContext, useEffect, useState } from 'react'; -import { darkTheme, dimTheme, lightTheme, type ThemeMode } from '../types/theme'; -import { ThemeContext } from './theme-context'; - -const STORAGE_KEY = 'app-theme-mode'; - -function getInitialMode(): ThemeMode { - try { - const stored = localStorage.getItem(STORAGE_KEY); - if (stored === 'dark' || stored === 'dim' || stored === 'light') return stored; - } catch { - // ignore - } - return 'dark'; +type Theme = 'light' | 'dark'; +interface ThemeContextValue { + theme: Theme; + toggleTheme: () => void; } -const THEME_MAP = { dark: darkTheme, dim: dimTheme, light: lightTheme }; -const BG_MAP: Record = { - dark: '#0a0a12', - dim: '#1e1b2e', - light: '#ffffff', -}; +const ThemeContext = createContext({ + theme: 'light', + toggleTheme: () => {}, +}); -interface ThemeProviderProps { - children: ReactNode; -} - -export const ThemeProvider: React.FC = ({ children }) => { - const [themeMode, setThemeMode] = useState(getInitialMode); - const theme = THEME_MAP[themeMode]; - const isDark = themeMode === 'dark'; - - const toggleTheme = () => { - setThemeMode((prev) => - prev === 'dark' ? 'dim' : prev === 'dim' ? 'light' : 'dark' - ); - }; +export function ThemeProvider({ children }: { children: React.ReactNode }) { + const [theme, setTheme] = useState(() => { + const saved = localStorage.getItem('theme'); + return (saved === 'dark' || saved === 'light') ? saved : 'light'; + }); useEffect(() => { - const root = document.documentElement; - root.classList.remove('dark', 'dim'); - if (themeMode !== 'light') root.classList.add(themeMode); - - document.body.style.background = BG_MAP[themeMode]; - - try { - localStorage.setItem(STORAGE_KEY, themeMode); - } catch { - // ignore + if (theme === 'dark') { + document.documentElement.setAttribute('data-theme', 'dark'); + } else { + document.documentElement.removeAttribute('data-theme'); } - }, [themeMode]); + localStorage.setItem('theme', theme); + }, [theme]); + + const toggleTheme = () => setTheme(t => t === 'light' ? 'dark' : 'light'); return ( - + {children} ); -}; +} + +export function useTheme() { + return useContext(ThemeContext); +} diff --git a/frontend/src/contexts/index.ts b/frontend/src/contexts/index.ts index 95bda22..d18ca7e 100644 --- a/frontend/src/contexts/index.ts +++ b/frontend/src/contexts/index.ts @@ -1,2 +1 @@ -export { ThemeProvider } from './ThemeContext'; -export { useTheme } from './useTheme'; +export { ThemeProvider, useTheme } from './ThemeContext'; diff --git a/frontend/src/contexts/theme-context.ts b/frontend/src/contexts/theme-context.ts deleted file mode 100644 index 47a89e2..0000000 --- a/frontend/src/contexts/theme-context.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { createContext } from 'react'; - -import type { ThemeColors, ThemeMode } from '../types/theme'; - -export interface ThemeContextValue { - isDark: boolean; - themeMode: ThemeMode; - theme: ThemeColors; - toggleTheme: () => void; -} - -export const ThemeContext = createContext(undefined); diff --git a/frontend/src/contexts/useTheme.ts b/frontend/src/contexts/useTheme.ts deleted file mode 100644 index 8ac7f83..0000000 --- a/frontend/src/contexts/useTheme.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useContext } from 'react'; - -import { ThemeContext, type ThemeContextValue } from './theme-context'; - -export function useTheme(): ThemeContextValue { - const context = useContext(ThemeContext); - if (!context) { - throw new Error('useTheme must be used within a ThemeProvider'); - } - return context; -}