import { useState } from "react"; import { formatDistanceToNow } from "date-fns"; import { motion, useReducedMotion } from "framer-motion"; import { Trash2, Copy } from "lucide-react"; import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuTrigger, ContextMenuSeparator, } from "@/components/ui/context-menu"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import type { BoardMeta } from "@/types/board"; import { useAppStore } from "@/stores/app-store"; import { useBoardStore } from "@/stores/board-store"; import { useToastStore } from "@/stores/toast-store"; import { deleteBoard, loadBoard, saveBoard } from "@/lib/storage"; interface BoardCardProps { board: BoardMeta; index?: number; } export function BoardCard({ board, index = 0 }: BoardCardProps) { const [confirmDelete, setConfirmDelete] = useState(false); const prefersReducedMotion = useReducedMotion(); const addToast = useToastStore((s) => s.addToast); const setView = useAppStore((s) => s.setView); const addRecentBoard = useAppStore((s) => s.addRecentBoard); const refreshBoards = useAppStore((s) => s.refreshBoards); const openBoard = useBoardStore((s) => s.openBoard); const relativeTime = formatDistanceToNow(new Date(board.updatedAt), { addSuffix: true, }); async function handleOpen() { await openBoard(board.id); setView({ type: "board", boardId: board.id }); addRecentBoard(board.id); } async function handleDelete() { await deleteBoard(board.id); await refreshBoards(); setConfirmDelete(false); addToast(`"${board.title}" deleted`, "info"); } async function handleDuplicate() { const original = await loadBoard(board.id); const { ulid } = await import("ulid"); const ts = new Date().toISOString(); const duplicated = { ...original, id: ulid(), title: `${original.title} (copy)`, createdAt: ts, updatedAt: ts, }; await saveBoard(duplicated); await refreshBoards(); addToast(`"${board.title}" duplicated`, "success"); } return ( Duplicate setConfirmDelete(true)} > Delete {/* Delete confirmation dialog */} Delete Board Are you sure you want to delete “{board.title}”? This action cannot be undone. ); }