import { useEffect, useState } from "preact/hooks"; interface Promotion { id: number; name: string; } interface Student { id: number; firstName: string; lastName: string; email: string; promotionId: number; } export default function ConsultStudents() { const [promotions, setPromotions] = useState([]); const [studentsByPromotion, setStudentsByPromotion] = useState>({}); const [error, setError] = useState(null); useEffect(() => { const fetchPromotionsAndStudents = async () => { try { // Récupérer toutes les promotions const promoResponse = await fetch("/mobility/api/promotions"); if (!promoResponse.ok) { throw new Error(`Error fetching promotions: ${promoResponse.statusText}`); } const promos: Promotion[] = await promoResponse.json(); setPromotions(promos); // Récupérer les étudiants const studentsResponse = await fetch("/mobility/api/insert_students"); if (!studentsResponse.ok) { throw new Error(`Error fetching students: ${studentsResponse.statusText}`); } const students: Student[] = await studentsResponse.json(); // Grouper les étudiants par promotionId const grouped: Record = {}; for (const student of students) { if (!grouped[student.promotionId]) { grouped[student.promotionId] = []; } grouped[student.promotionId].push(student); } setStudentsByPromotion(grouped); } catch (err) { console.error("Error fetching promotions or students:", err); setError("Failed to load data. Please try again later."); } }; fetchPromotionsAndStudents(); }, []); return (

Consult Students

{error &&

{error}

} {promotions.length === 0 ? (

No promotions found.

) : ( promotions.map((promo) => (

Promotion: {promo.name}

{studentsByPromotion[promo.id]?.length ? ( {studentsByPromotion[promo.id].map((student) => ( ))}
ID First Name Last Name Email
{student.id} {student.firstName} {student.lastName} {student.email}
) : (

No students in this promotion.

)}
)) )}
); }