"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 ( ) } 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) try { const result = await createHomeworkAssignmentAction(null, formData) if (result.success) { toast.success(result.message) router.push("/teacher/homework/assignments") } else { toast.error(result.message || t("homework.form.createFailed")) } } catch { toast.error(t("homework.form.createFailed")) } finally { setIsSubmitting(false) } } return ( {isSubmitting && (
{t("homework.form.creating")}
)} {t("homework.form.createTitle")}
{/* 模式切换 */}
{mode === "exam" && (
)}