import { useCallback, useRef, useState } from "react"; import { aiGenerationClient } from "../../api/aiGenerationClient"; import { waitForTask } from "../../api/taskSubscription"; import { toast } from "../../components/toast/toastStore"; import type { CanvasImageNode } from "./canvasTypes"; interface CanvasToolPanelProps { imageUrl: string; imageNode: CanvasImageNode; onComplete: (resultUrl: string) => void; } export function CanvasMultiGridPanel({ imageUrl, onComplete }: CanvasToolPanelProps) { const [gridMode, setGridMode] = useState<"grid-4" | "grid-9">("grid-4"); const [prompt, setPrompt] = useState(""); const [loading, setLoading] = useState(false); const cancelRef = useRef(false); const handleGenerate = useCallback(async () => { if (!imageUrl) return; setLoading(true); cancelRef.current = false; try { const { taskId } = await aiGenerationClient.createImageTask({ model: "gpt-image-2", prompt: prompt || "基于参考图生成多宫格变体", referenceUrls: [imageUrl], gridMode, }); const resultUrl = await waitForTask(taskId, { kind: "image", abortRef: cancelRef }); if (resultUrl) { onComplete(resultUrl); toast.success("多宫格生成完成"); } } catch (err: unknown) { if (!cancelRef.current) toast.error(err instanceof Error ? err.message : "多宫格生成失败"); } finally { setLoading(false); } }, [imageUrl, prompt, gridMode, onComplete]); return (
{([["grid-4", "2×2"], ["grid-9", "3×3"]] as const).map(([value, label]) => ( ))}