import { BanIcon, CheckCircle2Icon, CircleDashedIcon, ClockIcon, EllipsisIcon, HelpCircleIcon, type LucideIcon } from 'lucide-react' import { Abbr } from '@repo/ui/components/abbr' import { DateTime } from '@repo/ui/components/datetime' import { Avatar, AvatarFallback } from '@repo/ui/components/ui/avatar' import { Badge } from '@repo/ui/components/ui/badge' import { Button } from '@repo/ui/components/ui/button' import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from '@repo/ui/components/ui/card' import { HoverCard, HoverCardContent, HoverCardTrigger } from '@repo/ui/components/ui/hover-card' import { Popover, PopoverContent, PopoverTrigger } from '@repo/ui/components/ui/popover' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@repo/ui/components/ui/table' import { cn, initials } from '@repo/ui/lib/utils' import type { Enrollment, Seat } from './route' const dtOptions: Intl.DateTimeFormatOptions = { hour: '2-digit', minute: '2-digit' } export function Enrollments({ enrollments, seats }: { enrollments: Enrollment[] seats: Seat[] }) { return ( Matrículas relacionadas Acompanhe os detalhes de todas as matrículas relacionadas a esta compra. Colaborador Curso Status Executada em Revogada em {enrollments.map( ( { user, course, status, executed_at, rollback_at, reason: reason_ }, idx ) => { const friendlyReason = reason_ ? reason(reason_) : null return ( {initials(user.name)} {user.name} {user.email} {course.name} {friendlyReason ? ( {' '} {friendlyReason} ) : ( )} {executed_at ? ( {executed_at} ) : null} {rollback_at ? ( {rollback_at} ) : null} ) } )} ) } const reasons: Record = { DEDUPLICATION: 'Matrícula ou agendamento já existentes.', CANCELLATION: 'Cancelamento da matrícula.', UNSCHEDULED: 'Cancelamento do agendamento da matrícula.', DEADLINE: 'Data do agendamento é anterior ao dia atual.' } as const const reason = (reason_: string): string | null => { return reason_ in reasons ? reasons[reason_] : null } const statuses: Record = { PENDING: { icon: CircleDashedIcon, color: 'text-blue-400 [&_svg]:text-blue-500' }, SCHEDULED: { icon: ClockIcon, color: 'text-blue-400 [&_svg]:text-blue-500' }, EXECUTED: { icon: CheckCircle2Icon, color: 'text-green-400 [&_svg]:text-green-500' }, ROLLBACK: { icon: BanIcon, color: 'text-orange-400 [&_svg]:text-orange-500' } } const labels: Record = { PENDING: 'Pendente', EXECUTED: 'Executada', SCHEDULED: 'Agendada', ROLLBACK: 'Revogada' } function Status({ status: s }: { status: string }) { const status = labels[s] ?? s const { icon: Icon, color } = statuses?.[s] ?? { icon: HelpCircleIcon } return ( {status} ) } function SeatsMenu({ seats: seats_ }: { seats: Seat[] }) { const seats = Object.values( seats_.reduce((acc: any, { course }) => { acc[course.id] ??= { course, quantity: 0 } acc[course.id].quantity++ return acc }, {}) ) as { course: Seat['course']; quantity: number }[] return ( {seats.length > 0 ? ( <> Matrículas abertas Matrículas que estão abertas e relacionadas a esta compra. {seats.map(({ course, quantity }, idx) => { return ( {quantity}x {course.name} ) })} > ) : ( Nenhuma matrícula aberta foi encontrada para esta compra. )} ) }
{' '} {friendlyReason}
Matrículas que estão abertas e relacionadas a esta compra.
Nenhuma matrícula aberta foi encontrada para esta compra.