File size: 1,139 Bytes
d0c18f0
 
 
 
 
 
 
 
 
 
 
 
 
 
9ef8a08
 
 
 
 
 
 
 
d0c18f0
 
 
9ef8a08
d0c18f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import { create } from 'zustand';
import { persist } from 'zustand/middleware';

interface UIState {
  sidebarOpen: boolean;
  language: 'zh-CN' | 'en-US';
  theme: 'light' | 'dark';

  toggleSidebar: () => void;
  setSidebarOpen: (open: boolean) => void;
  setLanguage: (lang: 'zh-CN' | 'en-US') => void;
  setTheme: (theme: 'light' | 'dark') => void;
}

// 初始化时检测屏幕宽度,小屏幕下默认关闭侧边栏
const getInitialSidebarState = () => {
  if (typeof window !== 'undefined') {
    return window.innerWidth >= 768; // md breakpoint
  }
  return true;
};

export const useUIStore = create<UIState>()(
  persist(
    (set) => ({
      sidebarOpen: getInitialSidebarState(),
      language: 'zh-CN',
      theme: 'light',

      toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),
      setSidebarOpen: (open) => set({ sidebarOpen: open }),
      setLanguage: (language) => set({ language }),
      setTheme: (theme) => set({ theme }),
    }),
    {
      name: 'ui-storage',
      partialize: (state) => ({
        language: state.language,
        theme: state.theme,
      }),
    }
  )
);