import { useEffect, useRef } from "react"; import { DragFill } from "@/components"; import { cn } from "@/lib/utils"; import type { DragQuizPanelProps } from "./types"; /** 拖拽题面板:使用 DragFill 组件 */ const DragQuizPanel = ({ visible, zIndex = 10000, title, questionPrefix, questionSuffix, options, blanks, blankSeparators, value, error, onChange, }: DragQuizPanelProps) => { // 跟踪之前的 visible 状态 const prevVisibleRef = useRef(visible); // 当窗口关闭时,清除拖拽状态 useEffect(() => { // 如果从可见变为不可见,清除拖拽状态 if (prevVisibleRef.current && !visible && value.length > 0) { onChange([]); } prevVisibleRef.current = visible; // eslint-disable-next-line react-hooks/exhaustive-deps }, [visible]); if (!visible) return null; return (
{/* 题干卡片 */}
{title &&
{title}
}
{questionPrefix && {questionPrefix}} {blanks.map((blank, index) => { const filledResult = value.find((r) => r.blankId === blank.id); const filledValue = filledResult?.optionValue || null; return ( {filledValue ? ( {filledValue} ) : ( ____ )} {index < blanks.length - 1 && ( {blankSeparators && blankSeparators[index] ? blankSeparators[index] : "、"} )} ); })} {questionSuffix && {questionSuffix}} {/* 答案反馈 */} {error && (
{error}
)}
{/* 使用 DragFill 组件 */}
(
{!isUsed && (
)} {option.label}
)} renderBlank={(_blank) => { // 返回一个隐藏元素,实际的空白区域在题干中 // 但需要通过 data-blank-id 让 DragFill 能找到它 return
; }} />
); }; export default DragQuizPanel;