Skip to content

Commit 1f3bcc3

Browse files
Update page.tsx
1 parent feb5439 commit 1f3bcc3

File tree

1 file changed

+55
-39
lines changed

1 file changed

+55
-39
lines changed

app/admin/estudiantes/page.tsx

Lines changed: 55 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Notifica al usuario mediante toasts.
1616

1717
import { useEffect, useState } from 'react' //hooks de React para manejar estado y efectos secundarios.
1818
import type { Estudiante } from '@/types' //Llama al código que define un estudiante.
19-
import { apiFetch, obtenerTokenAdmin } from '@/lib/api' //función personalizada para hacer peticiones a la API. y obtiene el token de autenticación del administrador.
19+
import { apiFetch, obtenerTokenAdmin } from '@/lib/api' //función personalizada conecta front con back. y obtiene el token de autenticación para el admin logeado.
2020
import { useRouter } from 'next/navigation' //hook de Next.js para redirigir.
2121

2222
/*
@@ -36,33 +36,43 @@ import { Navbar } from '@/components/navbar'
3636

3737
//Componente principal que renderiza la interfaz de administración de estudiantes.
3838
export default function GestionEstudiantes() {
39-
const [lista, setLista] = useState<Estudiante[]>([]) //lista de estudiantes obtenidos de la API.
40-
const [q, setQ] = useState('') //cadena de búsqueda (nombre/email).
41-
const [cargando, setCargando] = useState(true) //bandera de estado para mostrar “Cargando…”.
42-
const token = obtenerTokenAdmin() //token de autenticación del administrador.
43-
const router = useRouter() //navegación programática (redirigir).
39+
const [lista, setLista] = useState<Estudiante[]>([]) //lista de estudiantes obtenidos de la API (inicia vacía).
40+
const [q, setQ] = useState('') //cadena de búsqueda query (inicia vacía).
41+
const [cargando, setCargando] = useState(true) //bandera de estado para mostrar “Cargando…”.
42+
const token = obtenerTokenAdmin() //revisa si el admin está logueado.
43+
const router = useRouter() //navegación redigirida /cambiar de página (ej: redirigir al login)..
4444
const { toast } = useToast() //mostrar notificaciones.
4545

46-
//useEffect (control de acceso + carga de datos)
46+
//useEffect (verifica existencia de token y carga el query)
47+
/*
48+
Se verifica el token con obtenerTokenAdmin().
49+
Si no hay, se redirige a /admin/login.
50+
Si existe, se llama a cargar() para traer estudiantes desde el backend.
51+
*/
4752
useEffect(() => {
4853
if (!token) {
4954
router.replace('/admin/login')
5055
return
5156
}
5257
cargar()
5358
}, [token, q])
54-
/*
55-
Si no hay token, se redirige al login de admin.
56-
Cada vez que cambie el token o el término de búsqueda (q), se ejecuta cargar().
57-
*/
5859

5960

