From d281364aef83dad6d872e0846670016ade42520b Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Fri, 12 Dec 2025 00:51:26 +0100 Subject: [PATCH] feat: refactor document filtering logic to `useWorkspaceViewData`. --- .../documents/data/useDocumentsWorkspace.ts | 19 ++---------------- .../documents/data/useWorkspaceViewData.ts | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/frontend/src/documents/data/useDocumentsWorkspace.ts b/frontend/src/documents/data/useDocumentsWorkspace.ts index e83f4e0..1724dc6 100644 --- a/frontend/src/documents/data/useDocumentsWorkspace.ts +++ b/frontend/src/documents/data/useDocumentsWorkspace.ts @@ -402,33 +402,18 @@ const useDocumentsWorkspace = ({ documentsManager, }); - const showingSearchResults = documentsSearch.searchResultIds !== null; - // Live Filter: Ensure we only show documents that actually belong to the current folder. - // Since 'documents' is reactive, if a document is moved, its folder_id updates immediately. - // We must filter out any documents that no longer match the selectedFolder. - const liveFilteredDocuments = useMemo(() => { - if (showingSearchResults) { - return documents; - } - const targetFolder = selectedFolder || 'root'; - return documents.filter((doc) => { - if (!doc) return false; - const docFolder = doc.folder_id || 'root'; - return docFolder === targetFolder; - }); - }, [documents, showingSearchResults, selectedFolder]); - const { viewDocuments, visibleEntryKeySet, } = useWorkspaceViewData({ - documents: liveFilteredDocuments, + documents, documentLookup, searchResultIds: documentsSearch.searchResultIds, showingSearchResults, currentSubfolders: visibleSubfolders, + selectedFolder: selectedFolder, }); const { diff --git a/frontend/src/documents/data/useWorkspaceViewData.ts b/frontend/src/documents/data/useWorkspaceViewData.ts index 2af721c..35efac5 100644 --- a/frontend/src/documents/data/useWorkspaceViewData.ts +++ b/frontend/src/documents/data/useWorkspaceViewData.ts @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from 'react'; -import type { DocumentId } from '../../types/identifiers'; +import type { DocumentId, FolderId } from '../../types/identifiers'; import type { Document } from '../../types/documents'; import { createDocumentEntryKey, createFolderEntryKey } from '../../app/entryKey'; @@ -9,6 +9,7 @@ interface UseWorkspaceViewDataArgs { searchResultIds: DocumentId[] | null; showingSearchResults: boolean; currentSubfolders: any[]; + selectedFolder: FolderId; } const useWorkspaceViewData = ({ @@ -17,9 +18,22 @@ const useWorkspaceViewData = ({ searchResultIds, showingSearchResults, currentSubfolders, + selectedFolder, }: UseWorkspaceViewDataArgs) => { const [visibleDocumentIds, setVisibleDocumentIds] = useState([]); + const filteredDocuments = useMemo(() => { + if (showingSearchResults) { + return documents; + } + const targetFolder = selectedFolder || 'root'; + return documents.filter((doc) => { + if (!doc) return false; + const docFolder = doc.folder_id || 'root'; + return docFolder === targetFolder; + }); + }, [documents, showingSearchResults, selectedFolder]); + useEffect(() => { const arraysEqual = (a: DocumentId[], b: DocumentId[]) => a.length === b.length && a.every((value, index) => value === b[index]); @@ -30,11 +44,11 @@ const useWorkspaceViewData = ({ return; } - const folderIds = documents + const folderIds = filteredDocuments .map((doc) => (doc?.id ?? null) as DocumentId | null) .filter((id): id is DocumentId => id != null); setVisibleDocumentIds((prev) => (arraysEqual(prev, folderIds) ? prev : folderIds)); - }, [showingSearchResults, searchResultIds, documents]); + }, [showingSearchResults, searchResultIds, filteredDocuments]); const viewDocuments = useMemo( () =>