From cfc1ded15e1b51a644a8606afcc1869fe8b4445b Mon Sep 17 00:00:00 2001 From: Gemini AI Date: Mon, 29 Dec 2025 03:28:20 +0400 Subject: [PATCH] fix: strict tab canvas isolation - New tabs explicitly have showCanvas: false and previewData: null - Tab sync uses strict boolean check (showCanvas === true) - Default tab fallback includes canvas defaults - Switching to new tab now properly hides canvas from previous tab - Each tab's preview is completely independent --- components/AIAssist.tsx | 33 +++++++++++++++++++++------------ lib/store.ts | 4 +++- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/components/AIAssist.tsx b/components/AIAssist.tsx index 0bcbb17..c8687d3 100644 --- a/components/AIAssist.tsx +++ b/components/AIAssist.tsx @@ -425,7 +425,14 @@ export default function AIAssist() { } = useStore(); const t = translations[language].aiAssist; - const activeTab = aiAssistTabs?.find(t => t.id === activeTabId) || aiAssistTabs?.[0] || { id: 'default', title: 'New Chat', history: [], currentAgent: 'general' }; + const activeTab = aiAssistTabs?.find(t => t.id === activeTabId) || aiAssistTabs?.[0] || { + id: 'default', + title: 'New Chat', + history: [], + currentAgent: 'general', + previewData: null, + showCanvas: false + }; const aiAssistHistory = activeTab?.history || []; const [input, setInput] = useState(""); @@ -433,7 +440,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?.showCanvas ?? !!activeTab?.previewData); + const [showCanvas, setShowCanvas] = useState(activeTab?.showCanvas === true); const [viewMode, setViewMode] = useState<"preview" | "code">("preview"); const [abortController, setAbortController] = useState(null); @@ -443,16 +450,18 @@ export default function AIAssist() { // Sync local state when tab changes - FULL ISOLATION useEffect(() => { - if (activeTab) { - setCurrentAgent(activeTab.currentAgent || "general"); - setPreviewData(activeTab.previewData || null); - setShowCanvas(activeTab.showCanvas ?? !!activeTab.previewData); - setViewMode("preview"); - setAssistStep("idle"); - setAiPlan(null); - setInput(""); - setIsProcessing(false); - } + // Explicitly reset ALL canvas-related state based on the tab's data + const tabPreview = activeTab?.previewData || null; + const tabShowCanvas = activeTab?.showCanvas === true; // Strict check + + setCurrentAgent(activeTab?.currentAgent || "general"); + setPreviewData(tabPreview); + setShowCanvas(tabShowCanvas); + setViewMode("preview"); + setAssistStep("idle"); + setAiPlan(null); + setInput(""); + setIsProcessing(false); }, [activeTabId]); const [status, setStatus] = useState(null); diff --git a/lib/store.ts b/lib/store.ts index 22ad7fd..8aafde4 100644 --- a/lib/store.ts +++ b/lib/store.ts @@ -128,7 +128,9 @@ const useStore = create((set) => ({ id: newId, title: `Chat ${state.aiAssistTabs.length + 1}`, history: [], - currentAgent: agent + currentAgent: agent, + previewData: null, + showCanvas: false }; return { aiAssistTabs: [...state.aiAssistTabs, newTab],