From f14cf5562e194446d1217faac281fd92f4610c8e Mon Sep 17 00:00:00 2001 From: MaheshtheDev <38828053+MaheshtheDev@users.noreply.github.com> Date: Tue, 5 May 2026 22:35:35 +0000 Subject: [PATCH] fix: multi-select propagation bug and redesign selection toolbar (#901) --- apps/web/components/memories-grid.tsx | 192 ++++++++++++++++---------- apps/web/stores/index.ts | 3 +- 2 files changed, 123 insertions(+), 72 deletions(-) diff --git a/apps/web/components/memories-grid.tsx b/apps/web/components/memories-grid.tsx index 0c8a2be3..3127c148 100644 --- a/apps/web/components/memories-grid.tsx +++ b/apps/web/components/memories-grid.tsx @@ -45,6 +45,7 @@ import { } from "@ui/components/alert-dialog" import { AlignLeft, + BoxSelect, CheckIcon, LayoutGrid, Loader, @@ -180,7 +181,13 @@ function MemoriesGridLoading() { // Discriminated union for masonry items type MasonryItem = - | { type: "document"; id: string; data: DocumentWithMemories } + | { + type: "document" + id: string + data: DocumentWithMemories + isSelectionMode: boolean + isSelected: boolean + } | { type: "quick-note"; id: "quick-note" } interface QuickNoteProps { @@ -369,11 +376,17 @@ export function MemoriesGrid({ } for (const doc of documents) { - items.push({ type: "document", id: doc.id, data: doc }) + items.push({ + type: "document", + id: doc.id, + data: doc, + isSelectionMode, + isSelected: doc.id ? selectedDocumentIds.has(doc.id) : false, + }) } return items - }, [documents, isMobile, hasQuickNote]) + }, [documents, isMobile, hasQuickNote, isSelectionMode, selectedDocumentIds]) // Stable key for Masonry based on document IDs, not item values const masonryKey = useMemo(() => { @@ -437,16 +450,12 @@ export function MemoriesGrid({ const renderRef = useRef({ quickNoteProps, handleCardClick, - isSelectionMode, - selectedDocumentIds, onToggleSelection, processingStatusMap, }) renderRef.current = { quickNoteProps, handleCardClick, - isSelectionMode, - selectedDocumentIds, onToggleSelection, processingStatusMap, } @@ -480,8 +489,8 @@ export function MemoriesGrid({ data={doc} width={width} onClick={r.handleCardClick} - isSelectionMode={r.isSelectionMode} - isSelected={doc.id ? r.selectedDocumentIds.has(doc.id) : false} + isSelectionMode={data.isSelectionMode} + isSelected={data.isSelected} onToggleSelection={ doc.id && r.onToggleSelection ? () => r.onToggleSelection?.(doc.id as string) @@ -518,12 +527,16 @@ export function MemoriesGrid({ const isEmpty = documents.length === 0 && !isPending const showNovaEmptyState = isEmpty && emptyStateProps + const allVisibleSelected = + documents.length > 0 && + documents.every((d) => d.id && selectedDocumentIds.has(d.id)) + return (