import { useState } from "preact/hooks"; import { beginCardDrag } from "../drag"; import type { Card } from "../types"; import { CardEditor } from "./CardEditor"; import { ConfirmDialog } from "./ConfirmDialog"; interface CardItemProps { card: Card; onEdit: (patch: { title?: string; description?: string; done?: boolean }) => Promise; onDelete: () => Promise; } export function CardItem({ card, onEdit, onDelete }: CardItemProps) { const [editingTitle, setEditingTitle] = useState(false); const [title, setTitle] = useState(card.title); const [expanded, setExpanded] = useState(false); const [confirming, setConfirming] = useState(false); const [saving, setSaving] = useState(false); const saveTitle = async () => { if (!title.trim()) return; setSaving(true); try { await onEdit({ title }); setEditingTitle(false); } catch { setTitle(card.title); } finally { setSaving(false); } }; const remove = async () => { setConfirming(false); try { await onDelete(); } catch { // The global mutation handler reports the failure. } }; return ( <>
beginCardDrag(event as unknown as DragEvent, card)} >
{editingTitle ? ( setTitle(event.currentTarget.value)} onKeyDown={(event) => { if (event.key === "Enter") void saveTitle(); if (event.key === "Escape") { setTitle(card.title); setEditingTitle(false); } }} onBlur={() => void saveTitle()} /> ) : ( )}
{card.description && !expanded ?

{card.description}

: null} {expanded ? ( onEdit({ description })} onClose={() => setExpanded(false)} onDelete={() => setConfirming(true)} /> ) : null}
setConfirming(false)} onConfirm={() => void remove()} /> ); }