All files / hooks / useTheme.ts

100.00% Branches 0/0
5.13% Lines 2/39
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
x2
x2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


















































import { useEffect } from "preact/hooks";
import { useThemeStore } from "@stores/useThemeStore.ts";

/**
 * 主题Hook - 结合Zustand状态管理
 * @returns 主题相关状态和方法
 */
export function useTheme() {
  const {
    theme,
    isDark,
    setTheme,
    toggleTheme,
    initializeTheme,
  } = useThemeStore();

  // 初始化主题
  useEffect(() => {
    initializeTheme();

    // 监听系统主题变化
    if (typeof globalThis.matchMedia !== "undefined" && theme === "system") {
      const mediaQuery = globalThis.matchMedia("(prefers-color-scheme: dark)");

      const handleChange = () => {
        if (theme === "system") {
          initializeTheme();
        }
      };

      if (mediaQuery.addEventListener) {
        mediaQuery.addEventListener("change", handleChange);
        return () => mediaQuery.removeEventListener("change", handleChange);
      } else {
        // 兼容旧版本浏览器
        mediaQuery.addListener(handleChange);
        return () => mediaQuery.removeListener(handleChange);
      }
    }
  }, [theme, initializeTheme]);

  return {
    theme,
    isDark,
    isLight: !isDark,
    setTheme,
    toggleTheme,
    setLightTheme: () => setTheme("light"),
    setDarkTheme: () => setTheme("dark"),
    setSystemTheme: () => setTheme("system"),
  };
}