From 31191f1536e6a5100e7eb286b47e8d11e0f2a5a6 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Wed, 29 Jul 2026 19:05:54 -0700 Subject: [PATCH] fix(mobile): keep terminal state updaters pure --- .../app/h/[hostId]/session/[worktreeId].tsx | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/mobile/app/h/[hostId]/session/[worktreeId].tsx b/mobile/app/h/[hostId]/session/[worktreeId].tsx index 334b1aaa40e..cc491d1c072 100644 --- a/mobile/app/h/[hostId]/session/[worktreeId].tsx +++ b/mobile/app/h/[hostId]/session/[worktreeId].tsx @@ -3814,25 +3814,23 @@ export default function SessionScreen() { pendingActiveTerminalHandleRef.current = createdHandle activeHandleRef.current = createdHandle setActiveHandle(createdHandle) - setTerminals((prev) => { - const existing = prev.find((terminal) => terminal.handle === createdHandle) - const createdTerminal: Terminal = { - handle: createdHandle, - title: created.title || existing?.title || t('m.1ELofI0'), - terminalTheme: created.terminalTheme ?? existing?.terminalTheme, - isActive: true - } - if (existing) { - const next = prev.map((terminal) => + const previousTerminals = terminalsRef.current + const existing = previousTerminals.find((terminal) => terminal.handle === createdHandle) + const createdTerminal: Terminal = { + handle: createdHandle, + title: created.title || existing?.title || t('m.1ELofI0'), + terminalTheme: created.terminalTheme ?? existing?.terminalTheme, + isActive: true + } + const nextTerminals = existing + ? previousTerminals.map((terminal) => terminal.handle === createdHandle ? { ...terminal, ...createdTerminal } : terminal ) - terminalsRef.current = next - return terminalRecordsEqual(prev, next) ? prev : next - } - const next = [...prev, createdTerminal] - terminalsRef.current = next - return next - }) + : [...previousTerminals, createdTerminal] + if (!terminalRecordsEqual(previousTerminals, nextTerminals)) { + terminalsRef.current = nextTerminals + setTerminals(nextTerminals) + } subscribeToTerminal(createdHandle) if (options?.initialPrompt?.trim()) { void client @@ -4066,15 +4064,13 @@ export default function SessionScreen() { title }) if (response.ok) { - setTerminals((prev) => { - const next = prev.map((terminal) => - terminal.handle === target.handle - ? { ...terminal, title: title || t('m.1ELofI0') } - : terminal - ) - terminalsRef.current = next - return next - }) + const nextTerminals = terminalsRef.current.map((terminal) => + terminal.handle === target.handle + ? { ...terminal, title: title || t('m.1ELofI0') } + : terminal + ) + terminalsRef.current = nextTerminals + setTerminals(nextTerminals) scheduleDelayedAction(() => void fetchTerminals(), 300) } } catch {