diff --git a/src/components/AgentLibrary.tsx b/src/components/AgentLibrary.tsx index c1f680b..d80a158 100644 --- a/src/components/AgentLibrary.tsx +++ b/src/components/AgentLibrary.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; -import { Plus, Clock, Bot, Search, Trash2, Copy, ArrowUpDown, CheckCircle, XCircle, Rocket } from 'lucide-react'; +import { Plus, Clock, Bot, Search, Trash2, Copy, ArrowUpDown, Rocket } from 'lucide-react'; import { useTheme } from '../theme'; import { useConsoleStore } from '../store/consoleStore'; import { Button } from './ds/Button'; @@ -10,6 +10,7 @@ import { Select } from './ds/Select'; import { API_BASE } from '../config'; import { DEMO_PRESETS } from '../store/demoPresets'; import { TemplateCard } from './TemplateCard'; +import { useToastStore } from '../store/toastStore'; interface Agent { id: string; @@ -20,12 +21,6 @@ interface Agent { updatedAt: string; } -interface Toast { - id: number; - type: 'success' | 'error'; - message: string; -} - interface AgentLibraryProps { onSelectAgent: (agentId: string) => void; onNewAgent: () => void; @@ -44,8 +39,6 @@ const TEMPLATE_LIST = Object.entries(DEMO_PRESETS).map(([id, preset]) => ({ tags: preset.agentMeta.tags, })); -let _toastSeq = 0; - export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { const [agents, setAgents] = useState([]); const [loading, setLoading] = useState(true); @@ -56,7 +49,6 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { const [deleteTarget, setDeleteTarget] = useState(null); const [deletingId, setDeletingId] = useState(null); const [cloningId, setCloningId] = useState(null); - const [toasts, setToasts] = useState([]); const debounceRef = useRef | null>(null); const t = useTheme(); @@ -67,11 +59,7 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { return () => { if (debounceRef.current) clearTimeout(debounceRef.current); }; }, [searchQuery]); - const showToast = useCallback((type: Toast['type'], message: string) => { - const id = ++_toastSeq; - setToasts((prev) => [...prev, { id, type, message }]); - setTimeout(() => setToasts((prev) => prev.filter((t) => t.id !== id)), 3500); - }, []); + const addToast = useToastStore((s) => s.addToast); const handleUseTemplate = useCallback((presetId: string) => { const { loadDemoPreset } = useConsoleStore.getState(); @@ -130,9 +118,9 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { const res = await fetch(`${API_BASE}/agents/${encodeURIComponent(deleteTarget.id)}`, { method: 'DELETE' }); if (!res.ok) throw new Error('Delete failed'); setAgents((prev) => prev.filter((a) => a.id !== deleteTarget.id)); - showToast('success', `"${deleteTarget.name}" deleted`); + addToast(`"${deleteTarget.name}" deleted`, 'success'); } catch { - showToast('error', `Failed to delete "${deleteTarget.name}"`); + addToast(`Failed to delete "${deleteTarget.name}"`, 'error'); } finally { setDeletingId(null); } @@ -165,10 +153,10 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { }); if (!saveRes.ok) throw new Error('Failed to save clone'); - showToast('success', `Cloned as "${cloned.agentMeta.name}"`); + addToast(`Cloned as "${cloned.agentMeta.name}"`, 'success'); onSelectAgent(newId); } catch { - showToast('error', `Failed to clone "${agent.name}"`); + addToast(`Failed to clone "${agent.name}"`, 'error'); } finally { setCloningId(null); } @@ -255,7 +243,7 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) { background: t.inputBg, border: `1px solid ${t.border}`, color: t.textPrimary, - fontFamily: "'Geist Sans', sans-serif", + fontFamily: "var(--m-font-sans), sans-serif", fontSize: 13, }} /> @@ -276,13 +264,13 @@ export function AgentLibrary({ onSelectAgent, onNewAgent }: AgentLibraryProps) {
-