import { BanIcon, CheckCircle2Icon, CircleDashedIcon, ClockIcon, EllipsisIcon, HelpCircleIcon, PlusIcon, type LucideIcon } from 'lucide-react' import { Fragment } from '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 { Kbd } from '@repo/ui/components/ui/kbd' import { Popover, PopoverContent, PopoverTrigger } from '@repo/ui/components/ui/popover' import { Spinner } from '@repo/ui/components/ui/spinner' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@repo/ui/components/ui/table' import { cn, initials } from '@repo/ui/lib/utils' import { NavLink } from 'react-router' 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 efetuadas 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}
) } )} {enrollments.length === 0 && ( Nenhuma matrícula ainda. )}
) } 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 do pagamento.' } 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 permanecem abertas devido à ausência de colaborador.

{seats.map(({ course, quantity }, idx) => { return ( {course.name}
{quantity}x
) })}
) : (

Não há matrículas abertas pertencentes a esta compra.

)}
) }