import Link from "next/link"; import { notFound } from "next/navigation"; import type { Metadata } from "next"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { getRecording, getRecordingName } from "@/lib/db/queries/recordings"; import { Play } from "lucide-react"; export const dynamic = "force-dynamic"; export async function generateMetadata({ params }: { params: Promise<{ id: string }> }): Promise { const { id } = await params; const name = await getRecordingName(Number(id)); return { title: name ?? "Recording" }; } function formatDuration(ms: number): string { const totalSeconds = Math.round(ms / 1000); return `${Math.floor(totalSeconds / 60)}:${(totalSeconds % 60).toString().padStart(2, "0")}`; } export default async function RecordingDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = await params; const result = await getRecording(Number(id)); if (!result) notFound(); const { recording } = result; return (

{recording.name}

{recording.description &&

{recording.description}

}
Details
Duration: {formatDuration(recording.durationMs)}
Plays: {recording.playCount}
Created: {new Date(recording.createdAt).toLocaleString()}
Last played: {recording.lastPlayedAt ? new Date(recording.lastPlayedAt).toLocaleString() : "Never"}
Devices in this recording {recording.deviceSlots.map((slot) => (
{slot.slotLabel} ({slot.recordedBleName})
))}
); }