| 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, | |
| }), | |
| } | |
| ) | |
| ); |