diff --git a/frontend/app/learn/page.tsx b/frontend/app/learn/page.tsx index 29a19af..f205241 100644 --- a/frontend/app/learn/page.tsx +++ b/frontend/app/learn/page.tsx @@ -111,13 +111,16 @@ export default function LearnPage() { const loadDueCards = async () => { try { setIsLoadingCard(true) + console.log('🔍 開始載入到期詞卡...'); // 完全使用後端API數據 const apiResult = await flashcardsService.getDueFlashcards(50); + console.log('📡 API回應結果:', apiResult); if (apiResult.success && apiResult.data && apiResult.data.length > 0) { const cardsToUse = apiResult.data; - console.log('載入後端API數據:', cardsToUse.length, '張詞卡'); + console.log('✅ 載入後端API數據成功:', cardsToUse.length, '張詞卡'); + console.log('📋 詞卡列表:', cardsToUse.map(c => c.word)); setDueCards(cardsToUse); @@ -131,19 +134,25 @@ export default function LearnPage() { setMode(selectedMode); setIsAutoSelecting(false); - console.log(`初始載入: ${firstCard.word}, 選擇模式: ${selectedMode}`); + console.log(`🎯 初始載入: ${firstCard.word}, 選擇模式: ${selectedMode}`); } else { // 沒有到期詞卡 - console.log('沒有到期的詞卡'); + console.log('❌ API回應:', { + success: apiResult.success, + dataExists: !!apiResult.data, + dataLength: apiResult.data?.length, + error: apiResult.error + }); setDueCards([]); setCurrentCard(null); setShowNoDueCards(true); } } catch (error) { - console.error('載入到期詞卡失敗:', error); + console.error('💥 載入到期詞卡失敗:', error); setDueCards([]); setCurrentCard(null); + setShowNoDueCards(true); } finally { setIsLoadingCard(false); } @@ -799,6 +808,39 @@ export default function LearnPage() { + {/* 當前選擇突出顯示 */} +
+
+
+ {currentCard && (() => { + const userCEFR = localStorage.getItem('userEnglishLevel') || 'A2'; + const wordCEFR = currentCard.difficultyLevel || 'A2'; + const context = getCurrentContext(userCEFR, wordCEFR); + const contextData = generateContextTable(userCEFR, wordCEFR).find(c => c.isCurrent); + + return ( + <> +
+ + 當前情境: {contextData?.icon} {context} + +
+ 可用題型: {contextData?.reviewTypes.join(' | ')} +
+
+ + ); + })()} +
+
+
系統已選擇
+
+ {getModeIcon(mode)} + {getModeLabel(mode)} +
+
+
+
{/* 完整四情境對照表 */}
diff --git a/frontend/lib/services/flashcards.ts b/frontend/lib/services/flashcards.ts index 243b90b..8faf3cf 100644 --- a/frontend/lib/services/flashcards.ts +++ b/frontend/lib/services/flashcards.ts @@ -179,8 +179,19 @@ class FlashcardsService { async getDueFlashcards(limit = 50): Promise> { try { - const today = new Date().toISOString().split('T')[0]; - const response = await this.makeRequest<{ success: boolean; data: any[]; count: number }>(`/flashcards/due?date=${today}&limit=${limit}`); + console.log('🚀 API調用開始:', `/flashcards/due?limit=${limit}`); + + const response = await this.makeRequest<{ success: boolean; data: any[]; count: number }>(`/flashcards/due?limit=${limit}`); + console.log('🔍 makeRequest回應:', response); + console.log('📊 response.data類型:', typeof response.data, '長度:', response.data?.length); + + if (!response.data || !Array.isArray(response.data)) { + console.log('❌ response.data不是數組:', response.data); + return { + success: false, + error: 'Invalid response data format', + }; + } // 轉換後端格式為前端期望格式 const flashcards = response.data.map((card: any) => ({ @@ -213,12 +224,14 @@ class FlashcardsService { primaryImageUrl: card.primaryImageUrl })); + console.log('✅ 數據轉換完成:', flashcards.length, '張詞卡'); + return { success: true, data: flashcards }; } catch (error) { - console.error('API request failed, using fallback:', error); + console.error('💥 API request failed:', error); return { success: false, error: error instanceof Error ? error.message : 'Failed to get due flashcards',