"use client" import type { Agent } from "@/types/agent" import { Card, CardContent, CardHeader } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { MessageSquare, Info } from "lucide-react" import Image from "next/image" import { motion } from "framer-motion" import Link from "next/link" import { useDiagnosisRunner } from "@/hooks/use-diagnosis" import { cn } from "@/lib/utils" import { useState } from "react" import { forwardRef, useImperativeHandle } from "react"; interface AgentCardProps { agent: Agent onUpdateAgent?: (agent: Agent) => void index: number } export interface AgentCardHandle { runDiagnosis: (signal: AbortSignal) => Promise; } const AMICA_URL = process.env.NEXT_PUBLIC_AMICA_URL as string; export const AgentCard = forwardRef(({ agent, onUpdateAgent, index }, ref) => { const { status, checking, handleDiagnosis } = useDiagnosisRunner(agent, index, true); const [diagnosed, setDiagnosed] = useState(false); const runDiagnosis = async (signal: AbortSignal): Promise => { return new Promise(async (resolve, reject) => { if (signal.aborted) { return reject(new DOMException("Aborted", "AbortError")); } signal.addEventListener("abort", () => { console.log("Diagnosis aborted"); reject(new DOMException("Aborted", "AbortError")); }); setDiagnosed(true); await handleDiagnosis(false); resolve(); }); }; useImperativeHandle(ref, () => ({ runDiagnosis, })); return (
{agent.name}

{agent.name}

{agent.price?.toPrecision(2)} AIUS {checking ? "loading.." : diagnosed ? status : agent.status}

Token: {agent.token}

Tier: {agent.tier?.name} (Level {agent.tier?.level})

{/* Scrollable Description */}

{agent.description}

) } ) AgentCard.displayName = "AgentCard"