"use client" import { useEffect, useMemo, useState } from "react" import { useRouter } from "next/navigation" import { Clock, MapPin, MoreHorizontal, Pencil, Plus, Trash2 } from "lucide-react" import { toast } from "sonner" import { Card, CardContent, CardHeader, CardTitle } from "@/shared/components/ui/card" import { Badge } from "@/shared/components/ui/badge" import { cn } from "@/shared/lib/utils" import { Button } from "@/shared/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/shared/components/ui/dropdown-menu" import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/shared/components/ui/alert-dialog" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/shared/components/ui/dialog" import { Input } from "@/shared/components/ui/input" import { Label } from "@/shared/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/shared/components/ui/select" import type { ClassScheduleItem, TeacherClass } from "../types" import { createClassScheduleItemAction, deleteClassScheduleItemAction, updateClassScheduleItemAction, } from "../actions" const WEEKDAYS: Array<{ key: ClassScheduleItem["weekday"]; label: string }> = [ { key: 1, label: "Mon" }, { key: 2, label: "Tue" }, { key: 3, label: "Wed" }, { key: 4, label: "Thu" }, { key: 5, label: "Fri" }, { key: 6, label: "Sat" }, { key: 7, label: "Sun" }, ] export function ScheduleView({ schedule, classes, }: { schedule: ClassScheduleItem[] classes: TeacherClass[] }) { const router = useRouter() const [isWorking, setIsWorking] = useState(false) const [editItem, setEditItem] = useState(null) const [deleteItem, setDeleteItem] = useState(null) const [createWeekday, setCreateWeekday] = useState(1) const [createOpen, setCreateOpen] = useState(false) const [createClassId, setCreateClassId] = useState("") const [editClassId, setEditClassId] = useState("") const [editWeekday, setEditWeekday] = useState("1") const classNameById = useMemo(() => new Map(classes.map((c) => [c.id, c.name] as const)), [classes]) const defaultClassId = useMemo(() => classes[0]?.id ?? "", [classes]) useEffect(() => { if (!editItem) return setEditClassId(editItem.classId) setEditWeekday(String(editItem.weekday)) }, [editItem]) useEffect(() => { if (!createOpen) return setCreateClassId(defaultClassId) }, [createOpen, defaultClassId]) const byDay = new Map() for (const d of WEEKDAYS) byDay.set(d.key, []) for (const item of schedule) byDay.get(item.weekday)?.push(item) const handleCreate = async (formData: FormData) => { setIsWorking(true) try { formData.set("classId", createClassId || defaultClassId) formData.set("weekday", String(createWeekday)) const res = await createClassScheduleItemAction(null, formData) if (res.success) { toast.success(res.message) setCreateOpen(false) router.refresh() } else { toast.error(res.message || "Failed to create schedule item") } } catch { toast.error("Failed to create schedule item") } finally { setIsWorking(false) } } const handleUpdate = async (formData: FormData) => { if (!editItem) return setIsWorking(true) try { formData.set("classId", editClassId) formData.set("weekday", editWeekday) const res = await updateClassScheduleItemAction(editItem.id, null, formData) if (res.success) { toast.success(res.message) setEditItem(null) router.refresh() } else { toast.error(res.message || "Failed to update schedule item") } } catch { toast.error("Failed to update schedule item") } finally { setIsWorking(false) } } const handleDelete = async () => { if (!deleteItem) return setIsWorking(true) try { const res = await deleteClassScheduleItemAction(deleteItem.id) if (res.success) { toast.success(res.message) setDeleteItem(null) router.refresh() } else { toast.error(res.message || "Failed to delete schedule item") } } catch { toast.error("Failed to delete schedule item") } finally { setIsWorking(false) } } return (
{WEEKDAYS.map((d) => { const items = byDay.get(d.key) ?? [] return (
{d.label} {items.length} items
{items.length === 0 ? (
No classes scheduled.
) : (
{items.map((item) => (
{item.course}
{classNameById.get(item.classId) ?? "Class"} setEditItem(item)}> Edit setDeleteItem(item)} > Delete
{item.startTime}–{item.endTime} {item.location ? ( {item.location} ) : null}
))}
)}
) })} { if (isWorking) return setCreateOpen(v) }} > Add schedule item Create a class schedule entry.
w.key === createWeekday)?.label ?? ""} readOnly className="col-span-3" />
{ if (isWorking) return if (!v) setEditItem(null) }} > Edit schedule item Update this schedule entry. {editItem ? (
) : null}
{ if (isWorking) return if (!v) setDeleteItem(null) }} > Delete schedule item? {deleteItem ? ( <> This will permanently delete {deleteItem.course}{" "} ({deleteItem.startTime}–{deleteItem.endTime}). ) : null} Cancel {isWorking ? "Deleting..." : "Delete"}
) }