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;