dramaling-vocab-learning/frontend/hooks/flashcards/useFlashcardOperations.ts

61 lines
1.8 KiB
TypeScript

import { useRouter } from 'next/navigation'
import { flashcardsService } from '@/lib/services/flashcards'
import { useToast } from '@/components/shared/Toast'
import type { Flashcard } from '@/lib/services/flashcards'
interface UseFlashcardOperationsReturn {
handleEdit: (card: Flashcard) => void
handleDelete: (card: Flashcard, onSuccess?: () => void) => Promise<void>
handleToggleFavorite: (card: Flashcard, onSuccess?: () => void) => Promise<void>
}
export const useFlashcardOperations = (): UseFlashcardOperationsReturn => {
const router = useRouter()
const toast = useToast()
const handleEdit = (card: Flashcard) => {
router.push(`/flashcards/${card.id}?edit=true`)
}
const handleDelete = async (card: Flashcard, onSuccess?: () => void) => {
if (!confirm(`確定要刪除詞卡「${card.word}」嗎?`)) {
return
}
try {
const result = await flashcardsService.deleteFlashcard(card.id)
if (result.success) {
if (onSuccess) {
await onSuccess()
}
toast.success(`詞卡「${card.word}」已刪除`)
} else {
toast.error(result.error || '刪除失敗')
}
} catch (err) {
toast.error('刪除失敗,請重試')
}
}
const handleToggleFavorite = async (card: Flashcard, onSuccess?: () => void) => {
try {
const result = await flashcardsService.toggleFavorite(card.id)
if (result.success) {
if (onSuccess) {
await onSuccess()
}
toast.success(`${card.isFavorite ? '已取消收藏' : '已加入收藏'}${card.word}`)
} else {
toast.error(result.error || '操作失敗')
}
} catch (err) {
toast.error('操作失敗,請重試')
}
}
return {
handleEdit,
handleDelete,
handleToggleFavorite
}
}