import { createContext, useEffect, useState } from 'react' import { Theme, useSettingsStore } from '@/stores/settings' type ThemeProviderProps = { children: React.ReactNode } type ThemeProviderState = { theme: Theme setTheme: (theme: Theme) => void } const initialState: ThemeProviderState = { theme: 'system', setTheme: () => null } const ThemeProviderContext = createContext(initialState) /** * Component that provides the theme state and setter function to its children. */ export default function ThemeProvider({ children, ...props }: ThemeProviderProps) { const [theme, setTheme] = useState(useSettingsStore.getState().theme) useEffect(() => { const root = window.document.documentElement root.classList.remove('light', 'dark') if (theme === 'system') { const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' root.classList.add(systemTheme) setTheme(systemTheme) return } root.classList.add(theme) }, [theme]) const value = { theme, setTheme: (theme: Theme) => { useSettingsStore.getState().setTheme(theme) setTheme(theme) } } return ( {children} ) } export { ThemeProviderContext }