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
This commit is contained in:
Gemini AI
2025-12-29 03:28:20 +04:00
Unverified
parent 4630e23330
commit cfc1ded15e
2 changed files with 24 additions and 13 deletions

View File

@@ -425,7 +425,14 @@ export default function AIAssist() {
} = useStore(); } = useStore();
const t = translations[language].aiAssist; 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 aiAssistHistory = activeTab?.history || [];
const [input, setInput] = useState(""); const [input, setInput] = useState("");
@@ -433,7 +440,7 @@ export default function AIAssist() {
const [currentAgent, setCurrentAgent] = useState(activeTab?.currentAgent || "general"); const [currentAgent, setCurrentAgent] = useState(activeTab?.currentAgent || "general");
const [previewData, setPreviewData] = useState<PreviewData | null>(activeTab?.previewData || null); const [previewData, setPreviewData] = useState<PreviewData | null>(activeTab?.previewData || null);
const [availableModels, setAvailableModels] = useState<string[]>([]); const [availableModels, setAvailableModels] = useState<string[]>([]);
const [showCanvas, setShowCanvas] = useState(activeTab?.showCanvas ?? !!activeTab?.previewData); const [showCanvas, setShowCanvas] = useState(activeTab?.showCanvas === true);
const [viewMode, setViewMode] = useState<"preview" | "code">("preview"); const [viewMode, setViewMode] = useState<"preview" | "code">("preview");
const [abortController, setAbortController] = useState<AbortController | null>(null); const [abortController, setAbortController] = useState<AbortController | null>(null);
@@ -443,16 +450,18 @@ export default function AIAssist() {
// Sync local state when tab changes - FULL ISOLATION // Sync local state when tab changes - FULL ISOLATION
useEffect(() => { useEffect(() => {
if (activeTab) { // Explicitly reset ALL canvas-related state based on the tab's data
setCurrentAgent(activeTab.currentAgent || "general"); const tabPreview = activeTab?.previewData || null;
setPreviewData(activeTab.previewData || null); const tabShowCanvas = activeTab?.showCanvas === true; // Strict check
setShowCanvas(activeTab.showCanvas ?? !!activeTab.previewData);
setViewMode("preview"); setCurrentAgent(activeTab?.currentAgent || "general");
setAssistStep("idle"); setPreviewData(tabPreview);
setAiPlan(null); setShowCanvas(tabShowCanvas);
setInput(""); setViewMode("preview");
setIsProcessing(false); setAssistStep("idle");
} setAiPlan(null);
setInput("");
setIsProcessing(false);
}, [activeTabId]); }, [activeTabId]);
const [status, setStatus] = useState<string | null>(null); const [status, setStatus] = useState<string | null>(null);

View File

@@ -128,7 +128,9 @@ const useStore = create<AppState>((set) => ({
id: newId, id: newId,
title: `Chat ${state.aiAssistTabs.length + 1}`, title: `Chat ${state.aiAssistTabs.length + 1}`,
history: [], history: [],
currentAgent: agent currentAgent: agent,
previewData: null,
showCanvas: false
}; };
return { return {
aiAssistTabs: [...state.aiAssistTabs, newTab], aiAssistTabs: [...state.aiAssistTabs, newTab],