"use client" import { useMemo, useState } from "react" import { useFormStatus } from "react-dom" import { toast } from "sonner" import { useRouter } from "next/navigation" import { useSearchParams } from "next/navigation" import { useTranslations } from "next-intl" import { FileText, FileQuestion } from "lucide-react" import { Card, CardContent, CardFooter, CardHeader, CardTitle } from "@/shared/components/ui/card" import { Button } from "@/shared/components/ui/button" 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 { Textarea } from "@/shared/components/ui/textarea" import { cn } from "@/shared/lib/utils" import { createHomeworkAssignmentAction } from "../actions" import type { TeacherClass } from "@/modules/classes/types" type ExamOption = { id: string; title: string } function SubmitButton() { const { pending } = useFormStatus() const t = useTranslations("examHomework") return ( {pending ? t("homework.form.submitting") : t("homework.form.submit")} ) } export function HomeworkAssignmentForm({ exams, classes }: { exams: ExamOption[]; classes: TeacherClass[] }) { const router = useRouter() const searchParams = useSearchParams() const t = useTranslations("examHomework") const [mode, setMode] = useState<"exam" | "quick">(exams.length > 0 ? "exam" : "quick") const initialExamId = useMemo(() => exams[0]?.id ?? "", [exams]) const [examId, setExamId] = useState(initialExamId) const initialClassId = useMemo(() => { const fromQuery = searchParams.get("classId") || "" if (fromQuery && classes.some((c) => c.id === fromQuery)) return fromQuery return classes[0]?.id ?? "" }, [classes, searchParams]) const [classId, setClassId] = useState(initialClassId) const [allowLate, setAllowLate] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const handleSubmit = async (formData: FormData) => { if (mode === "exam" && !examId) { toast.error(t("homework.form.selectExamRequired")) return } if (mode === "quick" && !formData.get("title")) { toast.error(t("homework.form.titleRequired")) return } if (!classId) { toast.error(t("homework.form.selectClassRequired")) return } if (mode === "exam") { formData.set("sourceExamId", examId) } else { formData.delete("sourceExamId") } formData.set("classId", classId) formData.set("allowLate", allowLate ? "true" : "false") formData.set("publish", "true") setIsSubmitting(true) const result = await createHomeworkAssignmentAction(null, formData) setIsSubmitting(false) if (result.success) { toast.success(result.message) router.push("/teacher/homework/assignments") } else { toast.error(result.message || t("homework.form.createFailed")) } } return ( {isSubmitting && ( {t("homework.form.creating")} )} {t("homework.form.createTitle")} {/* 模式切换 */} setMode("quick")} className={cn( "flex items-center gap-2 rounded-md border p-3 text-left transition-colors", mode === "quick" ? "border-primary bg-primary/5 text-primary" : "border-border hover:bg-muted/50" )} > {t("homework.form.quickMode")} {t("homework.form.quickModeDescription")} setMode("exam")} disabled={exams.length === 0} className={cn( "flex items-center gap-2 rounded-md border p-3 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-50", mode === "exam" ? "border-primary bg-primary/5 text-primary" : "border-border hover:bg-muted/50" )} > {t("homework.form.examMode")} {t("homework.form.examModeDescription")} {t("homework.form.class")} {classes.map((c) => ( {c.name} ))} {mode === "exam" && ( {t("homework.form.sourceExam")} {exams.map((e) => ( {e.title} ))} )} {t("homework.form.assignmentTitle")} {mode === "quick" && *} {t("homework.form.description")} {t("homework.form.availableAt")} {t("homework.form.dueAt")} setAllowLate(e.target.checked)} /> {t("homework.form.allowLate")} {t("homework.form.lateDueAt")} {t("homework.form.maxAttempts")} ) }