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',