mirror of
https://github.com/Snigdha-OS/package-browser.git
synced 2025-09-20 19:45:01 +02:00
🚀 feat: determining the initial theme is encapsulated in a separate function
This commit is contained in:
@@ -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 };
|
||||
}
|
Reference in New Issue
Block a user