'use client' import React, { useState, useMemo } from 'react' import { Modal } from './ui/Modal' import { Check, Loader2 } from 'lucide-react' interface GeneratedCard { word: string translation: string definition: string partOfSpeech?: string pronunciation?: string example?: string exampleTranslation?: string synonyms?: string[] difficultyLevel?: string } interface CardSet { id: string name: string color: string } interface CardSelectionDialogProps { isOpen: boolean generatedCards: GeneratedCard[] cardSets: CardSet[] onClose: () => void onSave: (selectedCards: GeneratedCard[], cardSetId?: string) => Promise } export const CardSelectionDialog: React.FC = ({ isOpen, generatedCards, cardSets, onClose, onSave }) => { const [selectedCardIndices, setSelectedCardIndices] = useState>( new Set(generatedCards.map((_, index) => index)) // 預設全選 ) const [selectedCardSetId, setSelectedCardSetId] = useState('') const [isSaving, setIsSaving] = useState(false) const selectedCount = selectedCardIndices.size const handleSelectAll = (checked: boolean) => { if (checked) { setSelectedCardIndices(new Set(generatedCards.map((_, index) => index))) } else { setSelectedCardIndices(new Set()) } } const handleCardToggle = (index: number, checked: boolean) => { const newSelected = new Set(selectedCardIndices) if (checked) { newSelected.add(index) } else { newSelected.delete(index) } setSelectedCardIndices(newSelected) } const handleSave = async () => { if (selectedCount === 0) { alert('請至少選擇一張詞卡') return } setIsSaving(true) try { const selectedCards = Array.from(selectedCardIndices).map(index => generatedCards[index]) await onSave(selectedCards, selectedCardSetId || undefined) } catch (error) { console.error('Save error:', error) alert(`保存失敗: ${error instanceof Error ? error.message : '未知錯誤'}`) } finally { setIsSaving(false) } } const isAllSelected = selectedCount === generatedCards.length return (
{/* 操作工具列 */}
保存到:
{/* 詞卡列表 */}
{generatedCards.map((card, index) => ( handleCardToggle(index, checked)} /> ))}
{/* 底部操作按鈕 */}
) } interface CardPreviewItemProps { card: GeneratedCard index: number isSelected: boolean onToggle: (checked: boolean) => void } const CardPreviewItem: React.FC = ({ card, index, isSelected, onToggle }) => { return (

{card.word}

{card.difficultyLevel && ( {card.difficultyLevel} )}
翻譯: {card.translation}
{card.partOfSpeech && (
詞性: {card.partOfSpeech}
)} {card.pronunciation && (
發音: {card.pronunciation}
)}
定義:

{card.definition}

{card.example && (
例句:

{card.example}

{card.exampleTranslation && (

{card.exampleTranslation}

)}
)} {card.synonyms && card.synonyms.length > 0 && (
同義詞:
{card.synonyms.map((synonym, idx) => ( {synonym} ))}
)}
) }