Spaces:
Running
Running
| import React, { | |
| createContext, | |
| useContext, | |
| useEffect, | |
| useState, | |
| ReactNode, | |
| } from "react"; | |
| type Theme = "light" | "dark"; | |
| interface ThemeContextType { | |
| theme: Theme; | |
| setTheme: (theme: Theme) => void; | |
| toggleTheme: () => void; | |
| } | |
| const ThemeContext = createContext<ThemeContextType | undefined>(undefined); | |
| export function ThemeProvider({ children }: { children: ReactNode }) { | |
| const [theme, setTheme] = useState<Theme>(() => { | |
| const saved = localStorage.getItem("agentgraph-theme"); | |
| return (saved as Theme) || "light"; | |
| }); | |
| useEffect(() => { | |
| localStorage.setItem("agentgraph-theme", theme); | |
| // Update document class | |
| document.documentElement.classList.remove("light", "dark"); | |
| document.documentElement.classList.add(theme); | |
| }, [theme]); | |
| const toggleTheme = () => { | |
| setTheme((prev) => (prev === "light" ? "dark" : "light")); | |
| }; | |
| return ( | |
| <ThemeContext.Provider value={{ theme, setTheme, toggleTheme }}> | |
| {children} | |
| </ThemeContext.Provider> | |
| ); | |
| } | |
| export function useTheme() { | |
| const context = useContext(ThemeContext); | |
| if (context === undefined) { | |
| throw new Error("useTheme must be used within a ThemeProvider"); | |
| } | |
| return context; | |
| } | |