"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Play, Trash2 } from "lucide-react"; import { toast } from "sonner"; export interface SessionRow { id: number; name: string | null; status: "active" | "completed" | "aborted"; startedAt: number; durationMs: number | null; } const STATUS_VARIANT = { active: "default", completed: "secondary", aborted: "destructive", } as const; function formatDuration(ms: number | null): string { if (ms === null) return "-"; const totalSeconds = Math.round(ms / 1000); const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; return `${minutes}:${seconds.toString().padStart(2, "0")}`; } export function SessionsTable({ sessions }: { sessions: SessionRow[] }) { const router = useRouter(); const [pendingDelete, setPendingDelete] = useState(null); const [deleting, setDeleting] = useState(false); async function handleDelete() { if (!pendingDelete) return; setDeleting(true); const res = await fetch(`/api/sessions/${pendingDelete.id}`, { method: "DELETE" }); setDeleting(false); if (res.ok) { toast.success("Session deleted"); setPendingDelete(null); router.refresh(); } else { toast.error("Could not delete session"); } } if (sessions.length === 0) { return

No sessions yet.

; } return ( <> Session Status Started Duration Actions {sessions.map((s) => ( {s.name ?? `Session #${s.id}`} {s.status} {new Date(s.startedAt).toLocaleString()} {formatDuration(s.durationMs)} {s.status === "completed" && s.durationMs !== null && ( )} ))}
!open && setPendingDelete(null)}> Delete session? This permanently deletes{" "} {pendingDelete?.name ?? `Session #${pendingDelete?.id}`} {" "} and all of its recorded events. This can't be undone. ); }