'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { Navigation } from '@/components/Navigation' import LearningComplete from '@/components/LearningComplete' // 標準架構:全域組件和 hooks import { ProgressTracker } from '@/components/learn/ProgressTracker' import { TaskListModal } from '@/components/learn/TaskListModal' import { ReviewContainer } from '@/components/learn/ReviewContainer' import { LoadingStates } from '@/components/learn/LoadingStates' import { useReviewSession } from '@/hooks/learn/useReviewSession' import { useTestQueue } from '@/hooks/learn/useTestQueue' import { useProgressTracker } from '@/hooks/learn/useProgressTracker' import { useTestAnswering } from '@/hooks/learn/useTestAnswering' export default function LearnPage() { const router = useRouter() const [mounted, setMounted] = useState(false) // UI 狀態 const [modalImage, setModalImage] = useState(null) const [showReportModal, setShowReportModal] = useState(false) const [reportReason, setReportReason] = useState('') const [reportingCard, setReportingCard] = useState(null) // 使用全域 hooks const reviewSession = useReviewSession() const testQueue = useTestQueue() const progressTracker = useProgressTracker() const testAnswering = useTestAnswering() // 初始化 useEffect(() => { setMounted(true) initializeLearnSession() }, []) // 初始化學習會話 const initializeLearnSession = async () => { await reviewSession.loadDueCards() if (reviewSession.dueCards.length > 0) { const cardIds = reviewSession.dueCards.map(c => c.id) const completedTests = await testQueue.getCompletedTestsForCards(cardIds) testQueue.initializeTestQueue(reviewSession.dueCards, completedTests) if (testQueue.testItems.length > 0) { const firstTestItem = testQueue.testItems[0] const firstCard = reviewSession.dueCards.find(c => c.id === firstTestItem.cardId) if (firstCard) { reviewSession.setCurrentCard(firstCard) reviewSession.setMode(firstTestItem.testType as any) reviewSession.setIsAutoSelecting(false) } } } } // 答題處理 const handleQuizAnswer = async (answer: string) => { if (testAnswering.showResult || !reviewSession.currentCard) return testAnswering.setSelectedAnswer(answer) testAnswering.setShowResult(true) const isCorrect = testAnswering.checkVocabChoice(reviewSession.currentCard.word) progressTracker.updateScore(isCorrect) await testQueue.recordTestResult(isCorrect, answer) } const handleFillAnswer = async () => { if (testAnswering.showResult || !reviewSession.currentCard) return testAnswering.setShowResult(true) const isCorrect = testAnswering.checkSentenceFill(reviewSession.currentCard.word) progressTracker.updateScore(isCorrect) await testQueue.recordTestResult(isCorrect, testAnswering.fillAnswer) } const handleConfidenceLevel = async (level: number) => { if (!reviewSession.currentCard) return testAnswering.setShowResult(true) progressTracker.updateScore(true) await testQueue.recordTestResult(true, undefined, level) } const handleReorderAnswer = async () => { if (!reviewSession.currentCard) return const isCorrect = testAnswering.checkSentenceReorder(reviewSession.currentCard.example) testAnswering.setReorderResult(isCorrect) progressTracker.updateScore(isCorrect) await testQueue.recordTestResult(isCorrect, testAnswering.arrangedWords.join(' ')) } const handleNext = () => { testQueue.loadNextUncompletedTest() testAnswering.resetAllAnsweringStates() if (testQueue.currentTestItemIndex < testQueue.testItems.length) { const nextTestItem = testQueue.testItems[testQueue.currentTestItemIndex] const nextCard = reviewSession.dueCards.find(c => c.id === nextTestItem.cardId) if (nextCard) { reviewSession.setCurrentCard(nextCard) reviewSession.setMode(nextTestItem.testType as any) } } else { reviewSession.setShowComplete(true) } } const handleRestart = async () => { progressTracker.resetScore() testQueue.resetTestQueue() await reviewSession.restart() } // 渲染邏輯 if (!mounted || reviewSession.isLoadingCard) { return } if (reviewSession.showNoDueCards) { return } if (!reviewSession.currentCard) { return } return (
progressTracker.setShowTaskListModal(true)} /> testAnswering.setShowHint(!testAnswering.showHint)} onFlip={() => testAnswering.setIsFlipped(!testAnswering.isFlipped)} onConfidenceLevel={handleConfidenceLevel} onWordClick={testAnswering.addWordToArranged} onRemoveFromArranged={testAnswering.removeWordFromArranged} onCheckReorderAnswer={handleReorderAnswer} onResetReorder={() => testAnswering.resetReorderTest(reviewSession.currentCard?.example || '')} onReportError={() => { setReportingCard(reviewSession.currentCard) setShowReportModal(true) }} onNavigate={(direction) => direction === 'next' ? handleNext() : () => {}} setModalImage={setModalImage} /> progressTracker.setShowTaskListModal(false)} testItems={testQueue.testItems} completedTests={testQueue.completedTests} totalTests={testQueue.totalTests} /> {reviewSession.showComplete && ( router.push('/dashboard')} /> )} {modalImage && (
setModalImage(null)}>
放大圖片
)} {showReportModal && (

回報錯誤

單字:{reportingCard?.word}

)}
) }