A quick vibe-coded site to test response times of PLC.directory mirrors (over 3 attempts)
1import { BenchmarkResult } from "@/types/benchmark";
2import {
3 Table,
4 TableBody,
5 TableCell,
6 TableHead,
7 TableHeader,
8 TableRow,
9} from "@/components/ui/table";
10import { Badge } from "@/components/ui/badge";
11import { CheckCircle2, XCircle } from "lucide-react";
12
13interface BenchmarkTableProps {
14 results: BenchmarkResult[];
15}
16
17export const BenchmarkTable = ({ results }: BenchmarkTableProps) => {
18 // Sort by response time (fastest first)
19 const sortedResults = [...results].sort((a, b) => {
20 if (a.status === "error" && b.status === "success") return 1;
21 if (a.status === "success" && b.status === "error") return -1;
22 return a.responseTime - b.responseTime;
23 });
24
25 return (
26 <div className="rounded-lg border border-border bg-card overflow-hidden">
27 <Table>
28 <TableHeader>
29 <TableRow className="bg-muted/50">
30 <TableHead className="font-semibold">Mirror</TableHead>
31 <TableHead className="font-semibold">URL</TableHead>
32 <TableHead className="font-semibold text-right">Response Time</TableHead>
33 <TableHead className="font-semibold">Status</TableHead>
34 <TableHead className="font-semibold">HTTP Code</TableHead>
35 </TableRow>
36 </TableHeader>
37 <TableBody>
38 {sortedResults.map((result, index) => (
39 <TableRow key={index} className="hover:bg-muted/30 transition-colors">
40 <TableCell className="font-medium">{result.mirrorName}</TableCell>
41 <TableCell className="font-mono text-sm text-muted-foreground">
42 {result.mirrorUrl}
43 </TableCell>
44 <TableCell className="text-right font-mono text-sm">
45 {result.status === "success" ? (
46 <span className="text-foreground font-medium">
47 {result.responseTime.toFixed(0)}ms
48 </span>
49 ) : (
50 <span className="text-muted-foreground">—</span>
51 )}
52 </TableCell>
53 <TableCell>
54 {result.status === "success" ? (
55 <Badge
56 variant="outline"
57 className="bg-success/10 text-success border-success/20 gap-1"
58 >
59 <CheckCircle2 className="w-3 h-3" />
60 Success
61 </Badge>
62 ) : (
63 <Badge
64 variant="outline"
65 className="bg-destructive/10 text-destructive border-destructive/20 gap-1"
66 >
67 <XCircle className="w-3 h-3" />
68 Error
69 </Badge>
70 )}
71 </TableCell>
72 <TableCell className="font-mono text-sm">
73 {result.statusCode ? (
74 <span
75 className={
76 result.statusCode >= 200 && result.statusCode < 300
77 ? "text-success"
78 : "text-destructive"
79 }
80 >
81 {result.statusCode}
82 </span>
83 ) : (
84 <span className="text-muted-foreground">—</span>
85 )}
86 </TableCell>
87 </TableRow>
88 ))}
89 </TableBody>
90 </Table>
91 {sortedResults.length === 0 && (
92 <div className="text-center py-12 text-muted-foreground">
93 No results yet. Enter a DID and run the benchmark.
94 </div>
95 )}
96 </div>
97 );
98};