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
This commit is contained in:
Gemini AI
2025-12-29 03:21:54 +04:00
Unverified
parent 9996622b12
commit 4630e23330
2 changed files with 12 additions and 6 deletions

View File

@@ -433,7 +433,7 @@ export default function AIAssist() {
const [currentAgent, setCurrentAgent] = useState(activeTab?.currentAgent || "general");
const [previewData, setPreviewData] = useState<PreviewData | null>(activeTab?.previewData || null);
const [availableModels, setAvailableModels] = useState<string[]>([]);
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<AbortController | null>(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 });
}}
>
<X className="h-5 w-5" />
</Button>

View File

@@ -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 {