diff --git a/src/app/App.tsx b/src/app/App.tsx index 7de0d9372..edd424f66 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -3014,29 +3014,6 @@ function Workspace({ onOpenTerminal(terminalCwd); }, [terminalCwd, onOpenTerminal]); - const onShowProjectTerminal = useCallback(() => { - leaveCoveringMono(); - const dock = findProjectTerminal(projectTerminalsRef.current, projectCwd); - if (dock && dock.pane.files.length > 0) { - if (!dock.open) { - setProjectTerminals((prev) => - mapProjectTerminal(prev, projectCwd, (entry) => - withDockOpen(entry, true), - ), - ); - } - focusProjectTerminal(); - return; - } - onOpenTerminal(terminalCwd); - }, [ - terminalCwd, - focusProjectTerminal, - leaveCoveringMono, - onOpenTerminal, - projectCwd, - ]); - const onNewTerminalInSession = useCallback( (sessionId: string) => { const session = sessionsRef.current.find( @@ -13381,9 +13358,9 @@ function Workspace({ ? onNewTerminal : undefined } - onShowTerminal={ + onToggleProjectTerminal={ !monoCovers && isLocalProject(projectCwd) - ? onShowProjectTerminal + ? onToggleProjectTerminal : undefined } projectTerminalActive={ @@ -13391,6 +13368,9 @@ function Workspace({ !!currentProjectDock && currentProjectDock.pane.files.length > 0 } + projectTerminalOpen={ + !monoCovers && !!currentProjectDock?.open + } /> )} diff --git a/src/app/shell/UsageFooter.test.ts b/src/app/shell/UsageFooter.test.ts index 2969d1740..2ba3a0fb8 100644 --- a/src/app/shell/UsageFooter.test.ts +++ b/src/app/shell/UsageFooter.test.ts @@ -1,8 +1,28 @@ -import { createElement } from "react"; +// @vitest-environment happy-dom +import { act, createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; -import { describe, expect, it, vi } from "vitest"; +import { createRoot, type Root } from "react-dom/client"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { UsageFooter } from "./UsageFooter"; +let container: HTMLDivElement; +let root: Root | null = null; + +beforeEach(() => { + vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true); + container = document.createElement("div"); + document.body.append(container); +}); + +afterEach(() => { + if (root) { + act(() => root!.unmount()); + root = null; + } + container.remove(); + vi.unstubAllGlobals(); +}); + describe("UsageFooter terminal control", () => { it("replaces the generic terminal button with the live process control", () => { const markup = renderToStaticMarkup( @@ -19,7 +39,7 @@ describe("UsageFooter terminal control", () => { terminalOpen: true, onToggleTerminal: vi.fn(), onNewTerminal: vi.fn(), - onShowTerminal: vi.fn(), + onToggleProjectTerminal: vi.fn(), projectTerminalActive: true, }), ); @@ -40,4 +60,98 @@ describe("UsageFooter terminal control", () => { expect(markup).toContain(">Terminal"); expect(markup.match(/