'use client' import Link from 'next/link' import { trpc } from '@/lib/trpc/client' import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@/components/ui/sheet' import { Badge } from '@/components/ui/badge' import { Skeleton } from '@/components/ui/skeleton' import { Separator } from '@/components/ui/separator' import { Mail, MapPin, GraduationCap, CheckCircle2, XCircle, MessageSquare, FileText, Target, Calendar, } from 'lucide-react' import { formatEnumLabel } from '@/lib/utils' function formatDateOnly(d: Date | string | null | undefined): string { if (!d) return '—' return new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' }).format(new Date(d)) } function formatRelativePast(d: Date | string | null): string { if (!d) return '—' const dt = typeof d === 'string' ? new Date(d) : d const ms = Date.now() - dt.getTime() const days = Math.floor(ms / 86_400_000) const hours = Math.floor(ms / 3_600_000) if (days >= 1) return `${days}d ago` if (hours >= 1) return `${hours}h ago` const minutes = Math.floor(ms / 60_000) return `${Math.max(0, minutes)}m ago` } export function MentorDetailSheet({ mentorId, open, onOpenChange, }: { mentorId: string | null open: boolean onOpenChange: (next: boolean) => void }) { const { data, isLoading } = trpc.mentor.getMentorDetail.useQuery( { mentorId: mentorId ?? '' }, { enabled: open && !!mentorId }, ) return ( {isLoading || !data ? ( ) : ( data.mentor.name ?? 'Unnamed mentor' )} {isLoading || !data ? ( ) : ( {data.mentor.email} {data.mentor.country && ( {data.mentor.country} )} )} {isLoading || !data ? (
) : (
{/* Profile summary */}

Profile

Expertise
{data.mentor.expertiseTags.length > 0 ? (
{data.mentor.expertiseTags.map((t) => ( {t} ))}
) : (
None declared
)}
Joined {formatDateOnly(data.mentor.createdAt)}
Max assignments {data.mentor.maxAssignments ?? '∞'}
{/* Assignments */}

Teams ({data.assignments.length})

{data.assignments.length === 0 ? (
This mentor has no assignments yet.
) : (
{data.assignments.map((a) => { const isCompleted = a.completionStatus === 'completed' const isDropped = !!a.droppedAt return (
{a.project.title}
{a.project.competitionCategory && ( {formatEnumLabel(a.project.competitionCategory)} )} {a.project.country && ( <> · {a.project.country} )} · Assigned {formatDateOnly(a.assignedAt)}
{isCompleted ? ( Completed ) : isDropped ? ( Dropped ) : ( Active )}
{isDropped && a.droppedReason && (
Drop reason {a.droppedBy ? ` (by ${a.droppedBy})` : ''}: {a.droppedReason}
)} {/* Activity counts */}
{a.messageCount}
{a.lastMessageAt ? formatRelativePast(a.lastMessageAt) : 'no messages'}
{a.fileCount}
{a.lastFileAt ? formatRelativePast(a.lastFileAt) : 'no files'}
{a.milestoneCompletionCount}
{a.lastMilestoneAt ? formatRelativePast(a.lastMilestoneAt) : 'no milestones'}
) })}
)}
)}
) }