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';
|
type Theme = 'light' | 'dark';
|
||||||
|
|
||||||
export function useTheme() {
|
export function useTheme() {
|
||||||
const [theme, setTheme] = useState<Theme>(() => {
|
const getInitialTheme = (): Theme => {
|
||||||
const savedTheme = localStorage.getItem('theme');
|
const savedTheme = localStorage.getItem('theme') as Theme;
|
||||||
if (savedTheme === 'dark' || savedTheme === 'light') return savedTheme;
|
if (savedTheme === 'dark' || savedTheme === 'light') return savedTheme;
|
||||||
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
||||||
});
|
};
|
||||||
|
|
||||||
|
const [theme, setTheme] = useState<Theme>(getInitialTheme);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const root = window.document.documentElement;
|
const root = window.document.documentElement;
|
||||||
@@ -17,8 +19,22 @@ export function useTheme() {
|
|||||||
}, [theme]);
|
}, [theme]);
|
||||||
|
|
||||||
const toggleTheme = () => {
|
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 };
|
return { theme, toggleTheme };
|
||||||
}
|
}
|
Reference in New Issue
Block a user