"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Check, Image, Ratio, Maximize2 } from "lucide-react"; import { cn } from "@/lib/utils"; // 图片生成参数接口 export interface ImageGenerationParams { aspectRatio: string; imageSize: string; } interface ImageParamsBarProps { modelName?: string; initialParams?: Partial; onParamsChange?: (params: ImageGenerationParams) => void; inline?: boolean; // 内联模式:只显示参数按钮,不显示外层容器 } // 图片比例选项(根据 Nano Banana 文档) const ASPECT_RATIO_OPTIONS = [ { value: "auto", label: "自动" }, { value: "1:1", label: "1:1" }, { value: "16:9", label: "16:9" }, { value: "9:16", label: "9:16" }, { value: "4:3", label: "4:3" }, { value: "3:4", label: "3:4" }, { value: "3:2", label: "3:2" }, { value: "2:3", label: "2:3" }, { value: "5:4", label: "5:4" }, { value: "4:5", label: "4:5" }, { value: "21:9", label: "21:9" }, ] as const; // 图片大小选项(仅支持 nano-banana-pro) const IMAGE_SIZE_OPTIONS = [ { value: "1K", label: "1K", disabled: false }, { value: "2K", label: "2K ⚡", disabled: false }, // 默认推荐 { value: "4K", label: "4K 🐌", disabled: false }, // 4K较慢 ] as const; export function ImageParamsBar({ modelName = "Gemini 图片生成", initialParams, onParamsChange, inline = false, }: ImageParamsBarProps) { const [params, setParams] = useState({ aspectRatio: "auto", imageSize: "2K", // 默认 2K ...initialParams, }); // 🆕 监听 initialParams 变化,确保状态同步 useEffect(() => { console.log("[ImageParamsBar] Mount/Update - initialParams:", initialParams); if (initialParams) { setParams({ aspectRatio: "auto", imageSize: "2K", ...initialParams, }); } }, [initialParams]); const updateParam = ( key: K, value: ImageGenerationParams[K] ) => { const newParams = { ...params, [key]: value }; console.log("[ImageParamsBar] Updating param:", key, "=", value); console.log("[ImageParamsBar] New params:", newParams); setParams(newParams); onParamsChange?.(newParams); }; // 内联模式:只返回参数按钮,嵌入工具栏 if (inline) { return (
{/* 图片比例 */}
{ASPECT_RATIO_OPTIONS.map((option) => ( ))}
{/* 分辨率 */} {IMAGE_SIZE_OPTIONS.map((option) => ( updateParam("imageSize", option.value)} className="focus-visible:ring-0 focus-visible:ring-offset-0 focus:outline-none focus:ring-0" > {option.label} ))}
); } // 非内联模式(暂时不实现,因为只需要内联模式) return null; }