All files / stores / useThemeStore.ts

100.00% Branches 0/0
14.29% Lines 5/35
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
53
54
55
56
57
58
x4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
x4
 
x8
x8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
x4
























































import { create } from "zustand";

type Theme = "light" | "dark" | "system";

interface ThemeState {
  // 主题状态
  theme: Theme;
  isDark: boolean;

  // 动作
  setTheme: (theme: Theme) => void;
  toggleTheme: () => void;
  initializeTheme: () => void;
}

export const useThemeStore = create<ThemeState>((set, get) => ({
  // 初始状态
  theme: "system",
  isDark: false,

  // 动作实现
  setTheme: (theme) => {
    set({ theme });
    get().initializeTheme();
  },

  toggleTheme: () => {
    const currentTheme = get().theme;
    const newTheme = currentTheme === "light" ? "dark" : "light";
    get().setTheme(newTheme);
  },

  initializeTheme: () => {
    const { theme } = get();
    let isDark = false;

    if (theme === "system") {
      // 检查系统主题偏好
      if (typeof globalThis.window !== "undefined") {
        isDark =
          globalThis.window.matchMedia("(prefers-color-scheme: dark)").matches;
      }
    } else {
      isDark = theme === "dark";
    }

    set({ isDark });

    // 更新HTML类名
    if (typeof globalThis.document !== "undefined") {
      if (isDark) {
        globalThis.document.documentElement.classList.add("dark");
      } else {
        globalThis.document.documentElement.classList.remove("dark");
      }
    }
  },
}));