import React, { useState, useEffect } from "react"; import { useLocation, useParams, useNavigate } from "react-router-dom"; import { fetchFaculties, saveAppointment } from "../api"; import "./CourseForm.css"; import "./Navbar.jsx"; import Navbar from "./Navbar.jsx"; import Footer from "./Footer.jsx"; const CourseForm = () => { const { id } = useParams(); const location = useLocation(); const navigate = useNavigate(); const { course, academicYear } = location.state || {}; const [options, setOptions] = useState({ faculties: [] }); const [suggestions, setSuggestions] = useState({}); const [formData, setFormData] = useState({ oralsPracticals: "", assessment: "", reassessment: "", paperSetting: "", moderation: "", pwdPaperSetter: "", }); const [tempAssignments, setTempAssignments] = useState({ oralsPracticals: [], assessment: [], reassessment: [], paperSetting: [], moderation: [], pwdPaperSetter: [], }); const [examPeriod, setExamPeriod] = useState({ year: academicYear || "", startMonth: "", endMonth: "", }); const [errors, setErrors] = useState({}); // State to check if the form is currently submitting const [loading, setLoading] = useState(false); useEffect(() => { const fetchOptionsAndFaculties = async () => { try { const facultiesData = await fetchFaculties(); const filteredFaculties = facultiesData.filter( (faculty) => faculty.courses.includes(course?.courseId || id) // Only faculties with this course ); setOptions((prev) => ({ ...prev, faculties: filteredFaculties })); } catch (error) { console.error("Failed to fetch faculties:", error); } }; fetchOptionsAndFaculties(); }, []); const handleInputChange = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); if (value.trim() === "") { setSuggestions((prev) => ({ ...prev, [name]: [] })); return; } if (options.faculties.length > 0) { const filteredSuggestions = options.faculties.filter((faculty) => faculty.name.toLowerCase().includes(value.toLowerCase()) ); setSuggestions((prev) => ({ ...prev, [name]: filteredSuggestions })); } }; const handleAddFaculty = (field) => { if (!formData[field]) return; const selectedFaculty = options.faculties.find( (faculty) => faculty.name === formData[field] ); if (selectedFaculty) { setTempAssignments((prev) => ({ ...prev, [field]: [...prev[field], selectedFaculty], })); setFormData({ ...formData, [field]: "" }); } }; const handleRemoveFaculty = (field, index) => { setTempAssignments((prev) => { const updatedAssignments = [...prev[field]]; updatedAssignments.splice(index, 1); return { ...prev, [field]: updatedAssignments }; }); }; const validateForm = () => { const newErrors = {}; Object.keys(tempAssignments).forEach((field) => { if (!tempAssignments[field] || tempAssignments[field].length === 0) { newErrors[field] = "At least one faculty must be assigned."; } }); if (!examPeriod.year || !examPeriod.startMonth || !examPeriod.endMonth) { newErrors.examPeriod = "Exam period is required."; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e) => { e.preventDefault(); if (validateForm()) { try { const groupedTasks = {}; const academicYear = course?.academicYear || examPeriod.year; Object.entries(tempAssignments).forEach(([field, facultyList]) => { facultyList.forEach((faculty) => { const assignedFaculty = options.faculties.find( (optionFaculty) => optionFaculty.facultyId === faculty.facultyId ); if (assignedFaculty) { if (!groupedTasks[assignedFaculty.facultyId]) { groupedTasks[assignedFaculty.facultyId] = { facultyId: assignedFaculty.facultyId, courseId: course?.courseId || id, tasks: [], examPeriod: `${examPeriod.startMonth} - ${examPeriod.endMonth}`, academicYear, }; } groupedTasks[assignedFaculty.facultyId].tasks.push(field); } }); }); const payload = Object.values(groupedTasks); // Start loading so user knows it is saving setLoading(true); await saveAppointment(payload); // await updateCourseStatus(course?.courseId || id); const filteredCourses = JSON.parse(localStorage.getItem("filteredCourses")) || []; navigate("/courses", { state: { courses: filteredCourses, academicYear: academicYear, }, }); } catch (error) { console.error("Failed to save appointment:", error); // If error comes, stop the loading setLoading(false); } } }; return ( <>

Course Info

{errors.examPeriod && ( {errors.examPeriod} )}
{[ { name: "oralsPracticals", label: "Orals/Practicals" }, { name: "assessment", label: "Assessment" }, { name: "reassessment", label: "Reassessment" }, { name: "paperSetting", label: "Paper Setting" }, { name: "moderation", label: "Moderation" }, { name: "pwdPaperSetter", label: "PwD Paper Setter" }, ].map(({ name, label }) => (
{tempAssignments[name].length > 0 && (
    {tempAssignments[name].map((faculty, index) => (
  • {faculty.name}
  • ))}
)} {errors[name] && ( {errors[name]} )}
))}
); }; export default CourseForm;