// Custom React hook for dark mode toggle
import { useState, useEffect } from 'react';
export function useDarkMode() {
// Initialize with user's preference or system preference
const [isDarkMode, setIsDarkMode] = useState(() => {
// Check for saved preference in localStorage
const savedMode = localStorage.getItem('darkMode');
if (savedMode !== null) {
return savedMode === 'true';
}
// Default to system preference
return window.matchMedia('(prefers-color-scheme: dark)').matches;
});
// Apply dark mode changes to document
useEffect(() => {
const root = window.document.documentElement;
if (isDarkMode) {
root.classList.add('dark');
} else {
root.classList.remove('dark');
}
// Save preference to localStorage
localStorage.setItem('darkMode', isDarkMode.toString());
}, [isDarkMode]);
// Listen for system preference changes
useEffect(() => {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
const handleChange = (e) => {
// Only update if user hasn't manually set a preference
if (localStorage.getItem('darkMode') === null) {
setIsDarkMode(e.matches);
}
};
mediaQuery.addEventListener('change', handleChange);
return () => mediaQuery.removeEventListener('change', handleChange);
}, []);
return [isDarkMode, setIsDarkMode];
}