--- import AppLayout from '@/layouts/AppLayout.astro'; type Estado = 'pendiente' | 'aprobado' | 'rechazado' | 'activo' | 'devuelto' | 'vencido'; type Item = { cantidad: number; descripcion: string | null; material: { id: number; nombre: string; numero_inventario: string | null } | null; }; type Solicitud = { id: number; estado: Estado; fecha_solicitud: string; fecha_aprobacion: string | null; fecha_devolucion_estimada: string | null; fecha_devolucion_real: string | null; notas: string | null; maestro_responsable: string; items: Item[]; }; const user = Astro.locals.user!; const { data, error } = await Astro.locals.supabase .from('solicitudes') .select('id, estado, fecha_solicitud, fecha_aprobacion, fecha_devolucion_estimada, fecha_devolucion_real, notas, maestro_responsable, items:solicitud_items(cantidad, descripcion, material:materiales(id, nombre, numero_inventario))') .eq('alumno_id', user.id) .order('fecha_solicitud', { ascending: false }); const prestamos = (data ?? []) as unknown as Solicitud[]; const activosSet = new Set(['pendiente', 'aprobado', 'activo']); const activos = prestamos.filter((p) => activosSet.has(p.estado)); const historial = prestamos.filter((p) => !activosSet.has(p.estado)); const fmtFecha = new Intl.DateTimeFormat('es-MX', { dateStyle: 'medium' }); const fmt = (d: string | null) => (d ? fmtFecha.format(new Date(d)) : '—'); const estadoLabel: Record = { pendiente: 'Pendiente', aprobado: 'Aprobado', activo: 'Activo', rechazado: 'Rechazado', devuelto: 'Devuelto', vencido: 'Vencido', }; const estadoColor: Record = { pendiente: 'var(--color-ink)', aprobado: 'var(--color-positive)', activo: 'var(--color-positive)', devuelto: 'var(--color-ink)', rechazado: 'var(--color-danger)', vencido: 'var(--color-danger)', }; const badgeStyle = (e: Estado) => `background: color-mix(in oklab, ${estadoColor[e]} 18%, white); color: var(--color-ink); border: 1.5px solid ${estadoColor[e]};`; ---

Mis préstamos

Estado de tus solicitudes actuales e historial.

{error && ( )} {!error && prestamos.length === 0 && (

Aún no has solicitado material

Explora el catálogo y envía tu primera solicitud.

Ir al catálogo
)} {prestamos.length > 0 && (

Activos ({activos.length})

{activos.length === 0 ? (

Nada activo por ahora.

) : (
    {activos.map((p) => (
    • {p.items.map((it) => (
    • {it.cantidad}×{' '} {it.material?.nombre ?? 'Material eliminado'} {it.material?.numero_inventario && ( {it.material.numero_inventario} )} {it.descripcion && (

      {it.descripcion}

      )}
    • ))}
    {estadoLabel[p.estado]}
    Maestro responsable
    {p.maestro_responsable}
    Solicitado
    {fmt(p.fecha_solicitud)}
    {p.fecha_aprobacion && ( <>
    Aprobado
    {fmt(p.fecha_aprobacion)}
    )} {p.fecha_devolucion_estimada && ( <>
    Devolver antes de
    {fmt(p.fecha_devolucion_estimada)}
    )}
    {p.notas && (

    {p.notas}

    )}
  • ))}
)}
Historial ({historial.length}) {historial.length === 0 ? (

Sin historial todavía.

) : (
    {historial.map((p) => (
    • {p.items.map((it) => (
    • {it.cantidad}×{' '} {it.material?.nombre ?? 'Material eliminado'} {it.material?.numero_inventario && ( {it.material.numero_inventario} )} {it.descripcion && (

      {it.descripcion}

      )}
    • ))}
    {estadoLabel[p.estado]}
    Maestro responsable
    {p.maestro_responsable}
    Solicitado
    {fmt(p.fecha_solicitud)}
    {p.fecha_devolucion_real && ( <>
    Devuelto
    {fmt(p.fecha_devolucion_real)}
    )}
  • ))}
)}
)}