"use client"; import { useParams } from "next/navigation"; import { Suspense, useEffect } from "react"; import Link from "next/link"; import { Play, Zap, ArrowLeft, User, FlaskConical, LineChart } from "lucide-react"; import { PageHeader } from "~/components/ui/page-header"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { useBreadcrumbsEffect } from "~/components/ui/breadcrumb-provider"; import { useStudyContext } from "~/lib/study-context"; import { useSelectedStudyDetails } from "~/hooks/useSelectedStudyDetails"; import { api } from "~/trpc/react"; import { formatDistanceToNow } from "date-fns"; function TrialDetailContent() { const params = useParams(); const studyId: string = typeof params.id === "string" ? params.id : ""; const trialId: string = typeof params.trialId === "string" ? params.trialId : ""; const { setSelectedStudyId, selectedStudyId } = useStudyContext(); const { study } = useSelectedStudyDetails(); // Get trial data const { data: trial, isLoading, error, } = api.trials.get.useQuery({ id: trialId }, { enabled: !!trialId }); // Set breadcrumbs useBreadcrumbsEffect([ { label: "Dashboard", href: "/dashboard" }, { label: "Studies", href: "/studies" }, { label: study?.name ?? "Study", href: `/studies/${studyId}` }, { label: "Trials", href: `/studies/${studyId}/trials` }, { label: trial?.participant.participantCode ?? "Trial" }, ]); // Sync selected study (unified study-context) useEffect(() => { if (studyId && selectedStudyId !== studyId) { setSelectedStudyId(studyId); } }, [studyId, selectedStudyId, setSelectedStudyId]); const getStatusBadgeVariant = (status: string) => { switch (status) { case "completed": return "default"; case "in_progress": return "secondary"; case "scheduled": return "outline"; case "failed": case "aborted": return "destructive"; default: return "outline"; } }; if (isLoading) { return (
Loading trial...
); } if (error) { return (
Back to Trials } />

Error Loading Trial

{error.message || "Failed to load trial data"}

); } if (!trial) { return (
Back to Trials } />

Trial Not Found

The requested trial could not be found.

); } return (
{trial.status === "scheduled" && ( )} {(trial.status === "in_progress" || trial.status === "scheduled") && ( )} {trial.status === "completed" && ( )}
} />
{/* Trial Overview */} Trial Overview Basic information about this trial execution
{trial.status.replace("_", " ")}
{trial.sessionNumber}
{trial.scheduledAt && (
{formatDistanceToNow(new Date(trial.scheduledAt), { addSuffix: true, })}
)} {trial.startedAt && (
{formatDistanceToNow(new Date(trial.startedAt), { addSuffix: true, })}
)} {trial.completedAt && (
{formatDistanceToNow(new Date(trial.completedAt), { addSuffix: true, })}
)} {trial.duration && (
{Math.round(trial.duration / 1000)}s
)}
{trial.notes && (
{trial.notes}
)}
{/* Quick Actions */}
{/* Experiment Info */} Experiment
{trial.experiment.name}
{trial.experiment.description && (
{trial.experiment.description}
)}
{/* Participant Info */} Participant
{trial.participant.participantCode}
{(() => { const demographics = trial.participant.demographics as Record< string, unknown > | null; return ( demographics && typeof demographics === "object" && (
{Object.keys(demographics).length} fields recorded
) ); })()}
); } export default function TrialDetailPage() { return (
Loading...
} >
); }