"use client"; import { useEffect, useState } from "react"; import { useAuth } from "@/lib/auth-context"; import { useRouter } from "next/navigation"; import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, } from "@/components/ui/pagination"; interface UploadedFile { id: string; original_name: string; file_path: string; upload_status: string; created_at: string; } export default function RendersPage() { const { isAuthenticated, user } = useAuth(); const router = useRouter(); const [files, setFiles] = useState([]); const [loading, setLoading] = useState(true); const [authInitialized, setAuthInitialized] = useState(false); const [deletingId, setDeletingId] = useState(null); const [page, setPage] = useState(1); const pageSize = 5; const [totalPages, setTotalPages] = useState(1); useEffect(() => { const timer = setTimeout(() => setAuthInitialized(true), 100); return () => clearTimeout(timer); }, []); useEffect(() => { if (!authInitialized) return; if (!isAuthenticated || !user) { router.push("/login?redirect=/renders"); return; } fetchFiles(page); // eslint-disable-next-line }, [authInitialized, isAuthenticated, user, page]); async function fetchFiles(pageNum: number) { setLoading(true); try { const res = await fetch( `/api/renders/in?page=${pageNum}&pageSize=${pageSize}`, { headers: { "user-id": user?.id }, } ); const data = await res.json(); setFiles(data.files || []); setTotalPages(data.pagination?.totalPages || 1); } catch { setFiles([]); setTotalPages(1); } finally { setLoading(false); } } async function handleDelete(id: string) { if (!user) return; const ok = confirm("Delete this file? This cannot be undone."); if (!ok) return; setDeletingId(id); try { const res = await fetch("/api/renders/in", { method: "DELETE", headers: { "Content-Type": "application/json", "user-id": user.id, }, body: JSON.stringify({ id }), }); const data = await res.json(); if (!res.ok) throw new Error(data?.error || "Delete failed"); await fetchFiles(page); } catch (e) { alert((e as any).message || "Delete failed"); } finally { setDeletingId(null); } } if (!authInitialized || !isAuthenticated) { return (
Loading...
); } const canPrev = page > 1; const canNext = page < totalPages; return (

My Renders

Uploaded Files

{loading ? (
Loading...
) : files.length === 0 ? (
No files uploaded yet.
) : ( <> {files.map((f) => ( ))}
Filename Status Uploaded At Download Actions
{f.original_name} {f.upload_status} {new Date(f.created_at).toLocaleString()} Download
{ e.preventDefault(); if (canPrev) setPage(page - 1); }} aria-disabled={!canPrev} className={ !canPrev ? "pointer-events-none opacity-50" : "" } /> {Array.from({ length: totalPages }, (_, i) => i + 1).map( (p) => ( { e.preventDefault(); setPage(p); }} > {p} ) )} { e.preventDefault(); if (canNext) setPage(page + 1); }} aria-disabled={!canNext} className={ !canNext ? "pointer-events-none opacity-50" : "" } />
)}

Rendered Files (outputs)

Placeholder: Your rendered products will appear here in the future!
); }