'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 { LoadingState } from '@/components/shared/LoadingState'
import { ErrorState } from '@/components/shared/ErrorState'
import { TabNavigation } from '@/components/shared/TabNavigation'
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