From 74792593b2bb1417b3487b2ad09e29eb92077595 Mon Sep 17 00:00:00 2001 From: 0xjjjjjj <0xjjjjjj@users.noreply.github.com> Date: Sat, 7 Mar 2026 21:28:55 -0800 Subject: [PATCH] fix: reset sidebar state on navigation to prevent ghost re-open Use React's canonical "store info from previous renders" pattern: conditional setState during render resets sidebar when pathname changes, preventing the sidebar from re-opening on back-navigation. Co-Authored-By: Claude Opus 4.6 --- frontend/src/components/templates/DashboardShell.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/templates/DashboardShell.tsx b/frontend/src/components/templates/DashboardShell.tsx index fa26b3b4..7a9ad76f 100644 --- a/frontend/src/components/templates/DashboardShell.tsx +++ b/frontend/src/components/templates/DashboardShell.tsx @@ -23,9 +23,13 @@ export function DashboardShell({ children }: { children: ReactNode }) { const { isSignedIn } = useAuth(); const isOnboardingPath = pathname === "/onboarding"; const [sidebarState, setSidebarState] = useState({ open: false, path: pathname }); - // Sidebar auto-closes on navigation: when pathname changes, the derived - // value becomes false without any setState or ref access during render. - const sidebarOpen = sidebarState.path === pathname && sidebarState.open; + // Close sidebar on navigation using React's "store info from previous + // renders" pattern — conditional setState during render resets immediately + // without extra commits, avoiding both set-state-in-effect and refs rules. + if (sidebarState.path !== pathname) { + setSidebarState({ open: false, path: pathname }); + } + const sidebarOpen = sidebarState.open; const meQuery = useGetMeApiV1UsersMeGet< getMeApiV1UsersMeGetResponse,