From a906dd0084494eccafdc4de511c535f38c144de8 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sat, 30 May 2026 04:28:14 -0700 Subject: [PATCH] perf: clean smart name input focus frame from ref --- .../new-workspace/SmartWorkspaceNameField.tsx | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/renderer/src/components/new-workspace/SmartWorkspaceNameField.tsx b/src/renderer/src/components/new-workspace/SmartWorkspaceNameField.tsx index a45fb10145a..258cb2abc6f 100644 --- a/src/renderer/src/components/new-workspace/SmartWorkspaceNameField.tsx +++ b/src/renderer/src/components/new-workspace/SmartWorkspaceNameField.tsx @@ -231,16 +231,6 @@ export default function SmartWorkspaceNameField({ [gitlabAvailable, linearAvailable, textOnly] ) - const setInputNode = useCallback( - (node: HTMLInputElement | null) => { - localInputRef.current = node - if (inputRef) { - inputRef.current = node - } - }, - [inputRef] - ) - const cancelSelectedSourceFocusFrame = useCallback((): void => { if (selectedSourceFocusFrameRef.current === null) { return @@ -257,12 +247,20 @@ export default function SmartWorkspaceNameField({ localInputFocusFrameRef.current = null }, []) - useEffect( - () => () => { - cancelSelectedSourceFocusFrame() - cancelLocalInputFocusFrame() + const setInputNode = useCallback( + (node: HTMLInputElement | null) => { + if (!node) { + // Why: tab-mode changes schedule a deferred input focus. If the input + // disappears first, cancel at the input owner boundary instead of + // keeping a cleanup-only Effect for this one animation frame. + cancelLocalInputFocusFrame() + } + localInputRef.current = node + if (inputRef) { + inputRef.current = node + } }, - [cancelLocalInputFocusFrame, cancelSelectedSourceFocusFrame] + [cancelLocalInputFocusFrame, inputRef] ) useEffect(() => {