import React, { memo, useState } from 'react' import { BluePlayButton } from '@/components/shared/BluePlayButton' /** * 答題動作元件集合 * 提供標準化的使用者互動介面,支援各種答題類型 */ // 選擇題選項元件 interface ChoiceOptionProps { option: string index: number isSelected?: boolean isCorrect?: boolean isIncorrect?: boolean showResult?: boolean onSelect: (option: string) => void disabled?: boolean } export const ChoiceOption: React.FC = memo(({ option, index, isSelected = false, isCorrect = false, isIncorrect = false, showResult = false, onSelect, disabled = false }) => { const getOptionStyles = () => { if (showResult) { if (isCorrect) { return 'border-green-500 bg-green-50 text-green-700' } if (isIncorrect && isSelected) { return 'border-red-500 bg-red-50 text-red-700' } return 'border-gray-200 bg-gray-50 text-gray-500' } if (isSelected) { return 'border-blue-500 bg-blue-50 text-blue-700' } return 'border-gray-200 hover:border-blue-300 hover:bg-blue-50' } return ( ) }) ChoiceOption.displayName = 'ChoiceOption' // 選擇題選項網格 interface ChoiceGridProps { options: string[] selectedOption?: string | null correctAnswer?: string showResult?: boolean onSelect: (option: string) => void disabled?: boolean className?: string } export const ChoiceGrid: React.FC = memo(({ options, selectedOption, correctAnswer, showResult = false, onSelect, disabled = false, className = '' }) => { return (
{options.map((option, index) => ( ))}
) }) ChoiceGrid.displayName = 'ChoiceGrid' // 文字輸入元件 interface TextInputProps { value: string onChange: (value: string) => void onSubmit: (value: string) => void placeholder?: string disabled?: boolean showResult?: boolean isCorrect?: boolean correctAnswer?: string } export const TextInput: React.FC = memo(({ value, onChange, onSubmit, placeholder = '請輸入答案...', disabled = false, showResult = false, isCorrect = false, correctAnswer = '' }) => { const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !disabled && !showResult && value.trim()) { onSubmit(value.trim()) } } const handleSubmit = () => { if (!disabled && !showResult && value.trim()) { onSubmit(value.trim()) } } const getInputStyles = () => { if (showResult) { return isCorrect ? 'border-green-500 bg-green-50' : 'border-red-500 bg-red-50' } return 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' } return (
onChange(e.target.value)} onKeyDown={handleKeyDown} placeholder={placeholder} disabled={disabled || showResult} className={`w-full p-3 border rounded-lg text-lg ${getInputStyles()}`} autoFocus /> {!showResult && ( )}
{showResult && !isCorrect && correctAnswer && (
正確答案:{correctAnswer}
)}
) }) TextInput.displayName = 'TextInput' // 信心度按鈕組 interface ConfidenceLevelProps { selectedLevel?: number | null onSelect: (level: number) => void disabled?: boolean } export const ConfidenceLevel: React.FC = memo(({ selectedLevel, onSelect, disabled = false }) => { const levels = [ { level: 1, label: '完全不熟', color: 'bg-red-500', hoverColor: 'hover:bg-red-600' }, { level: 2, label: '有點印象', color: 'bg-orange-500', hoverColor: 'hover:bg-orange-600' }, { level: 3, label: '還算熟悉', color: 'bg-yellow-500', hoverColor: 'hover:bg-yellow-600' }, { level: 4, label: '很熟悉', color: 'bg-blue-500', hoverColor: 'hover:bg-blue-600' }, { level: 5, label: '完全掌握', color: 'bg-green-500', hoverColor: 'hover:bg-green-600' } ] return (

請評估你對這個單字的熟悉程度:

{levels.map(({ level, label, color, hoverColor }) => ( ))}
) }) ConfidenceLevel.displayName = 'ConfidenceLevel' // 錄音控制元件 interface RecordingControlProps { isRecording: boolean hasRecording: boolean onStartRecording: () => void onStopRecording: () => void onPlayback: () => void onSubmit: () => void disabled?: boolean } export const RecordingControl: React.FC = memo(({ isRecording, hasRecording, onStartRecording, onStopRecording, onPlayback, onSubmit, disabled = false }) => { return (
{/* 錄音按鈕 */} {/* 狀態文字 */}
{isRecording ? (

錄音中... 點擊停止

) : hasRecording ? (

錄音完成

) : (

點擊開始錄音

)}
{/* 控制按鈕 */} {hasRecording && !isRecording && (
播放錄音
)}
) }) RecordingControl.displayName = 'RecordingControl'