import React, { useState, useCallback, ReactNode } from 'react' import { ErrorReportButton, TestHeader } from '@/components/review/shared' import { BaseReviewProps } from '@/types/review' /** * 基礎測驗元件 - 提供所有測驗元件的共用功能 * 包含:標題、錯誤回報、測驗狀態管理、統一布局結構 */ export interface BaseTestComponentProps extends BaseReviewProps { testTitle: string instructions?: string children: ReactNode showResult?: boolean resultContent?: ReactNode className?: string } interface TestState { hasAnswered: boolean userAnswer: string | null showResult: boolean } export const BaseTestComponent: React.FC = ({ cardData, testTitle, instructions, children, showResult = false, resultContent, onReportError, disabled = false, className = '' }) => { const [testState, setTestState] = useState({ hasAnswered: false, userAnswer: null, showResult: false }) // 更新測驗狀態 const updateTestState = useCallback((updates: Partial) => { setTestState(prev => ({ ...prev, ...updates })) }, []) // 提供給子元件的狀態和方法 const testContext = { testState, updateTestState, cardData, disabled: disabled || testState.showResult } return (
{/* 錯誤回報按鈕 */}
{/* 主要測驗容器 */}
{/* 測驗標題 */} {/* 說明文字 */} {instructions && (

{instructions}

)} {/* 測驗內容區域 */}
{React.cloneElement(children as React.ReactElement, { testContext })}
{/* 結果顯示區域 */} {(showResult || testState.showResult) && resultContent && (
{resultContent}
)}
) } /** * Hook for managing test answer state * 提供測驗答題狀態管理的標準化邏輯 */ export const useTestAnswer = (onAnswer: (answer: string) => void) => { const [selectedAnswer, setSelectedAnswer] = useState(null) const [showResult, setShowResult] = useState(false) const handleAnswer = useCallback((answer: string) => { if (showResult) return setSelectedAnswer(answer) setShowResult(true) onAnswer(answer) }, [showResult, onAnswer]) const resetAnswer = useCallback(() => { setSelectedAnswer(null) setShowResult(false) }, []) return { selectedAnswer, showResult, handleAnswer, resetAnswer } } /** * Navigation integration types * 為後續的導航系統整合做準備 */ export interface TestNavigationState { status: 'unanswered' | 'answered' | 'skipped' canSkip: boolean canContinue: boolean } export interface TestNavigationProps { navigationState: TestNavigationState onSkip?: () => void onContinue?: () => void }