import { useState, useCallback } from "react"; import type { ChainSummary, ChainStatus } from "../../lib/api"; interface ChainListProps { chains: ChainSummary[]; loading: boolean; onSelect: (chainId: string) => void; onCreate: () => void; selectedId?: string; onArchive: (chain: ChainSummary) => void; } const statusColors: Record = { pending: "text-yellow-400", active: "text-green-400", completed: "text-blue-400", archived: "text-[#555]", }; export function ChainList({ chains, loading, onSelect, onCreate, selectedId, onArchive, }: ChainListProps) { const [filter, setFilter] = useState("all"); const [contextMenuPosition, setContextMenuPosition] = useState<{ x: number; y: number } | null>(null); const [contextMenuChain, setContextMenuChain] = useState(null); const filteredChains = filter === "all" ? chains : chains.filter((c) => c.status === filter); const handleContextMenu = useCallback( (e: React.MouseEvent, chain: ChainSummary) => { e.preventDefault(); setContextMenuPosition({ x: e.clientX, y: e.clientY }); setContextMenuChain(chain); }, [] ); const closeContextMenu = useCallback(() => { setContextMenuPosition(null); setContextMenuChain(null); }, []); const handleArchive = useCallback(() => { if (contextMenuChain) { onArchive(contextMenuChain); closeContextMenu(); } }, [contextMenuChain, onArchive, closeContextMenu]); if (loading) { return (
Loading...
); } return (
{/* Header */}

Chains

{/* Filter tabs */}
{(["all", "active", "completed", "archived"] as const).map((status) => ( ))}
{/* Chain list */}
{filteredChains.length === 0 ? (

{filter === "all" ? "No chains yet" : `No ${filter} chains`}

) : (
{filteredChains.map((chain) => ( ))}
)}
{/* Context Menu */} {contextMenuPosition && contextMenuChain && (
e.stopPropagation()} > {contextMenuChain.status !== "archived" && ( )}
)}
); }