import { useT } from "@agent-native/core/client/i18n"; import { CreativeContextShareSheet } from "@agent-native/creative-context/client"; import { VisibilityBadge } from "@agent-native/toolkit/sharing"; import { IconDots, IconTrash, IconCopy, IconPencil, IconPalette, IconPlus, } from "@tabler/icons-react"; import { useState, useRef, useEffect } from "react"; import { Link } from "react-router"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; import type { Deck } from "@/context/DeckContext"; import SlideRenderer from "./SlideRenderer"; interface DeckCardProps { deck: Deck; onDelete: (id: string) => void; onRename: (id: string, newTitle: string) => void; onDuplicate: (id: string) => void; isDuplicating?: boolean; designSystemTitle?: string | null; } export default function DeckCard({ deck, onDelete, onRename, onDuplicate, isDuplicating = false, designSystemTitle, }: DeckCardProps) { const t = useT(); const firstSlide = deck.slides?.[0]; const [isRenaming, setIsRenaming] = useState(false); const [menuOpen, setMenuOpen] = useState(false); const [renameValue, setRenameValue] = useState(deck.title); const [contextOpen, setContextOpen] = useState(false); const inputRef = useRef(null); const pendingRenameRef = useRef(false); useEffect(() => { if (isRenaming) { setRenameValue(deck.title); setTimeout(() => { inputRef.current?.focus(); inputRef.current?.select(); }, 0); } }, [isRenaming, deck.title]); const commitRename = () => { const trimmed = renameValue.trim(); if (trimmed && trimmed !== deck.title) { onRename(deck.id, trimmed); } setIsRenaming(false); }; const handleRenameKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter") { e.preventDefault(); e.stopPropagation(); commitRename(); } else if (e.key === "Escape") { e.preventDefault(); e.stopPropagation(); setIsRenaming(false); } }; const startRename = () => { pendingRenameRef.current = true; setMenuOpen(false); }; return (
{ if (isRenaming) e.preventDefault(); }} > {/* Slide Preview */}
{firstSlide && ( )}
{/* Info */}
{isRenaming ? ( setRenameValue(e.target.value)} onBlur={commitRename} onKeyDown={handleRenameKeyDown} onClick={(e) => { e.preventDefault(); e.stopPropagation(); }} onPointerDown={(e) => e.stopPropagation()} className="flex-1 min-w-0 bg-transparent border-b border-border text-sm font-medium text-foreground outline-none" /> ) : (

{deck.title}

)}
{deck.slides.length} slide{deck.slides.length !== 1 ? "s" : ""} {deck.designSystemId && ( {designSystemTitle || "Design system"} )}
{/* Menu Button - always visible on touch devices */}
{ if (pendingRenameRef.current) { e.preventDefault(); pendingRenameRef.current = false; setIsRenaming(true); } }} > { e.preventDefault(); startRename(); }} > Rename { e.preventDefault(); e.stopPropagation(); if (isDuplicating) return; onDuplicate(deck.id); }} disabled={isDuplicating} > {isDuplicating ? "Duplicating..." : "Duplicate"} { event.preventDefault(); setMenuOpen(false); setContextOpen(true); }} > {t("creativeContext.addToContext" /* i18n-key-ignore */)} { e.preventDefault(); e.stopPropagation(); onDelete(deck.id); }} className="text-red-400 focus:text-red-400" > Delete
); }