Spaces:
Running
Running
import { useState, useEffect } from "react"; | |
export const useThemeMode = () => { | |
// Function to detect system preference for dark mode | |
const getSystemPreference = () => { | |
return window.matchMedia && | |
window.matchMedia("(prefers-color-scheme: dark)").matches | |
? "dark" | |
: "light"; | |
}; | |
// Initialize state with system preference | |
const [mode, setMode] = useState(getSystemPreference()); | |
// Listen for changes in system preference | |
useEffect(() => { | |
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); | |
const handleChange = (e) => { | |
setMode(e.matches ? "dark" : "light"); | |
}; | |
// Add event listener | |
if (mediaQuery.addEventListener) { | |
mediaQuery.addEventListener("change", handleChange); | |
} else { | |
// For older browsers | |
mediaQuery.addListener(handleChange); | |
} | |
// Cleanup | |
return () => { | |
if (mediaQuery.removeEventListener) { | |
mediaQuery.removeEventListener("change", handleChange); | |
} else { | |
// For older browsers | |
mediaQuery.removeListener(handleChange); | |
} | |
}; | |
}, []); | |
// Toggle function is kept for compatibility with existing code | |
// but it will only temporarily change the theme until the next system preference change | |
const toggleTheme = () => { | |
setMode((prevMode) => (prevMode === "light" ? "dark" : "light")); | |
}; | |
return { | |
mode, | |
toggleTheme, | |
isSystemPreference: true, | |
}; | |
}; | |