"use client"; import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { adminGet, adminSend, type AdminSemester, type Schedule } from "@/lib/admin-api"; export default function AdminSchedulePage() { const { t } = useTranslation(); const [semesters, setSemesters] = useState([]); const [semesterId, setSemesterId] = useState(null); const [schedule, setSchedule] = useState(null); const [loading, setLoading] = useState(true); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [notice, setNotice] = useState(null); const [subjectId, setSubjectId] = useState(""); const [professorId, setProfessorId] = useState(""); useEffect(() => { (async () => { try { const list = await adminGet("/api/admin/semesters"); setSemesters(list); setSemesterId(list[0]?.id ?? null); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setLoading(false); } })(); }, []); const loadSchedule = useCallback(async (id: number) => { setLoading(true); setError(null); try { setSchedule(await adminGet(`/api/admin/schedule/${id}`)); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setLoading(false); } }, []); useEffect(() => { if (semesterId !== null) void loadSchedule(semesterId); }, [semesterId, loadSchedule]); async function run(action: () => Promise<{ message?: string }>) { setBusy(true); setError(null); setNotice(null); try { const result = await action(); setNotice(result.message ?? null); if (semesterId !== null) await loadSchedule(semesterId); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setBusy(false); } } return (

{t("admin_schedule")}

{t("admin_schedule_intro")}

{error && (
{error}
)} {notice && (
{notice}
)}
{schedule && schedule.uncoveredSubjects.length > 0 && (
{t("admin_uncovered_count", { count: schedule.uncoveredSubjects.length })} {t("admin_uncovered_hint")}
{schedule.uncoveredSubjects.map((u) => u.code).join(", ")}
)}

{t("admin_assignments")} {schedule ? `— ${schedule.semesterName}` : ""}

{loading ? ( ) : !schedule || schedule.assignments.length === 0 ? ( ) : ( schedule.assignments.map((a) => ( )) )}
{t("admin_subject_code")} {t("subject")} {t("admin_professor")} {t("actions")}
{t("loading")}
{t("admin_no_assignments")}
{a.subjectCode} {a.subjectName} {a.professorName}

{t("admin_load")}

    {schedule?.load.map((l) => (
  • {l.professorName} {l.subjects}
  • ))} {!schedule?.load.length && (
  • {t("admin_no_professors")}
  • )}
); }