| import { REFETCH_LOGO_EVENT } from "@/LogoContext"; |
| import { useState, useEffect } from "react"; |
|
|
| const availableThemes = { |
| default: "Default", |
| light: "Light", |
| }; |
|
|
| |
| |
| |
| |
| export function useTheme() { |
| const [theme, _setTheme] = useState(() => { |
| return localStorage.getItem("theme") || "default"; |
| }); |
|
|
| useEffect(() => { |
| if (localStorage.getItem("theme") !== null) return; |
| if (!window.matchMedia) return; |
| if (window.matchMedia("(prefers-color-scheme: light)").matches) |
| return _setTheme("light"); |
| _setTheme("default"); |
| }, []); |
|
|
| useEffect(() => { |
| document.documentElement.setAttribute("data-theme", theme); |
| document.body.classList.toggle("light", theme === "light"); |
| localStorage.setItem("theme", theme); |
| window.dispatchEvent(new Event(REFETCH_LOGO_EVENT)); |
| }, [theme]); |
|
|
| |
| useEffect(() => { |
| if (!import.meta.env.DEV) return; |
| function toggleOnKeybind(e) { |
| if (e.metaKey && e.key === ".") { |
| e.preventDefault(); |
| setTheme((prev) => (prev === "light" ? "default" : "light")); |
| } |
| } |
| document.addEventListener("keydown", toggleOnKeybind); |
| return () => document.removeEventListener("keydown", toggleOnKeybind); |
| }, []); |
|
|
| |
| |
| |
| |
| |
| function setTheme(newTheme) { |
| _setTheme(newTheme); |
| } |
|
|
| return { theme, setTheme, availableThemes }; |
| } |
|
|