import React, { useState, useEffect } from "react"; import { useLocation, useParams, useNavigate } from "react-router-dom"; import { fetchFaculties, saveAppointment, updateCourseStatus } from "../api"; import "./CourseForm.css"; const CourseForm = () => { const { id } = useParams(); const location = useLocation(); const navigate = useNavigate(); const { course } = location.state || {}; const [options, setOptions] = useState({ faculties: [], // List of all faculties }); const [suggestions, setSuggestions] = useState({}); // To hold suggestions for each field const [formData, setFormData] = useState({ oralsPracticals: "", assessment: "", reassessment: "", paperSetting: "", moderation: "", pwdPaperSetter: "", }); const [errors, setErrors] = useState({}); // Fetch faculty list on mount useEffect(() => { const fetchOptionsAndFaculties = async () => { try { const facultiesData = await fetchFaculties(); // Fetch faculty names from backend setOptions((prev) => ({ ...prev, faculties: facultiesData })); } catch (error) { console.error("Failed to fetch faculties:", error); } }; fetchOptionsAndFaculties(); }, []); // Handle input changes for form fields const handleInputChange = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); // Filter suggestions for the current field if (options.faculties.length > 0) { const filteredSuggestions = options.faculties.filter((faculty) => faculty.name.toLowerCase().includes(value.toLowerCase()) ); setSuggestions((prev) => ({ ...prev, [name]: filteredSuggestions, })); } }; // Validate the form const validateForm = () => { const newErrors = {}; Object.keys(formData).forEach((field) => { if (!formData[field]) { newErrors[field] = "This field is required"; } }); setErrors(newErrors); return Object.keys(newErrors).length === 0; }; // Handle form submission const handleSubmit = async (e) => { e.preventDefault(); // Prevent default form submission behavior if (validateForm()) { try { const groupedTasks = {}; // Group tasks by facultyId Object.entries(formData).forEach(([field, value]) => { const assignedFaculty = options.faculties.find( (faculty) => faculty.name === value ); if (assignedFaculty) { if (!groupedTasks[assignedFaculty.facultyId]) { groupedTasks[assignedFaculty.facultyId] = { facultyId: assignedFaculty.facultyId, courseId: course?.courseId || id, tasks: [], }; } groupedTasks[assignedFaculty.facultyId].tasks.push(field); } }); const payload = Object.values(groupedTasks); // Convert the grouped tasks into an array console.log("Saving appointment with payload:", payload); await saveAppointment(payload); // Save to backend await updateCourseStatus(course?.courseId || id); console.log("Form submitted successfully:", payload); const filteredCourses = JSON.parse(localStorage.getItem("filteredCourses")) || []; // Redirect to courses page after successful submission navigate("/courses", { state: { courses: filteredCourses, updatedCourse: { ...course, status: "Submitted", }, }, }); } catch (error) { console.error("Failed to save appointment:", error); } } }; return (