MCPcopy Create free account
hub / github.com/codename-co/stack / DarkModeSwitcher

Function DarkModeSwitcher

packages/website/src/components/DarkModeSwitcher.tsx:5–79  ·  view source on GitHub ↗
({
  children,
})

Source from the content-addressed store, hash-verified

3import { iconOf } from "~helpers/icon";
4
5export const DarkModeSwitcher: React.FC<{ children?: any }> = ({
6 children,
7}) => {
8 const [activeTheme, setActiveTheme] = useState<string>("system");
9
10 useEffect(() => {
11 const savedTheme = localStorage.getItem("theme");
12 if (savedTheme === "system" || !savedTheme) {
13 applySystemTheme();
14 setActiveTheme("system");
15 } else {
16 applyTheme(savedTheme);
17 setActiveTheme(savedTheme);
18 }
19
20 const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
21 const handleSystemThemeChange = () => {
22 if (!savedTheme || savedTheme === "system") {
23 applySystemTheme();
24 }
25 };
26
27 mediaQuery.addEventListener("change", handleSystemThemeChange);
28
29 return () => {
30 mediaQuery.removeEventListener("change", handleSystemThemeChange);
31 };
32 }, []);
33
34 const applyTheme = (theme: string) => {
35 if (theme === "dark") {
36 document.documentElement.classList.add("dark");
37 } else if (theme === "light") {
38 document.documentElement.classList.remove("dark");
39 }
40 };
41
42 const handleThemeChange = (newTheme: string) => {
43 setActiveTheme(newTheme);
44 localStorage.setItem("theme", newTheme);
45 if (newTheme === "system") {
46 applySystemTheme();
47 } else {
48 applyTheme(newTheme);
49 }
50 };
51
52 const switchTheme = (e: MouseEvent) => {
53 e.preventDefault();
54
55 if (activeTheme === "light") {
56 handleThemeChange("dark");
57 } else {
58 handleThemeChange("light");
59 }
60 };
61
62 const applySystemTheme = () => {

Callers

nothing calls this directly

Calls 3

applySystemThemeFunction · 0.85
applyThemeFunction · 0.85
switchThemeFunction · 0.85

Tested by

no test coverage detected