import { useState } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { useTeachers, useCreateTeacher } from "@/hooks/queries"; import { api } from "@/lib/api-client"; import { useQueryClient } from "@tanstack/react-query"; import { Search, Plus, Trash2 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; export default function AdminTeachers() { const [search, setSearch] = useState(""); const [addOpen, setAddOpen] = useState(false); const [firstName, setFirstName] = useState(""); const [lastName, setLastName] = useState(""); const [email, setEmail] = useState(""); const [gender, setGender] = useState<"male" | "female">("male"); const [specialization, setSpecialization] = useState(""); const { toast } = useToast(); const qc = useQueryClient(); const { data: teachersData, isLoading } = useTeachers({ size: 500 }); const createTeacher = useCreateTeacher(); const teachers = teachersData?.items ?? []; const filtered = teachers.filter( (t) => t.name.toLowerCase().includes(search.toLowerCase()) || (t.email || "").toLowerCase().includes(search.toLowerCase()), ); const handleAdd = () => { if (!firstName.trim() || !lastName.trim()) { toast({ title: "First and last name required", variant: "destructive" }); return; } if (!email.trim()) { toast({ title: "Email required", variant: "destructive" }); return; } createTeacher.mutate( { first_name: firstName.trim(), last_name: lastName.trim(), email: email.trim().toLowerCase(), gender, specialization: specialization.trim() || undefined, }, { onSuccess: () => { setAddOpen(false); setFirstName(""); setLastName(""); setEmail(""); setGender("male"); setSpecialization(""); toast({ title: "Teacher created" }); }, onError: (e: Error) => { toast({ title: "Could not create teacher", description: e.message, variant: "destructive" }); }, }, ); }; async function handleDelete(id: number, name: string) { if (!window.confirm(`Delete teacher "${name}"?`)) return; try { await api.delete(`/teachers/${id}`); qc.invalidateQueries({ queryKey: ["lms", "teachers"] }); toast({ title: "Teacher deleted" }); } catch (e: unknown) { const msg = e instanceof Error ? e.message : String(e); toast({ title: "Delete failed", description: msg, variant: "destructive" }); } } if (isLoading) { return (
); } return (

Teachers

Manage faculty members.

setSearch(e.target.value)} className="pl-9" />
Teacher Specialization Subjects Department Gender {filtered.map((t) => { const initials = t.name?.split(" ").map((w) => w[0]).join("").slice(0, 2).toUpperCase(); return (
{initials}

{t.name}

{t.email || "—"}

{t.specialization || "—"} {t.subject_names?.length ? t.subject_names.join(", ") : "—"} {t.department_name || "—"} {t.gender || "—"}
); })} {filtered.length === 0 && No teachers found.}
Add Teacher
setFirstName(e.target.value)} />
setLastName(e.target.value)} />
setEmail(e.target.value)} />
setSpecialization(e.target.value)} placeholder="e.g. IELTS Writing" />
); }