6061
//Función para obtener estudiantes
62+
/*
63+
Muestra estado de cargando.
64+
Llama a la API /students con un parámetro de búsqueda opcional.
65+
Actualiza el estado lista con los estudiantes obtenidos.
66+
En caso de error, muestra un toast de error.
67+
*/
6168
async function cargar() {
62-
setCargando(true)
69+
setCargando(true) //Inicializa la función para el ususario.
6370
try {
64-
const params = q ? `?q=${encodeURIComponent(q)}` : ''
71+
//Si hay algo escrito en el buscador (q), lo mete en una cajita especial (params) para pedir estudiantes específicos.
72+
const params = q ? `?q=${encodeURIComponent(q)}` : ''
73+
//Hace solicitud al backend con el parametro del estudiante y el token del admin
6574
const data = await apiFetch(`/students${params}`, { token })
75+
//Si todo sale bien, coloca los estudiantes recibidos (data) en la nueva lista.
6676
setLista(data)
6777
} catch (e: any) {
6878
toast({
@@ -71,23 +81,27 @@ export default function GestionEstudiantes() {
7181
variant: 'destructive'
7282
})
7383
} finally {
84+
//finaliza la función para el ususario.
7485
setCargando(false)
7586
}
7687
}
77-
/*
78-
Muestra estado de cargando.
79-
Llama a la API /students con un parámetro de búsqueda opcional.
80-
Actualiza el estado lista con los estudiantes obtenidos.
81-
En caso de error, muestra un toast de error.
82-
*/
8388

8489
//Función para eliminar estudiantes
90+
/*
91+
Pide confirmación al usuario.
92+
Llama a la API para borrar el estudiante.
93+
Actualiza la lista local eliminando al estudiante borrado.
94+
Muestra un toast de éxito o error.
95+
*/
8596
async function eliminar(id: string) {
8697
if (!confirm('¿Eliminar estudiante y sus inscripciones?')) return
8798
try {
99+
//Llama al backend para borrar, tomando el id del estudiante y verificando el token del admin
88100
await apiFetch(`/students/${id}`, { metodo: 'DELETE', token })
101+
//Actualiza la lista LOCAL, borrando al estudiante que coincida con el id (sin recargar la página)
89102
setLista(prev => prev.filter(x => x._id !== id))
90103
toast({ title: 'Estudiante eliminado', description: 'La acción se realizó correctamente.' })
104+
//Manejo de errores
91105
} catch (e: any) {
92106
toast({
93107
title: 'No se pudo eliminar',
@@ -96,17 +110,14 @@ export default function GestionEstudiantes() {
96110
})
97111
}
98112
}
99-
/*
100-
Pide confirmación al usuario.
101-
Llama a la API para borrar el estudiante.
102-
Actualiza la lista local eliminando al estudiante borrado.
103-
Muestra un toast de éxito o error.
104-
*/
105113

114+
106115
//Renderizado de la interfaz jsx
107116
return (
117+
{/*Este bloque de código construye la interfaz visual de la página de "Gestión de Estudiantes" para administradores. */}
118+
{/*Fondo oscuro, texto blanco, incluye la barra de navegación.*/}
108119
<div className="min-h-screen bg-[#0b0e13] text-white">
109-
<Navbar /> {/*Fondo oscuro, texto blanco, incluye la barra de navegación.*/}
120+
<Navbar />
110121
<section className="max-w-6xl mx-auto px-4 py-8">
111122
<div className="flex items-center justify-between">
112123
<div>
@@ -119,6 +130,11 @@ export default function GestionEstudiantes() {
119130
</div>
120131

121132
{/*Busqueda de esyudiantes*/}
133+
{/*
134+
Muestra un cuadro de búsqueda donde el admin puede escribir nombres o emails de estudiantes.
135+
Incluye un botón "Buscar" para aplicar el filtro.
136+
Actualiza la lista automáticamente cuando se busca (usando el estado q y la función cargar).
137+
*/}
122138
<Card className="mt-6 bg-white/5 border-white/10">
123139
<CardHeader>
124140
<CardTitle className="text-white">Buscar Estudiantes</CardTitle>
@@ -146,15 +162,18 @@ export default function GestionEstudiantes() {
146162
</div>
147163
</CardContent>
148164
</Card>
165+
166+
167+
{/*Lista de estudiantes*/}
149168
{/*
150-
Permite buscar estudiantes por nombre o correo.
151-
152-
El campo está enlazado con el estado q.
169+
Muestra una lista de estudiantes (nombre y email).
170+
Incluye un botón "Eliminar" para cada estudiante.
153171
154-
El botón ejecuta cargar().
172+
Gestiona tres estados posibles:
173+
-Cargando datos (cargando).
174+
-Lista vacía (lista.length === 0)
175+
-Lista con resultados.
155176
*/}
156-
157-
{/*Lista de estudiantes*/}
158177
<Card className="mt-6 bg-white/5 border-white/10">
159178
<CardHeader>
160179
<CardTitle className="text-white">Lista de Estudiantes</CardTitle>
@@ -187,17 +206,14 @@ export default function GestionEstudiantes() {
187206
)}
188207
</CardContent>
189208
</Card>
190-
{/*
191-
Muestra el estado de carga, lista vacía o estudiantes.
192-
Cada estudiante muestra:
193-
Nombre y correo.
194-
Botón para eliminar.
195-
*/}
209+
196210

197-
{/*Renderiza los mensajes emergentes de éxito/error.*/
211+
{/*Renderiza los mensajes emergentes.*/}
198212
</section>
199213
{/* Toast del portal */}
200214
<Toaster />
201215
</div>
202216
)
203217
}
218+
219+

0 commit comments

Comments
 (0)