'use client' import type { ColumnDef } from '@tanstack/react-table' import { useRequest, useToggle } from 'ahooks' import { CircleXIcon, EllipsisIcon, FileBadgeIcon, LockOpenIcon } from 'lucide-react' import type { ComponentProps, MouseEvent } from 'react' import { toast } from 'sonner' import { DataTableColumnHeaderSelect, DataTableColumnSelect } from '@repo/ui/components/data-table' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from '@repo/ui/components/ui/alert-dialog' import { Button } from '@repo/ui/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@repo/ui/components/ui/dropdown-menu' import { Spinner } from '@repo/ui/components/ui/spinner' import { columns as columns_, type Enrollment } from '@repo/ui/routes/enrollments/columns' export type { Enrollment } export const columns: ColumnDef[] = [ { id: 'select', header: DataTableColumnHeaderSelect, cell: DataTableColumnSelect, meta: { className: 'w-9' } }, ...columns_, { id: 'action', cell: ActionMenu, meta: { className: 'w-12' } } ] function ActionMenu({ row }: { row: any }) { const [open, { set: setOpen }] = useToggle(false) const cert = row.original?.cert const { data, loading, runAsync, refresh } = useRequest( async () => { const r = await fetch(`/~/api/enrollments/${row.id}`, { method: 'GET' }) return (await r.json()) as { cancel_policy?: any lock?: { hash: string } } }, { manual: true } ) const onSuccess = () => { refresh() setOpen(false) } return (
{ setOpen(open) if (data) return runAsync() }} > setOpen(false)} /> {loading ? ( ) : ( <> )}
) } type ItemProps = ComponentProps & { id: string onSuccess?: () => void } function DownloadItem({ id, onSuccess, ...props }: ItemProps) { const { runAsync, loading } = useRequest( async () => { return await fetch(`/~/api/enrollments/${id}/download`) }, { manual: true } ) const download = async (e: Event) => { e.preventDefault() try { const r = await runAsync() const { presigned_url } = (await r.json()) as { presigned_url: string } window.open(presigned_url, '_blank') onSuccess?.() } catch {} } return ( {loading ? : } Baixar certificado ) } function RemoveDedupItem({ id, lock, onSuccess, ...props }: ItemProps & { lock?: { hash: string; ttl?: number } }) { const [loading, { set }] = useToggle(false) const [open, { set: setOpen }] = useToggle(false) const remove = async (e: MouseEvent) => { e.preventDefault() set(true) if (!lock) return null const r = await fetch(`/~/api/enrollments/${id}/dedupwindow`, { method: 'DELETE', body: JSON.stringify({ lock_hash: lock.hash }), headers: new Headers({ 'Content-Type': 'application/json' }) }) if (r.ok) { toast.info('A proteção contra duplicação foi removida.') setOpen(false) onSuccess?.() } } const daysRemaining = lock?.ttl ? getDaysRemaining(lock.ttl) : null return ( e.preventDefault()} disabled={!lock} {...props} > Remover proteção Tem certeza absoluta? Esta ação não pode ser desfeita. Isso{' '} remove a proteção contra duplicação permanentemente {' '} desta matrícula. {daysRemaining && ( Proteção contra duplicação válida até {daysRemaining} )} Cancelar ) } const getDaysRemaining = (ttl: number) => { return new Date(ttl * 1000).toLocaleString('pt-BR', { hour: '2-digit', minute: '2-digit', day: '2-digit', month: '2-digit', year: '2-digit' }) } function CancelItem({ id, cancelPolicy, onSuccess, ...props }: ItemProps & { cancelPolicy?: object }) { const [loading, { set }] = useToggle(false) const [open, { set: setOpen }] = useToggle(false) const cancel = async (e: MouseEvent) => { e.preventDefault() set(true) const r = await fetch(`/~/api/enrollments/${id}/cancel`, { method: 'PATCH', headers: new Headers({ 'Content-Type': 'application/json' }) }) if (r.ok) { toast.info('A matrícula foi cancelada.') setOpen(false) onSuccess?.() } } return ( e.preventDefault()} disabled={!cancelPolicy} {...props} > Cancelar Tem certeza absoluta? Esta ação não pode ser desfeita. Isso{' '} cancela permanentemente a matrícula {' '} deste colaborador. Cancelar ) }