"use client"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { cn } from "@/lib/utils"; import { Submission } from "@/generated/client"; import { Clock4Icon, CpuIcon } from "lucide-react"; import { getStatusColorClass } from "@/lib/status"; import { useDockviewStore } from "@/stores/dockview"; import { EditorLanguageIcons } from "@/config/editor-language-icons"; import { formatDistanceToNow, isBefore, subDays, format } from "date-fns"; interface SubmissionsTableProps { submissions: Submission[]; } export default function SubmissionsTable({ submissions }: SubmissionsTableProps) { const { api, setSubmission } = useDockviewStore(); const sortedSubmissions = [...submissions].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() ); const handleRowClick = (submission: Submission) => { if (!api) return; setSubmission(submission); const panel = api.getPanel("Details"); if (panel) { panel.api.setActive(); } else { api.addPanel({ id: "Details", component: "Details", tabComponent: "Details", title: submission.status, position: { referencePanel: "Submissions", direction: "within", }, }); } } return ( Index Status Language Time Memory {sortedSubmissions.map((submission, index) => { const Icon = EditorLanguageIcons[submission.language]; const createdAt = new Date(submission.createdAt); const submittedDisplay = isBefore(createdAt, subDays(new Date(), 1)) ? format(createdAt, "yyyy-MM-dd") : formatDistanceToNow(createdAt, { addSuffix: true }); const isEven = (submissions.length - index) % 2 === 0; return ( handleRowClick(submission)} className={ cn( "border-b-0 hover:text-blue-500 hover:bg-muted hover:cursor-pointer", isEven ? "" : "bg-muted/50" ) } > {sortedSubmissions.length - index}
{submission.status} {submittedDisplay}
); })}
); }