import React, { useState, useMemo, useCallback, memo } from 'react' import { getCorrectAnswer } from '@/utils/answerExtractor' import { TestResultDisplay, HintPanel, FillTestContainer, TextInput } from '@/components/review/shared' import { FillTestProps } from '@/types/review' interface SentenceFillTestProps extends FillTestProps {} const SentenceFillTestComponent: React.FC = ({ cardData, onAnswer, onReportError, disabled = false }) => { const [fillAnswer, setFillAnswer] = useState('') const [showResult, setShowResult] = useState(false) const [showHint, setShowHint] = useState(false) const handleSubmit = useCallback((answer: string) => { if (disabled || showResult) return setShowResult(true) onAnswer(answer) }, [disabled, showResult, onAnswer]) const handleToggleHint = useCallback(() => { setShowHint(prev => !prev) }, []) // 動態計算正確答案:從例句和挖空題目推導 const correctAnswer = useMemo(() => { return getCorrectAnswer(cardData.example, cardData.filledQuestionText, cardData.word) }, [cardData.example, cardData.filledQuestionText, cardData.word]) const isCorrect = useMemo(() => { return fillAnswer.toLowerCase().trim() === correctAnswer.toLowerCase().trim() }, [fillAnswer, correctAnswer]) // 統一的填空句子渲染邏輯 const renderFilledSentence = useCallback(() => { const text = cardData.filledQuestionText || cardData.example const isUsingFilledText = !!cardData.filledQuestionText if (isUsingFilledText) { // 使用後端提供的挖空題目 const parts = text.split('____') return (
{parts.map((part, index) => ( {part} {index < parts.length - 1 && ( )} ))}
) } else { // 降級處理:使用前端挖空邏輯 const parts = text.split(new RegExp(`\\b${cardData.word}\\b`, 'gi')) const matches = text.match(new RegExp(`\\b${cardData.word}\\b`, 'gi')) || [] return (
{parts.map((part, index) => ( {part} {index < matches.length && ( )} ))}
) } }, [ cardData.filledQuestionText, cardData.example, cardData.word, fillAnswer, handleSubmit, disabled, showResult, isCorrect, correctAnswer ]) // 句子顯示區域 const sentenceArea = (
{/* 圖片區(如果有) */} {cardData.exampleImage && (
Example illustration { // 圖片點擊處理 - 後續可以添加放大功能 }} />
)} {/* 指示文字 */}

請點擊例句中的空白處輸入正確的單字:

{/* 填空句子區域 */}
{renderFilledSentence()}
) // 輸入區域(包含操作按鈕和提示) const inputArea = (
{/* 操作按鈕 */}
{/* 提示區域 */}
) // 結果顯示區域 const resultArea = showResult ? ( ) : null return ( ) } export const SentenceFillTest = memo(SentenceFillTestComponent) SentenceFillTest.displayName = 'SentenceFillTest'