import { useEffect, useState } from "react"; import { SingleChoice } from "@/components"; import type { SingleChoiceQuizPanelProps } from "./types"; /** * 单选题面板组件 * * 内部管理选择状态,点击选项后自动提交并验证答案 * * @example * ```tsx * { * console.log("用户选择:", value, "是否正确:", isCorrect); * }} * onError={(error) => { * console.log("错误信息:", error); * }} * /> * ``` */ const SingleChoiceQuizPanel = ({ visible, zIndex = 10000, title, options, correctAnswer, errorMessage, onSubmit, onWrongSelect, onError, disabled = false, }: SingleChoiceQuizPanelProps) => { const [selectedValue, setSelectedValue] = useState(""); const [error, setError] = useState(""); // 当窗口关闭时,重置内部状态 useEffect(() => { if (!visible) { setSelectedValue(""); setError(""); } }, [visible]); if (!visible) return null; // 处理选项点击 const handleOptionClick = (value: string) => { if (disabled) return; setSelectedValue(value); setError(""); // 验证答案 const isCorrect = correctAnswer !== undefined ? value === correctAnswer : undefined; // 如果提供了正确答案,进行验证 if (correctAnswer !== undefined) { if (isCorrect) { // 答题成功:清空状态,执行 onSubmit(外部控制关闭窗口) setSelectedValue(""); setError(""); onSubmit?.(value, true); } else { // 答题失败:清空状态,执行 onError,允许重新选择 setSelectedValue(""); const customError = onWrongSelect?.(value); const errorMsg = customError || errorMessage || "很抱歉,你选错了!请你再思考一下吧!"; setError(errorMsg); onError?.(errorMsg); } } else { // 没有提供正确答案,直接提交 setSelectedValue(""); setError(""); onSubmit?.(value, true); } }; return (
{/* 题干卡片 */}
{title}
{/* 答案反馈 */} {error && (
{error}
)}
{/* 选项区域 */}
(
handleOptionClick(option.value)} >
{option.label}
)} />
); }; export default SingleChoiceQuizPanel;