From 95dcf92d8b3ba1abc346583172e0c2baf9de9f6a Mon Sep 17 00:00:00 2001 From: yusufipk Date: Sat, 27 Jun 2026 13:35:08 +0200 Subject: [PATCH] fix: clamp page after bulk video delete When every video on the current page was bulk-deleted, router.refresh() re-queried the same out-of-range page and rendered "No videos yet" even though earlier pages still had videos. Clamp to the last valid page based on the remaining video count, falling back to refresh in place. --- app/(dashboard)/projects/[projectId]/page.tsx | 2 ++ .../[projectId]/project-content-client.tsx | 27 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/(dashboard)/projects/[projectId]/page.tsx b/app/(dashboard)/projects/[projectId]/page.tsx index e0ef6aa..893fa72 100644 --- a/app/(dashboard)/projects/[projectId]/page.tsx +++ b/app/(dashboard)/projects/[projectId]/page.tsx @@ -196,6 +196,7 @@ export default async function ProjectPage({ params, searchParams }: ProjectPageP workspaceRole={null} totalPages={totalPages} currentPage={page} + pageSize={pageSize} directUploadsEnabled={directUploadsEnabled} directUploadProvider={directUploadProvider} /> @@ -227,6 +228,7 @@ export default async function ProjectPage({ params, searchParams }: ProjectPageP workspaceRole={workspaceRole} totalPages={totalPages} currentPage={page} + pageSize={pageSize} directUploadsEnabled={directUploadsEnabled} directUploadProvider={directUploadProvider} /> diff --git a/app/(dashboard)/projects/[projectId]/project-content-client.tsx b/app/(dashboard)/projects/[projectId]/project-content-client.tsx index c6387c2..7421712 100644 --- a/app/(dashboard)/projects/[projectId]/project-content-client.tsx +++ b/app/(dashboard)/projects/[projectId]/project-content-client.tsx @@ -70,6 +70,7 @@ interface ProjectContentClientProps { workspaceRole: string | null; totalPages: number; currentPage: number; + pageSize: number; directUploadsEnabled: boolean; directUploadProvider: DirectUploadProvider; } @@ -84,6 +85,7 @@ export function ProjectContentClient({ isOwner, totalPages, currentPage, + pageSize, directUploadsEnabled, directUploadProvider, }: ProjectContentClientProps) { @@ -223,13 +225,34 @@ export function ProjectContentClient({ toast.success( typeof body?.data?.message === 'string' ? body.data.message : 'Selected videos deleted' ); - router.refresh(); + + // The current page may now be out of range (e.g. we deleted every video + // on it). Clamp to the last valid page so the refresh lands on a page + // that still has videos instead of showing "No videos yet". + const remainingTotal = allVideoIds.filter((id) => !deletedIds.has(id)).length; + const newTotalPages = Math.max(1, Math.ceil(remainingTotal / pageSize)); + if (currentPage > newTotalPages) { + router.push(`?${createQueryString('page', newTotalPages.toString())}`); + } else { + router.refresh(); + } } catch { toast.error('Failed to delete selected videos'); } finally { setIsDeletingSelected(false); } - }, [canEdit, isDeletingSelected, projectId, router, selectedCount, selectedVideoIds]); + }, [ + allVideoIds, + canEdit, + createQueryString, + currentPage, + isDeletingSelected, + pageSize, + projectId, + router, + selectedCount, + selectedVideoIds, + ]); return ( <>