full-stack-school/src/components/FormContainer.tsx
2026-03-01 18:32:49 +00:00

118 lines
3.9 KiB
TypeScript

import { getSupabaseClient } from "@/lib/supabase";
import FormModal from "./FormModal";
import { auth } from "@clerk/nextjs/server";
export type FormContainerProps = {
table:
| "teacher"
| "student"
| "parent"
| "subject"
| "class"
| "lesson"
| "exam"
| "assignment"
| "result"
| "attendance"
| "event"
| "announcement";
type: "create" | "update" | "delete";
data?: any;
id?: number | string;
};
const FormContainer = async ({ table, type, data, id }: FormContainerProps) => {
let relatedData = {};
const { userId, sessionClaims } = auth();
const role = (sessionClaims?.metadata as { role?: string })?.role;
const currentUserId = userId;
if (type !== "delete") {
const supabase = await getSupabaseClient();
switch (table) {
case "subject": {
const { data: subjectTeachers } = await supabase.from("Teacher").select("id, name, surname");
relatedData = { teachers: subjectTeachers };
break;
}
case "class": {
const { data: classGrades } = await supabase.from("Grade").select("id, level");
const { data: classTeachers } = await supabase.from("Teacher").select("id, name, surname");
relatedData = { teachers: classTeachers, grades: classGrades };
break;
}
case "teacher": {
const { data: teacherSubjects } = await supabase.from("Subject").select("id, name");
relatedData = { subjects: teacherSubjects };
break;
}
case "student": {
const { data: studentGrades } = await supabase.from("Grade").select("id, level");
const { data: studentClasses } = await supabase.from("Class").select("*, students:Student(count)");
const classesWithCount = studentClasses?.map(c => ({
...c,
_count: { students: Array.isArray(c.students) ? (c.students as any)[0]?.count || 0 : 0 }
}));
relatedData = { classes: classesWithCount, grades: studentGrades };
break;
}
case "lesson": {
const { data: lessonSubjects } = await supabase.from("Subject").select("id, name");
const { data: lessonClasses } = await supabase.from("Class").select("id, name");
const { data: lessonTeachers } = await supabase.from("Teacher").select("id, name, surname");
relatedData = { subjects: lessonSubjects, classes: lessonClasses, teachers: lessonTeachers };
break;
}
case "assignment": {
const { data: assignmentLessons } = await supabase.from("Lesson").select("id, name");
relatedData = { lessons: assignmentLessons };
break;
}
case "result": {
const { data: resultStudents } = await supabase.from("Student").select("id, name, surname");
const { data: resultExams } = await supabase.from("Exam").select("id, title");
const { data: resultAssignments } = await supabase.from("Assignment").select("id, title");
relatedData = { students: resultStudents, exams: resultExams, assignments: resultAssignments };
break;
}
case "exam": {
let query = supabase.from("Lesson").select("id, name");
if (role === "teacher") {
query = query.eq("teacherId", currentUserId!);
}
const { data: examLessons } = await query;
relatedData = { lessons: examLessons };
break;
}
case "event": {
const { data: eventClasses } = await supabase.from("Class").select("id, name");
relatedData = { classes: eventClasses };
break;
}
case "announcement": {
const { data: announcementClasses } = await supabase.from("Class").select("id, name");
relatedData = { classes: announcementClasses };
break;
}
default:
break;
}
}
return (
<div className="">
<FormModal
table={table}
type={type}
data={data}
id={id}
relatedData={relatedData}
/>
</div>
);
};
export default FormContainer;