From 4630e2333000baf4de4fb6113e53469972213438 Mon Sep 17 00:00:00 2001 From: Gemini AI Date: Mon, 29 Dec 2025 03:21:54 +0400 Subject: [PATCH] feat: independent canvas per tab - Added showCanvas to AIAssistTab interface in store - Each tab now has its own canvas visibility state - Canvas state syncs when switching tabs - Closing canvas saves state to tab - Clearing history resets canvas state - Streaming updates save showCanvas: true to the request's tab - Complete tab isolation: history, agent, preview, AND canvas --- components/AIAssist.tsx | 15 ++++++++++----- lib/store.ts | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/components/AIAssist.tsx b/components/AIAssist.tsx index c1136f5..0bcbb17 100644 --- a/components/AIAssist.tsx +++ b/components/AIAssist.tsx @@ -433,7 +433,7 @@ export default function AIAssist() { const [currentAgent, setCurrentAgent] = useState(activeTab?.currentAgent || "general"); const [previewData, setPreviewData] = useState(activeTab?.previewData || null); const [availableModels, setAvailableModels] = useState([]); - const [showCanvas, setShowCanvas] = useState(!!activeTab?.previewData); + const [showCanvas, setShowCanvas] = useState(activeTab?.showCanvas ?? !!activeTab?.previewData); const [viewMode, setViewMode] = useState<"preview" | "code">("preview"); const [abortController, setAbortController] = useState(null); @@ -446,7 +446,7 @@ export default function AIAssist() { if (activeTab) { setCurrentAgent(activeTab.currentAgent || "general"); setPreviewData(activeTab.previewData || null); - setShowCanvas(!!activeTab.previewData); + setShowCanvas(activeTab.showCanvas ?? !!activeTab.previewData); setViewMode("preview"); setAssistStep("idle"); setAiPlan(null); @@ -603,7 +603,8 @@ export default function AIAssist() { updateTabById(requestTabId, { history: [...updatedHistory.slice(0, -1), lastMsg], previewData: preview || undefined, - currentAgent: agent + currentAgent: agent, + showCanvas: !!preview }); }, signal: controller.signal @@ -649,7 +650,8 @@ export default function AIAssist() { updateActiveTab({ history: [], previewData: null, - currentAgent: "general" + currentAgent: "general", + showCanvas: false }); setPreviewData(null); setShowCanvas(false); @@ -1000,7 +1002,10 @@ export default function AIAssist() { variant="ghost" size="icon" className="h-10 w-10 text-blue-200/70 hover:text-rose-400 hover:bg-rose-500/10 rounded-2xl" - onClick={() => setShowCanvas(false)} + onClick={() => { + setShowCanvas(false); + updateActiveTab({ showCanvas: false }); + }} > diff --git a/lib/store.ts b/lib/store.ts index 5140093..22ad7fd 100644 --- a/lib/store.ts +++ b/lib/store.ts @@ -6,7 +6,8 @@ interface AIAssistTab { title: string; history: AIAssistMessage[]; currentAgent: string; - previewData?: any | null; // PreviewData type from AIAssist + previewData?: any | null; + showCanvas?: boolean; } interface AppState {