From d79b1d4612cd48297cdfac22bc952a357ca323bd Mon Sep 17 00:00:00 2001 From: ephraimduncan Date: Wed, 22 Apr 2026 17:23:49 +0000 Subject: [PATCH] fix: persist selected envelope metadata across pagination for bulk download --- .../t.$teamUrl+/documents._index.tsx | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx index 827f95b8c..b11da8e49 100644 --- a/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx +++ b/apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents._index.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import { msg } from '@lingui/core/macro'; import { Trans } from '@lingui/react/macro'; +import type { DocumentStatus as PrismaDocumentStatus } from '@prisma/client'; import { EnvelopeType } from '@prisma/client'; import { FolderType, OrganisationType } from '@prisma/client'; import { useParams, useSearchParams } from 'react-router'; @@ -67,6 +68,9 @@ export default function DocumentsPage() { 'documents-bulk-selection', {}, ); + const [envelopeMetaCache, setEnvelopeMetaCache] = useSessionStorage< + Record + >('documents-bulk-selection-meta', {}); const [isBulkMoveDialogOpen, setIsBulkMoveDialogOpen] = useState(false); const [isBulkDeleteDialogOpen, setIsBulkDeleteDialogOpen] = useState(false); const [isBulkDownloadDialogOpen, setIsBulkDownloadDialogOpen] = useState(false); @@ -99,17 +103,40 @@ export default function DocumentsPage() { }, ); - const selectedEnvelopesForDownload = useMemo(() => { - const selectedSet = new Set(selectedEnvelopeIds); + useEffect(() => { + setEnvelopeMetaCache((prev) => { + const next: Record = {}; - return (data?.data ?? []) - .filter((document) => selectedSet.has(document.envelopeId)) - .map((document) => ({ - id: document.envelopeId, - title: document.title, - status: document.status, - })); - }, [selectedEnvelopeIds, data?.data]); + for (const id of Object.keys(prev)) { + if (rowSelection[id]) { + next[id] = prev[id]; + } + } + + for (const document of data?.data ?? []) { + if (rowSelection[document.envelopeId]) { + next[document.envelopeId] = { + title: document.title, + status: document.status, + }; + } + } + + return next; + }); + }, [data?.data, rowSelection, setEnvelopeMetaCache]); + + const selectedEnvelopesForDownload = useMemo(() => { + return selectedEnvelopeIds + .map((id) => { + const meta = envelopeMetaCache[id]; + return meta ? { id, title: meta.title, status: meta.status } : null; + }) + .filter( + (item): item is { id: string; title: string; status: PrismaDocumentStatus } => + item !== null, + ); + }, [selectedEnvelopeIds, envelopeMetaCache]); const getTabHref = (value: keyof typeof ExtendedDocumentStatus) => { const params = new URLSearchParams(searchParams);