import React, { useState, useEffect, useCallback, memo } from 'react' import { ReorderTestProps } from '@/types/review' import { TestResultDisplay, TestContainer } from '@/components/review/shared' interface SentenceReorderTestProps extends ReorderTestProps { exampleImage?: string onImageClick?: (image: string) => void } const SentenceReorderTestComponent: React.FC = ({ cardData, exampleImage, onAnswer, onReportError, onImageClick, disabled = false }) => { const [shuffledWords, setShuffledWords] = useState([]) const [arrangedWords, setArrangedWords] = useState([]) const [showResult, setShowResult] = useState(false) const [reorderResult, setReorderResult] = useState(null) // 判斷是否已答題(完成重組後設定 hasAnswered = true) const hasAnswered = showResult // 初始化單字順序 useEffect(() => { const words = cardData.example.split(/\s+/).filter(word => word.length > 0) const shuffled = [...words].sort(() => Math.random() - 0.5) setShuffledWords(shuffled) setArrangedWords([]) }, [cardData.example]) const handleWordClick = useCallback((word: string) => { if (disabled || showResult) return setShuffledWords(prev => prev.filter(w => w !== word)) setArrangedWords(prev => [...prev, word]) }, [disabled, showResult]) const handleRemoveFromArranged = useCallback((word: string) => { if (disabled || showResult) return setArrangedWords(prev => prev.filter(w => w !== word)) setShuffledWords(prev => [...prev, word]) }, [disabled, showResult]) const handleCheckAnswer = useCallback(() => { if (disabled || showResult || arrangedWords.length === 0) return const userSentence = arrangedWords.join(' ') const isCorrect = userSentence.toLowerCase().trim() === cardData.example.toLowerCase().trim() setReorderResult(isCorrect) setShowResult(true) onAnswer(userSentence) }, [disabled, showResult, arrangedWords, cardData.example, onAnswer]) const handleReset = useCallback(() => { if (disabled || showResult) return const words = cardData.example.split(/\s+/).filter(word => word.length > 0) const shuffled = [...words].sort(() => Math.random() - 0.5) setShuffledWords(shuffled) setArrangedWords([]) setReorderResult(null) }, [disabled, showResult, cardData.example]) // 主要內容區域 const contentArea = (
{/* 圖片區(如果有) */} {exampleImage && (
Example illustration onImageClick?.(exampleImage)} />
)} {/* 指示文字 */}

點擊下方單字,依序重組成正確的句子:

{/* 重組區域 */}

重組區域:

{arrangedWords.length === 0 ? (
請嘗試組成完整句子
) : (
{arrangedWords.map((word, index) => (
handleRemoveFromArranged(word)} > {word} ×
))}
)}
) // 答題區域 const answerArea = (
{/* 可用單字區域 */}

可用單字:

{shuffledWords.length === 0 ? (
所有單字都已使用
) : (
{shuffledWords.map((word, index) => ( ))}
)}
{/* 控制按鈕 */}
{arrangedWords.length > 0 && !showResult && ( )}
) // 結果顯示區域 const resultArea = showResult && reorderResult !== null ? ( ) : null return ( ) } export const SentenceReorderTest = memo(SentenceReorderTestComponent) SentenceReorderTest.displayName = 'SentenceReorderTest'