import { create } from 'zustand' import type { FileNode } from '../types/file' import { settingsRepository } from '../db/settingsRepository' interface SidebarState { isVisible: boolean rootPath: string | null tree: FileNode[] expandedDirs: Set sidebarWidth: number _loaded: boolean setVisible: (visible: boolean) => void setRootPath: (path: string | null) => void setTree: (tree: FileNode[]) => void toggleDir: (path: string) => void expandDirs: (paths: string[]) => void setSidebarWidth: (width: number) => void loadFromDB: () => Promise } export const useSidebarStore = create((set, get) => ({ isVisible: true, rootPath: null, tree: [], expandedDirs: new Set(), sidebarWidth: 240, _loaded: false, // 从 IndexedDB 加载 sidebar 设置 loadFromDB: async () => { if (get()._loaded) return try { const settings = await settingsRepository.load() set({ isVisible: !settings.sidebarCollapsed, sidebarWidth: settings.sidebarWidth, _loaded: true }) } catch { set({ _loaded: true }) } }, setVisible: (visible) => { set({ isVisible: visible }) // 异步保存到 DB settingsRepository.save({ sidebarCollapsed: !visible }) }, setRootPath: (path) => set({ rootPath: path }), setTree: (tree) => set({ tree }), toggleDir: (path) => set(state => { const newSet = new Set(state.expandedDirs) if (newSet.has(path)) { newSet.delete(path) } else { newSet.add(path) } return { expandedDirs: newSet } }), expandDirs: (paths) => set(state => { const newSet = new Set(state.expandedDirs) let changed = false for (const p of paths) { if (!newSet.has(p)) { newSet.add(p) changed = true } } return changed ? { expandedDirs: newSet } : state }), setSidebarWidth: (width) => { set({ sidebarWidth: width }) // 异步保存到 DB settingsRepository.save({ sidebarWidth: width }) } }))