import Link from "next/link"; import { Table, TableBody, TableCell, TableEmpty, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { StatusBadge } from "@/components/ui/badge"; import { CopyButton } from "@/components/ui/copy-button"; import { formatDate, formatNumber, timeAgo } from "@/lib/format"; import type { SessionRow } from "@/lib/queries/dashboard"; import { CloseSessionButton } from "./close-session-button"; function expiresIn(d: Date): string { const diff = d.getTime() - Date.now(); if (diff <= 0) return "expired"; const s = Math.round(diff / 1000); if (s < 60) return `in ${s}s`; const m = Math.round(s / 60); if (m < 60) return `in ${m}m`; return `in ${Math.round(m / 60)}h`; } export function SessionsTable({ rows }: { rows: SessionRow[] }) { return ( Session Label Project Created Last used Country Network Requests Status Expires {rows.length === 0 ? ( No sessions yet. ) : ( rows.map((s) => ( {s.id} {s.label ?? —} {s.projectName} {timeAgo(s.createdAt)} {s.lastUsedAt ? timeAgo(s.lastUsedAt) : never} {[s.country, s.region, s.city].filter(Boolean).join(" · ") || "any"} {s.network === "isp" ? "ISP" : s.network} {s.requestCount > 0 ? ( {formatNumber(s.requestCount)} ) : ( "0" )} {s.status === "active" ? expiresIn(s.expiresAt) : formatDate(s.expiresAt, { dateStyle: "short", timeStyle: "short" })} {s.status === "active" ? : null} )) )}
); }