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:
@@ -433,7 +433,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?.previewData);
|
const [showCanvas, setShowCanvas] = useState(activeTab?.showCanvas ?? !!activeTab?.previewData);
|
||||||
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);
|
||||||
|
|
||||||
@@ -446,7 +446,7 @@ export default function AIAssist() {
|
|||||||
if (activeTab) {
|
if (activeTab) {
|
||||||
setCurrentAgent(activeTab.currentAgent || "general");
|
setCurrentAgent(activeTab.currentAgent || "general");
|
||||||
setPreviewData(activeTab.previewData || null);
|
setPreviewData(activeTab.previewData || null);
|
||||||
setShowCanvas(!!activeTab.previewData);
|
setShowCanvas(activeTab.showCanvas ?? !!activeTab.previewData);
|
||||||
setViewMode("preview");
|
setViewMode("preview");
|
||||||
setAssistStep("idle");
|
setAssistStep("idle");
|
||||||
setAiPlan(null);
|
setAiPlan(null);
|
||||||
@@ -603,7 +603,8 @@ export default function AIAssist() {
|
|||||||
updateTabById(requestTabId, {
|
updateTabById(requestTabId, {
|
||||||
history: [...updatedHistory.slice(0, -1), lastMsg],
|
history: [...updatedHistory.slice(0, -1), lastMsg],
|
||||||
previewData: preview || undefined,
|
previewData: preview || undefined,
|
||||||
currentAgent: agent
|
currentAgent: agent,
|
||||||
|
showCanvas: !!preview
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
signal: controller.signal
|
signal: controller.signal
|
||||||
@@ -649,7 +650,8 @@ export default function AIAssist() {
|
|||||||
updateActiveTab({
|
updateActiveTab({
|
||||||
history: [],
|
history: [],
|
||||||
previewData: null,
|
previewData: null,
|
||||||
currentAgent: "general"
|
currentAgent: "general",
|
||||||
|
showCanvas: false
|
||||||
});
|
});
|
||||||
setPreviewData(null);
|
setPreviewData(null);
|
||||||
setShowCanvas(false);
|
setShowCanvas(false);
|
||||||
@@ -1000,7 +1002,10 @@ export default function AIAssist() {
|
|||||||
variant="ghost"
|
variant="ghost"
|
||||||
size="icon"
|
size="icon"
|
||||||
className="h-10 w-10 text-blue-200/70 hover:text-rose-400 hover:bg-rose-500/10 rounded-2xl"
|
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" />
|
<X className="h-5 w-5" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ interface AIAssistTab {
|
|||||||
title: string;
|
title: string;
|
||||||
history: AIAssistMessage[];
|
history: AIAssistMessage[];
|
||||||
currentAgent: string;
|
currentAgent: string;
|
||||||
previewData?: any | null; // PreviewData type from AIAssist
|
previewData?: any | null;
|
||||||
|
showCanvas?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface AppState {
|
interface AppState {
|
||||||
|
|||||||
Reference in New Issue
Block a user