import { useState } from 'react' import { useMutation, useQuery } from '@tanstack/react-query' import { Link, useParams } from '@tanstack/react-router' import { CalendarX2, CheckCircle2, Loader2, Moon, Sun } from 'lucide-react' import { Badge, Button, useToast } from '../components/ui' import { Logo } from '../components/brand' import { useTheme } from '../context/ThemeProvider' import { ApiError, getAbsenceDetails, publicNotifyAbsence } from '../lib/api' export function AbsenceNotifyView() { const { token } = useParams({ strict: false }) as { token: string } const { setTheme, isDark } = useTheme() const toast = useToast() const [locallyNotified, setLocallyNotified] = useState([]) const detailsQuery = useQuery({ queryKey: ['absence-details', token], queryFn: () => getAbsenceDetails(token), enabled: Boolean(token), retry: 1, }) const notifyMutation = useMutation({ mutationFn: (sessionId: string) => publicNotifyAbsence({ token, classSessionId: sessionId }), onSuccess: (_data, sessionId) => { setLocallyNotified((prev) => [...prev, sessionId]) toast.success( 'Tu profesor ya tiene registrado el aviso. Gracias por avisar.', 'Ausencia avisada', ) }, onError: (error: unknown) => { if (error instanceof ApiError && error.problem?.status === 404) { toast.error('Este enlace ya no es válido. Consultá a tu profesor.') return } toast.error( error instanceof Error ? error.message : 'No pudimos registrar el aviso.', ) }, }) const details = detailsQuery.data return (
{detailsQuery.isPending ? (

Cargando tus clases...

) : null} {detailsQuery.isError || !details ? (

Enlace no válido

No pudimos identificarte con este enlace. Consultá con tu profesor para solicitar uno nuevo.

) : null} {details ? (
Aviso de ausencia

Hola, {details.fullName}

Grupo: {details.groupName}

{details.sessions.length === 0 ? (

No tenés clases programadas para hoy. Si necesitás avisar de todas formas, contactá a tu profesor.

) : (
    {details.sessions.map((session) => { const time = new Date(session.startsAt).toLocaleTimeString('es-MX', { hour: '2-digit', minute: '2-digit', hour12: false, }) const notified = session.notified || locallyNotified.includes(session.sessionId) return (
  • Hoy · {time} hs

    {session.groupName}

    {notified ? ( Ya avisaste ) : ( )}
  • ) })}
)}

Si avisás con anticipación, tu cupo se libera para una clase de recuperación.

) : null}
) }