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