'use client' import { useState, useEffect } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { ProtectedRoute } from '@/components/shared/ProtectedRoute' import { Navigation } from '@/components/shared/Navigation' import { FlashcardForm } from '@/components/flashcards/FlashcardForm' import { useToast } from '@/components/shared/Toast' import { flashcardsService, type Flashcard } from '@/lib/services/flashcards' import { useFlashcardSearch } from '@/hooks/flashcards/useFlashcardSearch' import { useFlashcardImageGeneration } from '@/hooks/flashcards/useFlashcardImageGeneration' import { useFlashcardOperations } from '@/hooks/flashcards/useFlashcardOperations' import { SearchControls } from '@/components/flashcards/SearchControls' import { SearchResults as FlashcardSearchResults } from '@/components/flashcards/SearchResults' import { PaginationControls as SharedPaginationControls } from '@/components/shared/PaginationControls' import { getCEFRColor } from '@/lib/utils/flashcardUtils' // 重構後的FlashcardsContent組件 function FlashcardsContent({ showForm, setShowForm }: { showForm: boolean; setShowForm: (show: boolean) => void }) { const router = useRouter() const toast = useToast() const [activeTab, setActiveTab] = useState<'all-cards' | 'favorites'>('all-cards') const [showAdvancedSearch, setShowAdvancedSearch] = useState(false) const [totalCounts, setTotalCounts] = useState({ all: 0, favorites: 0 }) // 使用新的搜尋Hook const [searchState, searchActions] = useFlashcardSearch(activeTab) // 使用新的圖片生成Hook const { generatingCards, generationProgress, generateImage } = useFlashcardImageGeneration() // 使用新的操作Hook const { handleEdit, handleDelete, handleToggleFavorite } = useFlashcardOperations() // 例句圖片邏輯 - 使用 API 資料 const getExampleImage = (card: Flashcard): string | null => { return card.primaryImageUrl || null } // 檢查詞彙是否有例句圖片 - 使用 API 資料 const hasExampleImage = (card: Flashcard): boolean => { return card.hasExampleImage } // 圖片生成處理函數 const handleGenerateExampleImage = async (card: Flashcard) => { await generateImage(card, async () => { await searchActions.refetch() await loadTotalCounts() }) } // 初始化數據載入 useEffect(() => { loadTotalCounts() }, []) // 載入總數統計 const loadTotalCounts = async () => { try { // 載入所有詞卡數量 const allResult = await flashcardsService.getFlashcards() const allCount = allResult.success && allResult.data ? allResult.data.count : 0 // 載入收藏詞卡數量 const favoritesResult = await flashcardsService.getFlashcards(undefined, true) const favoritesCount = favoritesResult.success && favoritesResult.data ? favoritesResult.data.count : 0 setTotalCounts({ all: allCount, favorites: favoritesCount }) } catch (err) { console.error('載入統計失敗:', err) } } // 操作處理函數 const handleEditCard = (card: Flashcard) => { handleEdit(card) } const handleDeleteCard = async (card: Flashcard) => { await handleDelete(card, async () => { await searchActions.refetch() await loadTotalCounts() }) } const handleToggleFavoriteCard = async (card: Flashcard) => { await handleToggleFavorite(card, async () => { await searchActions.refetch() await loadTotalCounts() }) } // 搜尋結果高亮函數 const highlightSearchTerm = (text: string, searchTerm: string) => { if (!searchTerm || !text) return text const regex = new RegExp(`(${searchTerm.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')})`, 'gi') const parts = text.split(regex) return parts.map((part, index) => regex.test(part) ? ( {part} ) : ( part ) ) } // 載入狀態處理 if (searchState.loading && searchState.isInitialLoad) { return (
載入中...
) } if (searchState.error) { return (
{searchState.error}
) } return (
{/* Navigation */} {/* Main Content */}
{/* Page Header */}

我的詞卡

AI 生成詞卡
{/* Tabs */}
{/* Search Controls */} {/* 詞卡數目統計 */}

共 {searchState.pagination.totalCount} 個詞卡 {searchState.pagination.totalPages > 1 && ( (第 {searchState.pagination.currentPage} 頁,顯示 {searchState.flashcards.length} 個) )}

{/* Search Results */} {/* Pagination Controls */}
{/* Toast */}
) } export default function FlashcardsPage() { const [showForm, setShowForm] = useState(false) return ( {/* 全域模態框 - 在最外層 */} {showForm && (
setShowForm(false)} >
e.stopPropagation()} >

新增詞卡

{ console.log('詞卡創建成功'); setShowForm(false); // TODO: 刷新詞卡列表 }} onCancel={() => setShowForm(false)} />
)}
) }