UI updates

This commit is contained in:
Harivansh Rathi 2024-12-08 15:53:58 -05:00
parent 171fe6e04f
commit 7dda2e20d0
7 changed files with 195 additions and 122 deletions

View file

@ -0,0 +1,72 @@
import React, { createContext, useContext, useEffect, useState } from 'react';
interface ThemeContextType {
isDarkMode: boolean;
toggleDarkMode: () => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
function setThemeClass(isDark: boolean) {
if (isDark) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
}
export function ThemeProvider({ children }: { children: React.ReactNode }) {
const [isDarkMode, setIsDarkMode] = useState(() => {
if (typeof window === 'undefined') return false;
// Check localStorage first
const stored = localStorage.getItem('darkMode');
if (stored !== null) {
const isDark = stored === 'true';
setThemeClass(isDark);
return isDark;
}
// Then check system preference
const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
setThemeClass(systemPrefersDark);
return systemPrefersDark;
});
// Update theme when isDarkMode changes
useEffect(() => {
setThemeClass(isDarkMode);
localStorage.setItem('darkMode', String(isDarkMode));
}, [isDarkMode]);
// Listen for system theme changes
useEffect(() => {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const handleChange = (e: MediaQueryListEvent) => {
if (localStorage.getItem('darkMode') === null) {
setIsDarkMode(e.matches);
}
};
mediaQuery.addEventListener('change', handleChange);
return () => mediaQuery.removeEventListener('change', handleChange);
}, []);
const toggleDarkMode = () => {
setIsDarkMode(prev => !prev);
};
return (
<ThemeContext.Provider value={{ isDarkMode, toggleDarkMode }}>
{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;
}