"use client"; import { motion } from "framer-motion"; import { Play, Copy, Pencil, Sparkles, Trash2, Video, Wand2, FileText, Clock, User } from "lucide-react"; import { cn } from "@/lib/utils"; import { getAgentPresetModeTypeFromDefaultParams, normalizeAgentPresetModeConfig, } from "@/lib/agents/preset-mode-config"; import type { AgentPreset } from "@/types/agent"; interface AgentPresetCardDarkProps { preset: AgentPreset; selected?: boolean; onSelect: (presetId: string) => void; onFork?: (preset: AgentPreset) => void; onEdit?: (preset: AgentPreset) => void; onDelete?: (preset: AgentPreset) => void; index?: number; compact?: boolean; } export function AgentPresetCardDark({ preset, selected = false, onSelect, onFork, onEdit, onDelete, index = 0, compact = false, }: AgentPresetCardDarkProps) { const previewUrl = preset.avatarUrl || preset.referenceAssets?.[0]?.thumbnailUrl || preset.referenceAssets?.[0]?.originalUrl || ""; const ownerName = String(preset.owner?.name || "").trim() || String(preset.owner?.email || "").trim() || "未知"; const publishedAt = (() => { const raw = preset.createdAt ? new Date(preset.createdAt) : null; if (!raw || Number.isNaN(raw.getTime())) return ""; return raw.toLocaleDateString("zh-CN", { timeZone: "Asia/Shanghai", month: "short", day: "numeric", }); })(); const typeConfig = { image: { icon: Wand2, label: "生图", gradient: "from-violet-500 to-purple-600", bg: "bg-violet-500/20", text: "text-violet-300" }, video: { icon: Video, label: "视频", gradient: "from-amber-500 to-orange-600", bg: "bg-amber-500/20", text: "text-amber-300" }, text: { icon: FileText, label: "生文", gradient: "from-emerald-500 to-teal-600", bg: "bg-emerald-500/20", text: "text-emerald-300" }, }; const typeInfo = typeConfig[preset.type] || typeConfig.image; const TypeIcon = typeInfo.icon; const imageModeType = getAgentPresetModeTypeFromDefaultParams(preset.defaultParams); const modeConfig = normalizeAgentPresetModeConfig(preset.defaultParams); const imageModeLabel = imageModeType === "detail_replacement" ? "详情替换" : imageModeType === "sku_replacement" ? "SKU替换" : imageModeType === "scene_generation" ? "场景图" : null; const requiresImageCount = preset.type === "image" ? Math.max(0, preset.requiredUploadCount || preset.slotCount || 0) : 0; const includesModelSlot = preset.type === "image" ? imageModeType === "scene_generation" ? modeConfig.scene.includeModelSlot : imageModeType === "detail_replacement" ? modeConfig.detail.includeModelSlot : imageModeType === "sku_replacement" ? modeConfig.sku.includeModelSlot : preset.requiredUploadCount > preset.slotCount : false; const modelControlLabel = preset.type === "image" ? imageModeType === "scene_generation" && modeConfig.scene.allowModelOverride ? "可切模型" : "锁定模型" : null; const categoryHint = preset.categoryPath?.level3Name || preset.categoryPath?.level2Name || preset.categoryPath?.level1Name || preset.categoryPath?.sectionName || null; const compactSummaryBadges = [ imageModeLabel || typeInfo.label, preset.type === "image" && requiresImageCount > 0 ? `需${requiresImageCount}张图` : null, preset.type === "image" ? (includesModelSlot ? "含模特槽" : "无模特槽") : null, modelControlLabel, ].filter((item): item is string => Boolean(item)); const showEdit = Boolean(onEdit); const showDelete = Boolean(onDelete); const showFork = Boolean(onFork) && !showEdit && !showDelete; if (compact) { return ( onSelect(preset.id)} >
{showEdit ? ( ) : null} {showDelete ? ( ) : null} {showFork ? ( ) : null}
{previewUrl ? ( {preset.name} ) : (
)}
{imageModeLabel || typeInfo.label}
{preset.name}
{compactSummaryBadges.map((badge, badgeIndex) => ( {badge} ))}
默认模型:{preset.defaultModel?.displayName || "未配置"}
{preset.description ? (
{preset.description}
) : categoryHint ? (
适用分类:{categoryHint}
) : null}
贡献者:{ownerName}
贡献时间:{publishedAt || "未记录"}
{selected ? (
) : null} ); } return ( onSelect(preset.id)} > {/* 背景图片 */}
{previewUrl ? ( <> {preset.name} {/* 渐变遮罩 */}
) : (
)}
{/* 顶部信息栏 */}
{/* 类型标签 */}
{imageModeLabel || typeInfo.label}
{/* 可见性标签 */}
{preset.visibility === "public" ? "公共" : "私有"}
{/* 中央播放/使用按钮 */}
{/* 悬浮操作按钮 */}
{showEdit && ( )} {showDelete && ( )} {showFork && ( )}
{/* 底部信息 */}
{/* 标题 */}

{preset.name}

{compactSummaryBadges.slice(0, 4).map((badge, badgeIndex) => ( {badge} ))}
{/* 元信息 */}
{ownerName} {preset.defaultModel?.displayName ? ( {preset.defaultModel.displayName} ) : null}
{publishedAt && ( {publishedAt} )}
{/* 选中指示器 */} {selected && ( )} ); }