forked from nixcn/nixcn-cms
- Added Nix theme - Defaults to dark mode Signed-off-by: Noa Virellia <noa@requiem.garden>
54 lines
1.2 KiB
TypeScript
54 lines
1.2 KiB
TypeScript
import type { Theme } from '@/hooks/useTheme';
|
|
import { useEffect, useState } from 'react';
|
|
import { ThemeProviderContext } from '@/hooks/useTheme';
|
|
|
|
interface ThemeProviderProps {
|
|
children: React.ReactNode;
|
|
defaultTheme?: Theme;
|
|
storageKey?: string;
|
|
}
|
|
|
|
export function ThemeProvider({
|
|
children,
|
|
defaultTheme = 'dark',
|
|
storageKey = 'vite-ui-theme',
|
|
...props
|
|
}: ThemeProviderProps) {
|
|
const [theme, setTheme] = useState<Theme>(
|
|
() => (localStorage.getItem(storageKey) as Theme) || defaultTheme,
|
|
);
|
|
|
|
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);
|
|
return;
|
|
}
|
|
|
|
root.classList.add(theme);
|
|
}, [theme]);
|
|
|
|
// eslint-disable-next-line react/no-unstable-context-value
|
|
const value = {
|
|
theme,
|
|
setTheme: (theme: Theme) => {
|
|
localStorage.setItem(storageKey, theme);
|
|
setTheme(theme);
|
|
},
|
|
};
|
|
|
|
return (
|
|
<ThemeProviderContext {...props} value={value}>
|
|
{children}
|
|
</ThemeProviderContext>
|
|
);
|
|
}
|