"use client"; import React, { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { BookOpen, Users, PlusCircle, X, Settings2 } from "lucide-react"; import toast from "react-hot-toast"; import api, { getApiErrorMessage } from "@/lib/api"; import GlassBreadcrumb from "@/components/ui/GlassBreadcrumb"; import GlassPageHeader from "@/components/ui/GlassPageHeader"; import GlassCard from "@/components/ui/GlassCard"; import GlassInput from "@/components/ui/GlassInput"; import GlassSelect from "@/components/ui/GlassSelect"; import GlassButton from "@/components/ui/GlassButton"; import type { TeacherResponse, SubjectResponse, ClassroomResponse, ClassCreate, } from "@/types"; type FormErrors = Partial>; const SEMESTER_OPTIONS = Array.from({ length: 8 }, (_, i) => ({ value: String(i + 1), label: `Semester ${i + 1}`, })); export default function CreateClassPage(): React.ReactElement { const router = useRouter(); const [teachers, setTeachers] = useState([]); const [subjects, setSubjects] = useState([]); const [classrooms, setClassrooms] = useState([]); const [form, setForm] = useState({ name: "", subject_id: "", teacher_id: "", }); const [errors, setErrors] = useState({}); const [loading, setLoading] = useState(false); useEffect(() => { async function fetchMasterData(): Promise { try { const [teachersRes, subjectsRes, classroomsRes] = await Promise.all([ api.get("/admin/users/teachers"), api.get("/admin/subjects"), api.get("/admin/classrooms"), ]); setTeachers(teachersRes.data); setSubjects(subjectsRes.data); setClassrooms(classroomsRes.data); } catch { toast.error("Could not load master data."); } } void fetchMasterData(); }, []); function set(field: keyof ClassCreate, value: string | number | undefined): void { setForm((prev) => ({ ...prev, [field]: value })); if (errors[field]) setErrors((prev) => ({ ...prev, [field]: undefined })); } function validate(): boolean { const errs: FormErrors = {}; if (!form.name.trim()) errs.name = "Class name is required"; if (!form.teacher_id) errs.teacher_id = "Teacher is required"; if (!form.subject_id) errs.subject_id = "Subject is required"; setErrors(errs); return Object.keys(errs).length === 0; } async function handleSubmit(e: React.FormEvent): Promise { e.preventDefault(); if (!validate()) return; setLoading(true); try { await api.post("/admin/classes", form); toast.success("Class created successfully"); router.push("/admin/classes"); } catch (err: unknown) { toast.error(getApiErrorMessage(err, "Failed to create class")); } finally { setLoading(false); } } const teacherOptions = [ { value: "", label: "— Select Teacher —" }, ...teachers.map((t) => ({ value: t.id, label: `${t.first_name} ${t.last_name} — ${t.department}`, })), ]; const subjectOptions = [ { value: "", label: "— Select Subject —" }, ...subjects.map((s) => ({ value: s.id, label: `${s.name} (${s.code})` })), ]; const classroomOptions = [ { value: "", label: "None — no classroom" }, ...classrooms.map((c) => ({ value: c.id, label: c.building ? `${c.name} — ${c.building}` : c.name, })), ]; return (

Core Info

Primary identifiers.

set("name", e.target.value)} error={errors.name} />

Capacity

Enrollment limits.

set("max_students", e.target.value ? Number(e.target.value) : undefined) } />

Class Configuration

Spatial and academic assignments.

set("teacher_id", v)} error={errors.teacher_id} />
set("subject_id", v)} error={errors.subject_id} /> set("classroom_id", v || undefined)} /> set("semester", v ? Number(v) : undefined)} /> set("batch", e.target.value || undefined)} />
router.back()} icon={}> Cancel }> Create Class
); }