🚀 feat: determining the initial theme is encapsulated in a separate function

This commit is contained in:
RiO
2025-01-11 14:19:40 +05:30
parent 960ca1e00d
commit 1a99fb8265

View File

@@ -3,11 +3,13 @@ import { useState, useEffect } from 'react';
type Theme = 'light' | 'dark';
export function useTheme() {
const [theme, setTheme] = useState<Theme>(() => {
const savedTheme = localStorage.getItem('theme');
const getInitialTheme = (): Theme => {
const savedTheme = localStorage.getItem('theme') as Theme;
if (savedTheme === 'dark' || savedTheme === 'light') return savedTheme;
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
});
};
const [theme, setTheme] = useState<Theme>(getInitialTheme);
useEffect(() => {
const root = window.document.documentElement;
@@ -17,8 +19,22 @@ export function useTheme() {
}, [theme]);
const toggleTheme = () => {
setTheme(prev => prev === 'light' ? 'dark' : 'light');
setTheme(prevTheme => (prevTheme === 'light' ? 'dark' : 'light'));
};
useEffect(() => {
const handleMediaChange = (event: MediaQueryListEvent) => {
setTheme(event.matches ? 'dark' : 'light');
};
const mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)');
mediaQueryList.addEventListener('change', handleMediaChange);
// Cleanup listener on unmount
return () => {
mediaQueryList.removeEventListener('change', handleMediaChange);
};
}, []);
return { theme, toggleTheme };
}