Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
forbidals
/
student_panel
/
src
/
components
/
hooks
:
useElectiveSubjects-20260606084608.ts
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
import { useState, useEffect } from 'react'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { getClassSubjects, selectElectiveSubjects, getStudentSubjects, GetClassSubjectsResponse, GetSubjectsResponse, SelectElectiveSubjectsRequest, } from '@/lib/api/student/functions'; export function useElectiveSubjects() { const [showModal, setShowModal] = useState(false); const [hasCheckedElectives, setHasCheckedElectives] = useState(false); const queryClient = useQueryClient(); // Fetch class subjects data (for showing available elective groups) const { data: classSubjectsData, isLoading: classSubjectsLoading, error: classSubjectsError, } = useQuery({ queryKey: ['class-subjects'], queryFn: getClassSubjects, staleTime: 5 * 60 * 1000, // 5 minutes }); // Fetch student subjects data (to check if student has already selected) const { data: studentSubjectsData, isLoading: studentSubjectsLoading, error: studentSubjectsError, } = useQuery({ queryKey: ['student-subjects'], queryFn: getStudentSubjects, staleTime: 5 * 60 * 1000, // 5 minutes }); // Check if elective subjects modal should be shown useEffect(() => { if (classSubjectsData && studentSubjectsData && !hasCheckedElectives) { const classResponse = classSubjectsData as GetClassSubjectsResponse; const studentResponse = studentSubjectsData as GetSubjectsResponse; const electiveGroups = classResponse.data?.elective_subject_group; const studentElectiveSubjects = studentResponse.elective_subjects; const electiveKeyExists = studentResponse.elective_key_exists; // Case 1: Key Does NOT Exist - no popup needed // If the elective_subject key is missing, assume no elective subjects in class if (!electiveKeyExists) { setShowModal(false); setHasCheckedElectives(true); return; } // Case 2: Key EXISTS, Value is EMPTY Array - show popup // Student hasn't selected elective subjects yet if ( studentElectiveSubjects && studentElectiveSubjects.length === 0 ) { setShowModal(true); setHasCheckedElectives(true); return; } // Case 3: Key EXISTS, Value Has Data // Check if student has selected the REQUIRED number of subjects for EACH group let allRequirementsMet = true; if (electiveGroups && Array.isArray(electiveGroups)) { electiveGroups.forEach((group) => { // Count how many subjects student selected for this group const selectedForGroup = studentElectiveSubjects?.filter( (subj) => subj.elective_subject_group_id === group.id ).length || 0; // If selected count is less than required, requirement is NOT met if (selectedForGroup < group.total_selectable_subjects) { allRequirementsMet = false; } }); } // If requirements are NOT met (i.e. need to select more), SHOW modal if (!allRequirementsMet) { setShowModal(true); setHasCheckedElectives(true); return; } // If all requirements met, hide modal setShowModal(false); setHasCheckedElectives(true); return; } }, [classSubjectsData, studentSubjectsData, hasCheckedElectives]); // Handle saving elective subject selections const handleSaveElectiveSubjects = async (selectedSubjects: { [groupId: number]: number[]; }) => { try { // Transform the selected subjects into the API format const subjectGroups: SelectElectiveSubjectsRequest['subject_group'] = Object.entries(selectedSubjects).map(([groupId, subjectIds]) => ({ id: parseInt(groupId), class_subject_id: subjectIds, })); // Call the API to save selections const response = await selectElectiveSubjects({ subject_group: subjectGroups, }); if (response.success) { setShowModal(false); // Invalidate the student subjects query to refresh the data queryClient.invalidateQueries({ queryKey: ['student-subjects'] }); // You might want to show a success message here // toast.success('Elective subjects saved successfully!'); } else { // Handle error - maybe show an error toast // toast.error('Failed to save elective subjects. Please try again.'); } } catch (error) { // Handle error - maybe show an error toast console.error('Error saving elective subjects:', error); // toast.error('An error occurred while saving your selections. Please try again.'); } }; return { showModal, setShowModal, electiveSubjectGroups: classSubjectsData?.data?.elective_subject_group || [], isLoading: classSubjectsLoading || studentSubjectsLoading, error: classSubjectsError || studentSubjectsError, handleSaveElectiveSubjects, }; }