From 24950e1a12c5153bc456b6d31ad7df7aff778311 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Tue, 9 Dec 2025 02:03:46 +0100 Subject: [PATCH] simplify frontend document and folder memoization. --- .../documents/data/useDocumentsWorkspace.ts | 15 +- .../selection/SelectionFolderMenu.tsx | 15 +- .../documents/logic/useDocumentsPanelProps.ts | 153 ++++++------------ .../src/viewer/logic/useDetailWorkspace.ts | 62 +++---- 4 files changed, 81 insertions(+), 164 deletions(-) diff --git a/frontend/src/documents/data/useDocumentsWorkspace.ts b/frontend/src/documents/data/useDocumentsWorkspace.ts index fb76c3b..a5156d7 100644 --- a/frontend/src/documents/data/useDocumentsWorkspace.ts +++ b/frontend/src/documents/data/useDocumentsWorkspace.ts @@ -458,15 +458,12 @@ const useDocumentsWorkspace = ({ tenantIdRef.current = currentTenantId; }, [currentTenantId, tenantIdRef]); - const tagLookupById = useMemo(() => { - const map = new Map(); - tags.forEach((tag) => { - if (tag?.id) { - map.set(tag.id, tag); - } - }); - return map; - }, [tags]); + const tagLookupById = new Map(); + tags.forEach((tag) => { + if (tag?.id) { + tagLookupById.set(tag.id, tag); + } + }); const tagsState = { ...tagsStateRaw, diff --git a/frontend/src/documents/features/selection/SelectionFolderMenu.tsx b/frontend/src/documents/features/selection/SelectionFolderMenu.tsx index 55c6659..0f6f2fc 100644 --- a/frontend/src/documents/features/selection/SelectionFolderMenu.tsx +++ b/frontend/src/documents/features/selection/SelectionFolderMenu.tsx @@ -106,17 +106,8 @@ const SelectionFolderMenu: React.FC = ({ return { nodeMap: nMap, parentMap: pMap }; }, [folderTree]); - const currentChildren = useMemo(() => { - const currentFolder = currentFolderId ? nodeMap.get(currentFolderId) : null; - return currentFolder ? currentFolder.children || [] : folderTree; - }, [currentFolderId, nodeMap, folderTree]); - const currentFolder = currentFolderId ? nodeMap.get(currentFolderId) : null; - // Filter items based on search query - // If searching, we might want to show flattened results matching the query? - // Or just filter current level? - // Usually, search implies searching the whole tree. const isSearching = query.trim().length > 0; const displayedItems = useMemo(() => { @@ -130,8 +121,10 @@ const SelectionFolderMenu: React.FC = ({ }); return results; } - return currentChildren; - }, [isSearching, query, currentChildren, nodeMap]); + return currentFolderId + ? (nodeMap.get(currentFolderId)?.children || []) + : folderTree; + }, [isSearching, query, currentFolderId, nodeMap, folderTree]); const handleTriggerClick = useCallback(() => { if (disabled) { diff --git a/frontend/src/documents/logic/useDocumentsPanelProps.ts b/frontend/src/documents/logic/useDocumentsPanelProps.ts index 6694555..eed4cf4 100644 --- a/frontend/src/documents/logic/useDocumentsPanelProps.ts +++ b/frontend/src/documents/logic/useDocumentsPanelProps.ts @@ -1,4 +1,3 @@ -import { useMemo } from 'react'; import type { WorkspaceSelectionValue } from '../../app/WorkspaceSelectionContext'; import type { Identifier } from '../../types/identifiers'; @@ -115,107 +114,57 @@ const useDocumentsPanelProps = (props: UseDocumentsPanelPropsArgs) => { selectionValue, } = props; - return useMemo( - () => ({ - currentFolderName, - breadcrumbs, - onRefresh: refreshCurrentFolder, - subfolders: currentSubfolders, - documents, - searchQuery, - searchResultIds, - selectedFolder, - onFolderSelect: selectFolder, - onFolderDrop: folderClickHandlers.onDrop, - onFolderDragOver: folderClickHandlers.onDragOver, - onFolderDragLeave: folderClickHandlers.onDragLeave, - onFolderDragStart: handleFolderDragStart, - onFolderDragEnd: handleFolderDragEnd, - draggedFolderId, - onFolderRename: handleFolderRename, - onDocumentRename: handleDocumentTitleUpdate, - focusedRowKey, - draggingDocumentIds: draggedDocumentIds, - onDocumentDragStart: handleDocumentDragStart, - onDocumentDragEnd: handleDocumentDragEnd, - isSearchLoading: searchLoading, - tagLookupById, - activeTagFilters, - activeCorrespondentFilters, - activeCorrespondentIds: activeCorrespondentFilters, - ensureAssetUrl, - getDocumentAsset, - onDocumentTagAttach: handleDocumentTagAttach, - onDocumentTagDetach: handleDocumentTagDetach, - viewMode: documentsViewMode, - sortField: documentsSortField, - sortDirection: documentsSortDirection, - onSortFieldChange: handleDocumentsSortFieldChange, - onSortDirectionToggle: handleDocumentsSortDirectionToggle, - onViewModeChange: handleDocumentsViewModeChange, - onDeleteSelection: handleDeleteSelection, - onEntryPointer: handleEntryPointerCore, - tags, - correspondents, - documentLookup, - onBulkTagAdd: handleBulkTagAddFromDetail, - onBulkTagRemove: handleBulkTagRemoveFromDetail, - onBulkCorrespondentAdd: handleBulkCorrespondentAdd, - onBulkCorrespondentRemove: handleBulkCorrespondentRemove, - onBulkReanalyze: handleBulkSelectionReanalyze, - folderOptions, - onMoveDocumentsToFolder: moveDocumentsToFolder, - selectionValue, - }), - [ - activeCorrespondentFilters, - breadcrumbs, - correspondents, - currentFolderName, - currentSubfolders, - documents, - documentsSortDirection, - documentsSortField, - documentsViewMode, - searchQuery, - documentLookup, - draggedDocumentIds, - draggedFolderId, - focusedRowKey, - folderClickHandlers, - handleBulkCorrespondentAdd, - handleBulkCorrespondentRemove, - handleBulkSelectionReanalyze, - handleBulkTagAddFromDetail, - handleBulkTagRemoveFromDetail, - handleDeleteSelection, - handleDocumentDragEnd, - handleDocumentDragStart, - handleDocumentTagAttach, - handleDocumentTagDetach, - handleDocumentTitleUpdate, - handleDocumentsSortDirectionToggle, - handleDocumentsSortFieldChange, - handleDocumentsViewModeChange, - handleEntryPointerCore, - handleFolderDragEnd, - handleFolderDragStart, - handleFolderRename, - moveDocumentsToFolder, - refreshCurrentFolder, - searchLoading, - searchResultIds, - selectedFolder, - selectFolder, - tagLookupById, - activeTagFilters, - tags, - ensureAssetUrl, - getDocumentAsset, - folderOptions, - selectionValue, - ], - ); + return { + currentFolderName, + breadcrumbs, + onRefresh: refreshCurrentFolder, + subfolders: currentSubfolders, + documents, + searchQuery, + searchResultIds, + selectedFolder, + onFolderSelect: selectFolder, + onFolderDrop: folderClickHandlers.onDrop, + onFolderDragOver: folderClickHandlers.onDragOver, + onFolderDragLeave: folderClickHandlers.onDragLeave, + onFolderDragStart: handleFolderDragStart, + onFolderDragEnd: handleFolderDragEnd, + draggedFolderId, + onFolderRename: handleFolderRename, + onDocumentRename: handleDocumentTitleUpdate, + focusedRowKey, + draggingDocumentIds: draggedDocumentIds, + onDocumentDragStart: handleDocumentDragStart, + onDocumentDragEnd: handleDocumentDragEnd, + isSearchLoading: searchLoading, + tagLookupById, + activeTagFilters, + activeCorrespondentFilters, + activeCorrespondentIds: activeCorrespondentFilters, + ensureAssetUrl, + getDocumentAsset, + onDocumentTagAttach: handleDocumentTagAttach, + onDocumentTagDetach: handleDocumentTagDetach, + viewMode: documentsViewMode, + sortField: documentsSortField, + sortDirection: documentsSortDirection, + onSortFieldChange: handleDocumentsSortFieldChange, + onSortDirectionToggle: handleDocumentsSortDirectionToggle, + onViewModeChange: handleDocumentsViewModeChange, + onDeleteSelection: handleDeleteSelection, + onEntryPointer: handleEntryPointerCore, + tags, + correspondents, + documentLookup, + onBulkTagAdd: handleBulkTagAddFromDetail, + onBulkTagRemove: handleBulkTagRemoveFromDetail, + onBulkCorrespondentAdd: handleBulkCorrespondentAdd, + onBulkCorrespondentRemove: handleBulkCorrespondentRemove, + onBulkReanalyze: handleBulkSelectionReanalyze, + folderOptions, + onMoveDocumentsToFolder: moveDocumentsToFolder, + selectionValue, + }; }; export default useDocumentsPanelProps; diff --git a/frontend/src/viewer/logic/useDetailWorkspace.ts b/frontend/src/viewer/logic/useDetailWorkspace.ts index b7544b8..8a6bd98 100644 --- a/frontend/src/viewer/logic/useDetailWorkspace.ts +++ b/frontend/src/viewer/logic/useDetailWorkspace.ts @@ -178,48 +178,26 @@ const useDetailWorkspace = ({ closeDetailPanel(); }, [closeDetailPanel]); - const detailPanelProps = useMemo( - () => ({ - document: detailPanelDocument, - tags, - tagLookupById, - onTagAdd: handleDocumentTagAdd, - onTagRemove: handleDocumentTagDetach, - onOpenPreview: openDocumentPreview, - activePreviewId, - onUpdateTitle: handleDocumentTitleUpdate, - onUpdateIssued: handleDocumentIssuedUpdate, - ensureAssetUrl, - getDocumentAsset: getAsset, - correspondents, - onCorrespondentAdd: handleCorrespondentAdd, - onCorrespondentRemove: handleCorrespondentRemove, - onFolderNavigate: selectFolder, - onClose: handleDetailPanelClose, - resolveFolderPath, - folderNodes, - }), - [ - activePreviewId, - correspondents, - detailPanelDocument, - ensureAssetUrl, - getAsset, - handleCorrespondentAdd, - handleCorrespondentRemove, - handleDetailPanelClose, - handleDocumentTagAdd, - handleDocumentIssuedUpdate, - handleDocumentTitleUpdate, - handleDocumentTagDetach, - folderNodes, - openDocumentPreview, - resolveFolderPath, - selectFolder, - tags, - tagLookupById, - ], - ); + const detailPanelProps = { + document: detailPanelDocument, + tags, + tagLookupById, + onTagAdd: handleDocumentTagAdd, + onTagRemove: handleDocumentTagDetach, + onOpenPreview: openDocumentPreview, + activePreviewId, + onUpdateTitle: handleDocumentTitleUpdate, + onUpdateIssued: handleDocumentIssuedUpdate, + ensureAssetUrl, + getDocumentAsset: getAsset, + correspondents, + onCorrespondentAdd: handleCorrespondentAdd, + onCorrespondentRemove: handleCorrespondentRemove, + onFolderNavigate: selectFolder, + onClose: handleDetailPanelClose, + resolveFolderPath, + folderNodes, + }; return { detailPanelProps,