import React, { ReactNode } from 'react' import { BaseTestComponent, BaseTestComponentProps } from './BaseTestComponent' /** * 測驗容器元件 - 提供統一的測驗布局結構 * 整合導航控制和進度顯示 */ export interface TestContainerProps extends Omit { // 測驗內容區域 contentArea: ReactNode // 答題區域 answerArea?: ReactNode // 結果顯示區域 resultArea?: ReactNode // 導航控制(預留給未來的NavigationController) navigationArea?: ReactNode // 布局配置 layout?: 'standard' | 'split' | 'fullscreen' // 自定義樣式 contentClassName?: string answerClassName?: string resultClassName?: string } export const TestContainer: React.FC = ({ contentArea, answerArea, resultArea, navigationArea, layout = 'standard', contentClassName = '', answerClassName = '', resultClassName = '', ...baseProps }) => { const getLayoutClasses = () => { switch (layout) { case 'split': return 'lg:grid lg:grid-cols-2 lg:gap-8' case 'fullscreen': return 'min-h-screen flex flex-col' default: return 'space-y-6' } } const renderContent = () => (
{/* 內容展示區域 */}
{contentArea}
{/* 答題互動區域 */} {answerArea && (
{answerArea}
)} {/* 結果展示區域 */} {resultArea && (
{resultArea}
)} {/* 導航控制區域 */} {navigationArea && (
{navigationArea}
)}
) return ( {renderContent()} ) } /** * 專用於不同測驗類型的容器變體 */ // 選擇題容器 export interface ChoiceTestContainerProps extends Omit { questionArea: ReactNode optionsArea: ReactNode } export const ChoiceTestContainer: React.FC = ({ questionArea, optionsArea, resultArea, navigationArea, ...props }) => { return (
{questionArea}
{optionsArea}
} resultArea={resultArea} navigationArea={navigationArea} /> ) } // 填空題容器 export interface FillTestContainerProps extends Omit { sentenceArea: ReactNode inputArea: ReactNode } export const FillTestContainer: React.FC = ({ sentenceArea, inputArea, resultArea, navigationArea, ...props }) => { return ( ) } // 聽力測驗容器 export interface ListeningTestContainerProps extends Omit { audioArea: ReactNode questionArea: ReactNode answerArea: ReactNode } export const ListeningTestContainer: React.FC = ({ audioArea, questionArea, answerArea, resultArea, navigationArea, ...props }) => { return (
{audioArea}
{questionArea}
} answerArea={answerArea} resultArea={resultArea} navigationArea={navigationArea} /> ) } // 口說測驗容器 export interface SpeakingTestContainerProps extends Omit { promptArea: ReactNode recordingArea: ReactNode } export const SpeakingTestContainer: React.FC = ({ promptArea, recordingArea, resultArea, navigationArea, ...props }) => { return ( ) } // 翻卡測驗容器 export interface FlipTestContainerProps extends Omit { cardArea: ReactNode confidenceArea: ReactNode } export const FlipTestContainer: React.FC = ({ cardArea, confidenceArea, navigationArea, ...props }) => { return ( ) }