import { Trash2, Pencil } from "lucide-react"; import { useState } from "react"; import { CircleButton } from "@/design-system/base/button"; import { useTranslations } from "next-intl"; import type { ActionOutputCard, CardType } from "@/modules/card/card-action-dto"; import { toast } from "sonner"; import { actionDeleteCard } from "@/modules/card/card-action"; import { EditCardModal } from "./EditCardModal"; interface CardItemProps { card: ActionOutputCard; isReadOnly: boolean; onDel: () => void; onUpdated: () => void; } const CARD_TYPE_LABELS: Record = { WORD: "Word", PHRASE: "Phrase", SENTENCE: "Sentence", }; export function CardItem({ card, isReadOnly, onDel, onUpdated, }: CardItemProps) { const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const t = useTranslations("deck_id"); const frontText = card.word; const backText = card.meanings.map((m) => m.partOfSpeech ? `${m.partOfSpeech}: ${m.definition}` : m.definition ).join("; "); const handleDelete = async () => { try { const result = await actionDeleteCard({ cardId: card.id }); if (result.success) { toast.success(t("cardDeleted")); onDel(); } else { toast.error(result.message); } } catch (error) { toast.error(error instanceof Error ? error.message : "Unknown error"); } setShowDeleteConfirm(false); }; return ( <>
{t("card")} {CARD_TYPE_LABELS[card.cardType]}
{!isReadOnly && ( <> setShowEditModal(true)} title={t("edit")} className="text-gray-400 hover:text-blue-500 hover:bg-blue-50" > setShowDeleteConfirm(true)} title={t("delete")} className="text-gray-400 hover:text-red-500 hover:bg-red-50" > )}
{frontText.length > 30 ? frontText.substring(0, 30) + "..." : frontText}
{backText.length > 30 ? backText.substring(0, 30) + "..." : backText}
{showDeleteConfirm && (

{t("deleteConfirm")}

)} setShowEditModal(false)} card={card} onUpdated={onUpdated} /> ); }