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.
This commit is contained in:
yusufipk
2026-06-27 13:35:08 +02:00
parent 52e4169db2
commit 95dcf92d8b
2 changed files with 27 additions and 2 deletions
@@ -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}
/>
@@ -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'
);
// 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 (
<>