feat: extract ThemeWatcher component for system theme detection
This commit is contained in:
@@ -43,6 +43,20 @@ function getNextTheme(current) {
|
|||||||
return systemIsDark ? 'dark' : 'auto';
|
return systemIsDark ? 'dark' : 'auto';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function ThemeWatcher() {
|
||||||
|
useEffect(() => {
|
||||||
|
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
||||||
|
function onSystemChange(e) {
|
||||||
|
if (localStorage.getItem('theme')) return;
|
||||||
|
document.documentElement.classList.toggle('dark', e.matches);
|
||||||
|
}
|
||||||
|
mq.addEventListener('change', onSystemChange);
|
||||||
|
return () => mq.removeEventListener('change', onSystemChange);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
export function useTheme() {
|
export function useTheme() {
|
||||||
const [theme, setTheme] = useState('auto');
|
const [theme, setTheme] = useState('auto');
|
||||||
const [systemIsDark, setSystemIsDark] = useState(false);
|
const [systemIsDark, setSystemIsDark] = useState(false);
|
||||||
@@ -54,8 +68,6 @@ export function useTheme() {
|
|||||||
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
const mq = window.matchMedia('(prefers-color-scheme: dark)');
|
||||||
function onSystemChange(e) {
|
function onSystemChange(e) {
|
||||||
setSystemIsDark(e.matches);
|
setSystemIsDark(e.matches);
|
||||||
if (localStorage.getItem('theme')) return;
|
|
||||||
document.documentElement.classList.toggle('dark', e.matches);
|
|
||||||
}
|
}
|
||||||
mq.addEventListener('change', onSystemChange);
|
mq.addEventListener('change', onSystemChange);
|
||||||
return () => mq.removeEventListener('change', onSystemChange);
|
return () => mq.removeEventListener('change', onSystemChange);
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { ToastProvider, ToastContainer } from '@zen/core/toast';
|
import { ToastProvider, ToastContainer } from '@zen/core/toast';
|
||||||
|
import { ThemeWatcher } from '@zen/core/themes';
|
||||||
|
|
||||||
export function ZenProvider({ children }) {
|
export function ZenProvider({ children }) {
|
||||||
return (
|
return (
|
||||||
<ToastProvider>
|
<ToastProvider>
|
||||||
|
<ThemeWatcher />
|
||||||
{children}
|
{children}
|
||||||
<ToastContainer />
|
<ToastContainer />
|
||||||
</ToastProvider>
|
</ToastProvider>
|
||||||
|
|||||||
Reference in New Issue
Block a user