@@ -16,7 +16,7 @@ Notifica al usuario mediante toasts.
1616
1717import { useEffect , useState } from 'react' //hooks de React para manejar estado y efectos secundarios.
1818import 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 .
2020import { 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.
3838export 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 < / C a r d C o n t e n t >
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 < / C a r d C o n t e n t >
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 < / s e c t i o n >
199213 { /* Toast del portal */ }
200214 < Toaster / >
201215 </div >
202216 )
203217}
218+
219+
0 commit comments