import { create } from 'zustand'; import { persist } from 'zustand/middleware'; /** * UI 状态接口 */ interface UIState { // 侧边栏状态 sidebarOpen: boolean; // 主题 theme: 'light' | 'dark' | 'system'; // 加载状态 loading: boolean; loadingMessage: string; // Actions toggleSidebar: () => void; setSidebarOpen: (open: boolean) => void; setTheme: (theme: 'light' | 'dark' | 'system') => void; setLoading: (loading: boolean, message?: string) => void; } /** * UI 状态 Store * 使用 localStorage 持久化部分状态 */ export const useUIStore = create()( persist( (set) => ({ sidebarOpen: true, theme: 'light', loading: false, loadingMessage: '', toggleSidebar: () => { set((state) => ({ sidebarOpen: !state.sidebarOpen })); }, setSidebarOpen: (open) => { set({ sidebarOpen: open }); }, setTheme: (theme) => { // 更新 DOM 元素的主题类 if (typeof window !== 'undefined') { const root = window.document.documentElement; root.classList.remove('light', 'dark'); if (theme === 'system') { const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; root.classList.add(systemTheme); } else { root.classList.add(theme); } } set({ theme }); }, setLoading: (loading, message = '') => { set({ loading, loadingMessage: message }); }, }), { name: 'ui-storage', partialize: (state) => ({ sidebarOpen: state.sidebarOpen, theme: state.theme, }), } ) );