"use client" import type { Agent } from "@/types/agent" import { AgentCard, AgentCardHandle } from "./agent-card" import { Input } from "@/components/ui/input" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Brain, Code, Microscope, Users, Shield, TrendingUp, Bitcoin, Briefcase, ClipboardList, RefreshCcw } from "lucide-react" import { motion } from "framer-motion" import { useMemo, useRef, useState } from "react" import Link from "next/link" interface AgentGridProps { agents: Agent[] onUpdateAgent?: (agent: Agent) => void } const categories = [ { name: "All Agents", icon: Brain, key: "all" }, { name: "Programmer", icon: Code, key: "programmer" }, { name: "Researcher", icon: Microscope, key: "researcher" }, { name: "Friend", icon: Users, key: "friend" }, { name: "Security", icon: Shield, key: "security" }, { name: "Degen Trader", icon: TrendingUp, key: "degenTrader" }, { name: "Crypto", icon: Bitcoin, key: "crypto" }, { name: "Personal Assistant", icon: Briefcase, key: "personalAssistant" }, ] export function AgentGrid({ agents, onUpdateAgent }: AgentGridProps) { const [searchQuery, setSearchQuery] = useState("") const [sortOption, setSortOption] = useState("all") const [selectedCategory, setSelectedCategory] = useState("all") const [diagnosisRunning, setDiagnosisRunning] = useState(false) const [abortController, setAbortController] = useState(null) const cardRefs = useRef<(AgentCardHandle | null)[]>([]) const handleCancel = () => { if (abortController) { abortController.abort() setAbortController(null) } } const handleRunAllDiagnoses = async () => { if (!diagnosisRunning) { const controller = new AbortController() setAbortController(controller) setDiagnosisRunning(true) for (let i = 0; i < cardRefs.current.length; i++) { if (controller.signal.aborted) { break } const ref = cardRefs.current[i] if (ref && typeof ref.runDiagnosis === "function") { try { await ref.runDiagnosis(controller.signal) } catch (error) { if ((error as Error).name === "AbortError") { break } console.error(`Error in agent diagnosis:`, error) } } } setDiagnosisRunning(false) setAbortController(null) } } // Filter agents based on category, search query and sort const filteredAgents = useMemo(() => { let result = [...agents] // Category filter if (selectedCategory !== "all") { result = result.filter(agent => agent.category === selectedCategory) } // Search filter if (searchQuery) { result = result.filter(agent => agent.name.toLowerCase().includes(searchQuery.toLowerCase()) || agent.description?.toLowerCase().includes(searchQuery.toLowerCase()) ) } // Sort if (sortOption === "price-asc") { result = result.sort((a, b) => (a.price || 0) - (b.price || 0)) } else if (sortOption === "price-desc") { result = result.sort((a, b) => (b.price || 0) - (a.price || 0)) } return result }, [searchQuery, agents, sortOption, selectedCategory]) return (
{/* Search and Filters */}
setSearchQuery(e.target.value)} />
{/* Leaderboard button */} {/* Sort by Price */}
{/* Categories */}
{categories.map((category, index) => { const Icon = category.icon const isSelected = selectedCategory === category.key return ( ) })}
{/* Featured Agents Section */}

Personas

{filteredAgents.length > 0 ? ( filteredAgents.map((agent, index) => ( { cardRefs.current[index] = el; }} /> )) ) : searchQuery.length > 0 && filteredAgents.length < 1 ? ( No agents match your search. ) : ( agents.map((agent, index) => ( { cardRefs.current[index] = el; }} /> )) )}
) }