"use client"; import { memo } from "react"; import { SparklesIcon } from "./icons"; // 预定义的颜色主题 const COLOR_THEMES = { purple: { ping: "bg-purple-500/20", pulse: "bg-purple-500/10", ring: "ring-purple-500/30", text: "text-purple-500", dot: "bg-purple-500", gradientFrom: "from-purple-400", gradientVia: "via-pink-400", gradientTo: "to-blue-400", overlay1From: "from-purple-500/40", overlay1To: "to-pink-500/40", overlay2From: "from-blue-500/30", overlay2To: "to-purple-500/30", }, blue: { ping: "bg-blue-500/20", pulse: "bg-blue-500/10", ring: "ring-blue-500/30", text: "text-blue-500", dot: "bg-blue-500", gradientFrom: "from-blue-400", gradientVia: "via-cyan-400", gradientTo: "to-teal-400", overlay1From: "from-blue-500/40", overlay1To: "to-cyan-500/40", overlay2From: "from-teal-500/30", overlay2To: "to-blue-500/30", }, green: { ping: "bg-green-500/20", pulse: "bg-green-500/10", ring: "ring-green-500/30", text: "text-green-500", dot: "bg-green-500", gradientFrom: "from-green-400", gradientVia: "via-emerald-400", gradientTo: "to-teal-400", overlay1From: "from-green-500/40", overlay1To: "to-emerald-500/40", overlay2From: "from-teal-500/30", overlay2To: "to-green-500/30", }, orange: { ping: "bg-orange-500/20", pulse: "bg-orange-500/10", ring: "ring-orange-500/30", text: "text-orange-500", dot: "bg-orange-500", gradientFrom: "from-orange-400", gradientVia: "via-amber-400", gradientTo: "to-yellow-400", overlay1From: "from-orange-500/40", overlay1To: "to-amber-500/40", overlay2From: "from-yellow-500/30", overlay2To: "to-orange-500/30", }, red: { ping: "bg-red-500/20", pulse: "bg-red-500/10", ring: "ring-red-500/30", text: "text-red-500", dot: "bg-red-500", gradientFrom: "from-red-400", gradientVia: "via-rose-400", gradientTo: "to-pink-400", overlay1From: "from-red-500/40", overlay1To: "to-rose-500/40", overlay2From: "from-pink-500/30", overlay2To: "to-red-500/30", }, } as const; type ColorTheme = keyof typeof COLOR_THEMES; interface ImageGenerationLoadingProps { imageCount?: number; // 生成图片数量,默认 1 maxImages?: number; // 最大图片数限制,默认 6 colorTheme?: ColorTheme; // 颜色主题,默认 purple modelName?: string; // 模型名称,用于显示 providerType?: string; // 提供商类型,用于自动选择颜色 phase?: "idle" | "queued" | "processing" | "finalizing" | "failed"; elapsedSeconds?: number; } /** * 通用图片生成加载占位符组件 * 支持配置颜色主题和图片数量 */ export const ImageGenerationLoading = memo(({ imageCount = 1, maxImages = 6, colorTheme, modelName, providerType, phase = "processing", elapsedSeconds = 0, }: ImageGenerationLoadingProps) => { // 根据 providerType 自动选择颜色主题 const getAutoColorTheme = (): ColorTheme => { if (colorTheme) return colorTheme; switch (providerType) { case "gemini": return "purple"; case "alibaba-image": return "orange"; case "ruxa-image": return "green"; case "volcano-vision": return "blue"; default: return "purple"; } }; const theme = COLOR_THEMES[getAutoColorTheme()]; // 确保数量在有效范围内 const count = Math.min(Math.max(imageCount, 1), maxImages); // 获取显示名称 const displayName = modelName || (providerType === "alibaba-image" ? "千问图片编辑" : providerType === "ruxa-image" ? "RUXA 图片编辑" : providerType === "volcano-vision" ? "即梦4.5" : "AI"); const phaseTitle = phase === "queued" ? "正在排队准备生成" : phase === "finalizing" ? "图片生成完成,正在加载结果" : "正在生成图片"; const phaseHint = phase === "queued" ? `${displayName} 正在排队,请稍候...` : phase === "finalizing" ? `${displayName} 正在同步结果到聊天记录...` : `${displayName} 正在创作 ${count} 张图片,请稍候...`; const elapsedLabel = elapsedSeconds > 0 ? `已等待 ${elapsedSeconds} 秒` : null; return (