From 3f5fc12b4c04ea57ca8111db7ac9e8f79788404b Mon Sep 17 00:00:00 2001 From: Yichen Jiang Date: Wed, 19 Aug 2026 15:40:49 +0800 Subject: [PATCH] fix(web): restore settings focus after commit --- .../ui-settings-general/src/client/SettingsRoot.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/client/ui-settings-general/src/client/SettingsRoot.tsx b/packages/client/ui-settings-general/src/client/SettingsRoot.tsx index 728a7441aa..5c5498738e 100644 --- a/packages/client/ui-settings-general/src/client/SettingsRoot.tsx +++ b/packages/client/ui-settings-general/src/client/SettingsRoot.tsx @@ -107,12 +107,16 @@ export function SettingsRoot(props: SettingsRootComponentProps) { const [activeId, setActiveId] = useState(undefined) const [completedOnboarding, setCompletedOnboarding] = useState>(() => new Set()) const triggerButton = useRef(null) + const wasOpen = useRef(open) const close = useCallback(() => { setOpen(false) setActiveId(undefined) - // Defer until React flushes the close state so panel unmount cannot steal focus; an unmounted root clears the ref. - queueMicrotask(() => { triggerButton.current?.focus() }) }, []) + // Restore after the close commit, when the dialog can no longer own focus. + useEffect(() => { + if (wasOpen.current && !open) triggerButton.current?.focus() + wasOpen.current = open + }, [open]) const openSection = useCallback((id: string) => { setActiveId(id) setOpen(true)