From f45e1853ad418ecaa3bcf94621736c441c7f17d2 Mon Sep 17 00:00:00 2001 From: Frontend Developer Date: Tue, 10 Mar 2026 09:00:46 +0000 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86store=20(?= =?UTF-8?q?Zustand)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/renderer/stores/fileStore.js | 60 +++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 frontend/src/renderer/stores/fileStore.js diff --git a/frontend/src/renderer/stores/fileStore.js b/frontend/src/renderer/stores/fileStore.js new file mode 100644 index 0000000..9c02506 --- /dev/null +++ b/frontend/src/renderer/stores/fileStore.js @@ -0,0 +1,60 @@ +import { create } from 'zustand'; + +const useFileStore = create((set, get) => ({ + // State + files: [], + currentPath: [], + currentFolderId: null, + selectedFiles: [], + loading: false, + error: null, + + // Actions + setFiles: (files) => set({ files }), + + setCurrentFolder: (folderId, folderName) => { + const { currentPath } = get(); + if (folderId === null) { + set({ currentFolderId: null, currentPath: [] }); + } else { + set({ + currentFolderId: folderId, + currentPath: [...currentPath, { id: folderId, name: folderName }] + }); + } + }, + + goBack: () => { + const { currentPath } = get(); + if (currentPath.length <= 1) { + set({ currentFolderId: null, currentPath: [] }); + } else { + const newPath = currentPath.slice(0, -1); + set({ + currentFolderId: newPath[newPath.length - 1]?.id || null, + currentPath: newPath + }); + } + }, + + toggleSelectFile: (fileId) => { + const { selectedFiles } = get(); + if (selectedFiles.includes(fileId)) { + set({ selectedFiles: selectedFiles.filter(id => id !== fileId) }); + } else { + set({ selectedFiles: [...selectedFiles, fileId] }); + } + }, + + clearSelection: () => set({ selectedFiles: [] }), + + selectAll: () => { + const { files } = get(); + set({ selectedFiles: files.map(f => f.id) }); + }, + + setLoading: (loading) => set({ loading }), + setError: (error) => set({ error }), +})); + +export default useFileStore;