fix(web): break infinite loop in TerminalTabs when shell list is empty

TerminalTabs's hydrate effect set activeShellId to "" whenever the
list was empty or the current active was missing. "" is falsy, so
on the next render the same branch fired again with currentActive
still "" and ids still [] — setActiveShell(ws, "") in a tight
loop, every render triggering a Zustand store update which
re-rendered the component. Maximum update depth exceeded.

Fix: only set the active shell when ids has at least one entry. The
auto-start effect above already creates a shell when the list is
empty, so the next list refetch will populate ids and this branch
will pick a real candidate naturally.
This commit is contained in:
tao.chen
2026-07-06 17:37:05 +08:00
parent 79292c9f38
commit 0122b8bb07
+7 -2
View File
@@ -107,8 +107,13 @@ function TerminalTabs({ workspaceId }: { workspaceId: string }) {
setShellsForWorkspace(workspaceId, ids);
}
const currentActive = activeShellId;
if (!currentActive || !ids.includes(currentActive)) {
setActiveShell(workspaceId, ids[0] ?? "");
// Only set an active shell when the list is non-empty. If ids is empty,
// the auto-start effect above will create a shell; the next list refetch
// will populate ids and this branch will run with a real candidate.
// (Setting it to "" here would loop: "" is falsy, so the same branch
// would fire on the next render.)
if (ids.length > 0 && (!currentActive || !ids.includes(currentActive))) {
setActiveShell(workspaceId, ids[0]);
}
}, [
workspaceId,