"use client"; import { useMemo, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { Loader2, Plus, Search, Sparkles, User, Grid3X3, Wand2, LayoutGrid, FolderOpen, Building2, Menu } from "lucide-react"; import useSWR from "swr"; import { toast } from "sonner"; import { cn } from "@/lib/utils"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { agentService } from "@/services/agents"; import type { AgentPreset } from "@/types/agent"; import { normalizeAgentWorkflowShowcaseConfig } from "@/lib/agents/workflow-showcase-config"; import { AgentWorkflowShowcaseBanner } from "./AgentWorkflowShowcaseBanner"; import { AgentPresetCardDark } from "./AgentPresetCardDark"; import { AgentPresetDialog } from "./AgentPresetDialog"; // 导航标签类型 type NavTab = "cases" | "my-works" | "personal-assets" | "company-assets"; interface AgentPresetPanelDarkV2Props { selectedPresetId?: string | null; onSelectPreset: (presetId: string | null) => void; onCreateClick?: () => void; embedded?: boolean; embeddedEntityLabel?: string; } export function AgentPresetPanelDarkV2({ selectedPresetId, onSelectPreset, onCreateClick, embedded = false, embeddedEntityLabel = "智能体", }: AgentPresetPanelDarkV2Props) { const [activeTab, setActiveTab] = useState("cases"); const [keyword, setKeyword] = useState(""); const [showCreateDialog, setShowCreateDialog] = useState(false); const [editingPreset, setEditingPreset] = useState(null); const { data: siteSettingsData } = useSWR<{ agentWorkflowShowcaseConfig?: unknown }>( !embedded ? "/api/site-settings" : null, (url: string) => fetch(url, { cache: "no-store" }).then((res) => res.json()) ); const { data, isLoading, mutate } = useSWR( ["agent-presets"], async () => { const result = await agentService.getPresets({ scope: "all", sort: "latest", }); if (!result.success || !result.data) { throw new Error(result.error || "获取智能体失败"); } return result.data; } ); // 根据当前标签过滤数据 const filteredPresets = useMemo(() => { let presets: AgentPreset[] = []; switch (activeTab) { case "cases": presets = data?.public || []; break; case "my-works": presets = data?.private || []; break; case "personal-assets": // 这里可以接入个人资产库数据 presets = data?.private || []; break; case "company-assets": // 这里可以接入公司资产库数据 presets = data?.public || []; break; } // 搜索过滤 if (keyword.trim()) { const normalizedKeyword = keyword.trim().toLowerCase(); presets = presets.filter((preset) => [preset.name, preset.description || "", preset.type] .filter(Boolean) .some((value) => String(value).toLowerCase().includes(normalizedKeyword)) ); } return presets; }, [data, activeTab, keyword]); const handleForkPreset = async (preset: AgentPreset) => { const result = await agentService.forkPreset(preset.id, `${preset.name}(副本)`); if (!result.success || !result.data) { toast.error(result.error || "复制智能体失败"); return; } toast.success("已另存为我的智能体"); await mutate(); onSelectPreset(result.data.id); }; const handleDeletePreset = async (preset: AgentPreset) => { if (!window.confirm(`确定删除智能体「${preset.name}」吗?`)) { return; } const result = await agentService.deletePreset(preset.id); if (!result.success) { toast.error(result.error || "删除智能体失败"); return; } toast.success("智能体已删除"); if (selectedPresetId === preset.id) { onSelectPreset(null); } await mutate(); }; // 导航标签配置 const navTabs = [ { id: "cases" as NavTab, label: "案例广场", icon: LayoutGrid }, { id: "my-works" as NavTab, label: "我的作品", icon: FolderOpen }, { id: "personal-assets" as NavTab, label: "个人资产库", icon: User }, { id: "company-assets" as NavTab, label: "公司资产库", icon: Building2 }, ]; // 获取当前标签标题 const getCurrentTitle = () => { switch (activeTab) { case "cases": return "公共智能体"; case "my-works": return "我的智能体"; case "personal-assets": return "个人资产库"; case "company-assets": return "公司资产库"; } }; // 嵌入模式只渲染卡片网格 if (embedded) { return ( <> {/* 搜索栏 */}
setKeyword(e.target.value)} className={cn( "h-9 rounded-lg border-0 pl-9 pr-3 text-sm", "bg-white/5 text-white placeholder:text-white/30", "focus:bg-white/10 focus:ring-1 focus:ring-white/20" )} />
{/* 导航标签(简化版) */}
{navTabs.slice(0, 2).map((tab) => ( ))}
{/* 卡片网格 */}
{isLoading ? (
) : filteredPresets.length > 0 ? ( {filteredPresets.map((preset, index) => ( ))} ) : (
暂无{embeddedEntityLabel}
)}
{ if (!nextOpen) { setShowCreateDialog(false); setEditingPreset(null); return; } setShowCreateDialog(true); }} initialPreset={editingPreset} entityLabel={embeddedEntityLabel} theme="dark" onSaved={async (preset) => { await mutate(); onSelectPreset(preset.id); setEditingPreset(null); setShowCreateDialog(false); }} /> ); } return (
{/* 顶部固定导航栏 */}
{/* Logo & Site Name */}
AI创作平台
{/* 导航标签 */} {/* 右侧操作 */}
{/* Hero Section - 视频/功能展示区 */}
{ const target = document.getElementById("agent-preset-grid"); if (!target) return; target.scrollIntoView({ behavior: "smooth", block: "start" }); }} />
{/* 智能体卡片网格区域 */}
{/* 搜索栏 */}
setKeyword(e.target.value)} className={cn( "h-11 rounded-full border-0 pl-11 pr-4", "bg-white/5 text-white placeholder:text-white/30", "focus:bg-white/10 focus:ring-1 focus:ring-white/20", "transition-all duration-300" )} />
共 {filteredPresets.length} 个
{/* 区域标题 */}

{getCurrentTitle()}

{filteredPresets.length}
{/* 卡片网格 */}
{isLoading ? (
) : filteredPresets.length > 0 ? ( filteredPresets.map((preset, index) => ( )) ) : ( )}
{/* 页脚 */} { if (!nextOpen) { setShowCreateDialog(false); setEditingPreset(null); return; } setShowCreateDialog(true); }} initialPreset={editingPreset} entityLabel="智能体" theme="dark" onSaved={async (preset) => { await mutate(); onSelectPreset(preset.id); setEditingPreset(null); setShowCreateDialog(false); }} />
); } function EmptyState({ message }: { message: string }) { return (

{message}

); }