import { useEffect, useState } from 'react' import { SingleChoice } from '@/components' import SuccessAlert from '@/components/layout/alert/success-alert' 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, showSuccessAlert = false, successAlertProps, onSuccessContinue, }: SingleChoiceQuizPanelProps) => { const [selectedValue, setSelectedValue] = useState('') const [error, setError] = useState('') const [successAlertVisible, setSuccessAlertVisible] = useState(false) // 当窗口关闭时,重置内部状态 useEffect(() => { if (!visible) { setSelectedValue('') setError('') setSuccessAlertVisible(false) } }, [visible]) // 当成功弹窗显示时,隐藏题目面板,避免双层遮罩叠加 const shouldRenderQuizPanel = visible && !successAlertVisible if (!visible) return null // 约定:显式开启,或传入 title/content 任一文案,即启用答对成功弹窗 const hasSuccessAlertCopy = Boolean(successAlertProps?.title) || Boolean(successAlertProps?.content) const shouldShowSuccessAlert = showSuccessAlert || hasSuccessAlertCopy const handleSuccessContinue = () => { setSuccessAlertVisible(false) onSuccessContinue?.() } // 处理选项点击 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) if (shouldShowSuccessAlert) { setSuccessAlertVisible(true) } } else { // 答题失败:清空状态,执行 onError,允许重新选择 setSelectedValue('') const customError = onWrongSelect?.(value) const errorMsg = customError || errorMessage || '很抱歉,你选错了!请你再思考一下吧!' setError(errorMsg) onError?.(errorMsg) } } else { // 没有提供正确答案,直接提交 setSelectedValue('') setError('') onSubmit?.(value, true) } } return ( <> {shouldRenderQuizPanel && (
{/* 题干卡片 */}
{title}
{/* 答案反馈 */} {error &&
{error}
}
{/* 选项区域 */}
(
handleOptionClick(option.value)} >
{option.label}
)} />
)} {shouldShowSuccessAlert && ( )} ) } export default SingleChoiceQuizPanel