'use client' import React, { useState, useEffect } from 'react' import { flashcardsService, type CreateFlashcardRequest, type CardSet } from '@/lib/services/flashcards' import AudioPlayer from './AudioPlayer' interface FlashcardFormProps { cardSets: CardSet[] initialData?: Partial isEdit?: boolean onSuccess: () => void onCancel: () => void } export function FlashcardForm({ cardSets, initialData, isEdit = false, onSuccess, onCancel }: FlashcardFormProps) { // 找到預設卡組或第一個卡組 const getDefaultCardSetId = () => { if (initialData?.cardSetId) return initialData.cardSetId // 優先選擇預設卡組 const defaultCardSet = cardSets.find(set => set.isDefault) if (defaultCardSet) return defaultCardSet.id // 如果沒有預設卡組,選擇第一個卡組 if (cardSets.length > 0) return cardSets[0].id // 如果沒有任何卡組,返回空字串 return '' } const [formData, setFormData] = useState({ cardSetId: getDefaultCardSetId(), english: initialData?.english || '', chinese: initialData?.chinese || '', pronunciation: initialData?.pronunciation || '', partOfSpeech: initialData?.partOfSpeech || '名詞', example: initialData?.example || '', }) // 當 cardSets 改變時,重新設定 cardSetId(處理初始載入的情況) React.useEffect(() => { if (!formData.cardSetId && cardSets.length > 0) { const defaultId = getDefaultCardSetId() if (defaultId) { setFormData(prev => ({ ...prev, cardSetId: defaultId })) } } }, [cardSets]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const partOfSpeechOptions = [ '名詞', '動詞', '形容詞', '副詞', '介詞', '連詞', '感嘆詞', '代詞', '冠詞' ] const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) setError(null) try { let result if (isEdit && initialData?.id) { result = await flashcardsService.updateFlashcard(initialData.id, formData) } else { result = await flashcardsService.createFlashcard(formData) } if (result.success) { onSuccess() } else { setError(result.error || '操作失敗') } } catch (err) { setError('操作失敗,請重試') } finally { setLoading(false) } } const handleChange = (field: keyof CreateFlashcardRequest, value: string) => { setFormData(prev => ({ ...prev, [field]: value })) } return (

{isEdit ? '編輯詞卡' : '新增詞卡'}

{error && (

{error}

)}
{/* 詞卡集合選擇 */}
{cardSets.length === 0 ? (
載入卡組中...
) : ( )}
{/* 英文單字 */}
handleChange('english', e.target.value)} className="flex-1 px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="例如:negotiate" required /> {formData.english && (
)}
{/* 中文翻譯 */}
handleChange('chinese', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="例如:談判,協商" required />
{/* 詞性和發音 */}
handleChange('pronunciation', e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary focus:border-transparent" placeholder="例如:/nɪˈɡoʊʃieɪt/" />
{/* 例句 */}