diff --git a/web/src/components/layout/WorkspaceShell.tsx b/web/src/components/layout/WorkspaceShell.tsx index 9ee3bff..0b1174c 100644 --- a/web/src/components/layout/WorkspaceShell.tsx +++ b/web/src/components/layout/WorkspaceShell.tsx @@ -12,6 +12,12 @@ import { FileExplorerPanel } from "@/components/workspace/FileExplorerPanel"; import { StatusBar } from "@/components/workspace/StatusBar"; import { WorkspaceSelector } from "@/components/workspace/WorkspaceSelector"; import { useWorkspaceUiStore } from "@/lib/store/workspace-ui-store"; + +// Module-level constant so the selector returns a stable reference when +// the workspace has no shells yet. Returning a freshly-allocated `[]` from +// the selector (via `?? []`) would make useSyncExternalStore see a new +// snapshot on every render and loop. +const EMPTY_SHELLS: string[] = []; import { useProcessRestart, useProcessStart, @@ -72,7 +78,7 @@ function BottomTabs({ workspaceId }: { workspaceId: string }) { } function TerminalTabs({ workspaceId }: { workspaceId: string }) { - const shells = useWorkspaceUiStore((s) => s.shellsByWorkspace[workspaceId] ?? []); + const shells = useWorkspaceUiStore((s) => s.shellsByWorkspace[workspaceId] ?? EMPTY_SHELLS); const activeShellId = useWorkspaceUiStore((s) => s.activeShellIdByWorkspace[workspaceId]); const setShellsForWorkspace = useWorkspaceUiStore((s) => s.setShellsForWorkspace); const addShellToWorkspace = useWorkspaceUiStore((s) => s.addShellToWorkspace);