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 { 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', second: '2-digit' } export function Enrollments({ enrollments, seats }: { enrollments: Enrollment[] seats: Seat[] }) { return ( Matrículas relacionadas Acompanhe o status e os detalhes de todas as matrículas relacionadas a esta compra. Colaborador Curso Status Executada em Agendada em Revogada em {enrollments.map( ( { user, course, status, executed_at, scheduled_at, rollback_at }, idx ) => { return ( {initials(user.name)} {user.name} {user.email} {course.name} {executed_at ? ( {executed_at} ) : null} {scheduled_at ? ( {scheduled_at} ) : null} {rollback_at ? ( {rollback_at} ) : 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: 'Aguardando', 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 }) => { return ( {quantity}x {course.name} ) })} > ) : ( Nenhuma matrícula aberta foi encontrada para esta compra. )} ) }
Matrículas que estão abertas e relacionadas a esta compra.
Nenhuma matrícula aberta foi encontrada para esta compra.