"use client"; import * as React from "react"; import Link from "next/link"; import { useSession } from "~/lib/auth-client"; import { formatDistanceToNow } from "date-fns"; import { Play, Plus, Activity, Clock, CheckCircle2, Users, FlaskConical, ChevronRight, Bot, Radio, Building, } from "lucide-react"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { ScrollArea } from "~/components/ui/scroll-area"; import { PageHeader } from "~/components/ui/page-layout"; import { api } from "~/trpc/react"; export default function DashboardPage() { const { data: session } = useSession(); const userName = session?.user?.name ?? "Researcher"; const { data: userStudies } = api.studies.list.useQuery({ memberOnly: true, limit: 10, }); const { data: recentTrials } = api.trials.list.useQuery({ limit: 5, }); const { data: liveTrials } = api.dashboard.getLiveTrials.useQuery( {}, { refetchInterval: 5000 }, ); const { data: stats } = api.dashboard.getStats.useQuery({}); const greeting = (() => { const hour = new Date().getHours(); if (hour < 12) return "Good morning"; if (hour < 18) return "Good afternoon"; return "Good evening"; })(); const firstStudy = userStudies?.studies?.[0]; return (
{/* Header */}
} /> {/* Live Trials Banner */} {liveTrials && liveTrials.length > 0 && (

{liveTrials.length} Active Session{liveTrials.length > 1 ? "s" : ""}

{liveTrials.map((t) => t.participantCode).join(", ")}

)} {/* Stats Row */}
{/* Main Grid */}
{/* Studies List */}

Your Studies

{userStudies?.studies?.slice(0, 5).map((study) => (

{study.name}

{study.status === "active" ? ( Active ) : ( {study.status} )}

))} {!userStudies?.studies?.length && (

No studies yet

Create your first study to get started

)}
{/* Quick Links & Recent */}
{/* Quick Actions */}

Quick Actions

{/* Recent Trials */}

Recent Trials

{recentTrials?.slice(0, 5).map((trial) => (
{trial.participant.participantCode} {trial.status.replace("_", " ")}

{trial.experiment.name}

{trial.completedAt && (

{formatDistanceToNow(new Date(trial.completedAt), { addSuffix: true })}

)} ))} {!recentTrials?.length && (

No trials yet

)}
); } function StatCard({ label, value, icon: Icon, color, }: { label: string; value: number; icon: React.ElementType; color: "teal" | "emerald" | "blue" | "violet"; }) { const colorClasses = { teal: "bg-primary/10 text-primary", emerald: "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400", blue: "bg-blue-500/10 text-blue-600 dark:text-blue-400", violet: "bg-violet-500/10 text-violet-600 dark:text-violet-400", }; return (

{value}

{label}

); }