import { useState, useMemo } from "react"; import { Bot, Cpu, Brain, Zap, Rocket, Code, Terminal, Shield, Eye, Search, Wrench, Hammer, Lightbulb, Sparkles, Star, Heart, Flame, Bug, Cog, Database, Globe, Lock, Mail, MessageSquare, FileCode, GitBranch, Package, Puzzle, Target, Wand2, Atom, CircuitBoard, Radar, Swords, Telescope, Microscope, Crown, Gem, Hexagon, Pentagon, Fingerprint, type LucideIcon, } from "lucide-react"; import { AGENT_ICON_NAMES, type AgentIconName } from "@paperclipai/shared"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; import { cn } from "@/lib/utils"; export const AGENT_ICONS: Record = { bot: Bot, cpu: Cpu, brain: Brain, zap: Zap, rocket: Rocket, code: Code, terminal: Terminal, shield: Shield, eye: Eye, search: Search, wrench: Wrench, hammer: Hammer, lightbulb: Lightbulb, sparkles: Sparkles, star: Star, heart: Heart, flame: Flame, bug: Bug, cog: Cog, database: Database, globe: Globe, lock: Lock, mail: Mail, "message-square": MessageSquare, "file-code": FileCode, "git-branch": GitBranch, package: Package, puzzle: Puzzle, target: Target, wand: Wand2, atom: Atom, "circuit-board": CircuitBoard, radar: Radar, swords: Swords, telescope: Telescope, microscope: Microscope, crown: Crown, gem: Gem, hexagon: Hexagon, pentagon: Pentagon, fingerprint: Fingerprint, }; const DEFAULT_ICON: AgentIconName = "bot"; export function getAgentIcon(iconName: string | null | undefined): LucideIcon { if (iconName && AGENT_ICON_NAMES.includes(iconName as AgentIconName)) { return AGENT_ICONS[iconName as AgentIconName]; } return AGENT_ICONS[DEFAULT_ICON]; } interface AgentIconProps { icon: string | null | undefined; className?: string; } export function AgentIcon({ icon, className }: AgentIconProps) { const Icon = getAgentIcon(icon); return ; } interface AgentIconPickerProps { value: string | null | undefined; onChange: (icon: string) => void; children: React.ReactNode; } export function AgentIconPicker({ value, onChange, children }: AgentIconPickerProps) { const [open, setOpen] = useState(false); const [search, setSearch] = useState(""); const filtered = useMemo(() => { const entries = AGENT_ICON_NAMES.map((name) => [name, AGENT_ICONS[name]] as const); if (!search) return entries; const q = search.toLowerCase(); return entries.filter(([name]) => name.includes(q)); }, [search]); return ( {children} setSearch(e.target.value)} className="mb-2 h-8 text-sm" autoFocus />
{filtered.map(([name, Icon]) => ( ))} {filtered.length === 0 && (

No icons match

)}
); }