import { useEffect, useState } from "react" import { useForm } from "react-hook-form" import { z } from "zod/v4" import { zodResolver } from "@hookform/resolvers/zod" import { useNavigate } from "react-router" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Separator } from "@/components/ui/separator" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { DistractorEditor } from "@/components/question/DistractorEditor" import { KnowledgeCardFields } from "@/components/question/KnowledgeCardFields" import { fetchCategories } from "@/lib/api/category-api" import { DIFFICULTY_LABELS, QUESTION_STATUSES } from "@/lib/constants" import type { Question, Difficulty, QuestionStatus } from "@/types/question" import type { Category } from "@/types/category" const questionSchema = z.object({ stem: z.string().min(1, "请输入题干").max(500), correctAnswer: z.string().min(1, "请输入正确答案"), distractors: z .array(z.string().min(1, "干扰项不能为空")) .min(4, "至少 4 个干扰项") .max(6, "最多 6 个干扰项"), categoryId: z.string().min(1, "请选择分类"), difficulty: z.number().min(1).max(5), status: z.enum(["draft", "reviewing", "published", "archived"]), knowledgeCardBasic: z.string().min(1, "请填写基础知识卡").max(100), knowledgeCardDeep: z.string().max(300).optional(), sourceRef: z.string().max(500).optional(), }) type FormValues = z.infer interface QuestionFormProps { question?: Question } export function QuestionForm({ question }: QuestionFormProps) { const navigate = useNavigate() const isEditing = !!question const [submitting, setSubmitting] = useState(false) const [categories, setCategories] = useState([]) const { register, handleSubmit, formState: { errors }, setValue, watch, } = useForm({ resolver: zodResolver(questionSchema), defaultValues: question ? { stem: question.stem, correctAnswer: question.correctAnswer, distractors: question.distractors, categoryId: question.categoryId, difficulty: question.difficulty, status: question.status, knowledgeCardBasic: question.knowledgeCardBasic, knowledgeCardDeep: question.knowledgeCardDeep ?? "", sourceRef: question.sourceRef ?? "", } : { stem: "", correctAnswer: "", distractors: ["", "", "", ""], categoryId: "", difficulty: 3, status: "draft", knowledgeCardBasic: "", knowledgeCardDeep: "", sourceRef: "", }, }) useEffect(() => { fetchCategories({ limit: 100 }).then((res) => setCategories(res.data)) }, []) async function onSubmit(data: FormValues) { setSubmitting(true) try { // TODO: 接入 API console.log("submit", isEditing ? "update" : "create", data) navigate("/questions") } finally { setSubmitting(false) } } const distractorsValue = watch("distractors") return (
{/* 题干 */}