From e3e4973c7f22ad2ddd4e08d4e51f6440aaaa3b70 Mon Sep 17 00:00:00 2001 From: killersteps <34531389+killersteps@users.noreply.github.com> Date: Mon, 3 Aug 2026 14:30:28 +0800 Subject: [PATCH] fix: persist file explorer collapsed state --- components/SessionSidebar.tsx | 13 +++++++++- lib/file-explorer-state.test.mjs | 43 ++++++++++++++++++++++++++++++++ lib/file-explorer-state.ts | 32 ++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 lib/file-explorer-state.test.mjs create mode 100644 lib/file-explorer-state.ts diff --git a/components/SessionSidebar.tsx b/components/SessionSidebar.tsx index 0514b55e5..6530a170c 100644 --- a/components/SessionSidebar.tsx +++ b/components/SessionSidebar.tsx @@ -2,6 +2,7 @@ import { useEffect, useLayoutEffect, useState, useCallback, useRef, type CSSProperties, type ReactNode } from "react"; import type { SessionInfo } from "@/lib/types"; +import { loadExplorerOpen, saveExplorerOpen } from "@/lib/file-explorer-state"; import { useI18n } from "@/hooks/useI18n"; import { DirectoryPicker } from "./DirectoryPicker"; import { FileExplorer, type FileExplorerHandle } from "./FileExplorer"; @@ -465,6 +466,12 @@ export function SessionSidebar({ selectedSessionId, onSelectSession, onNewSessio loadSessions(isFirst); }, [loadSessions, refreshKey]); + // Browser storage is unavailable during server rendering. Restore the panel + // preference after hydration so a collapsed explorer stays collapsed on reload. + useEffect(() => { + setExplorerOpen(loadExplorerOpen()); + }, []); + // Persist unread markers so they survive a browser refresh before the user // has actually opened the completed session. useEffect(() => { @@ -1558,7 +1565,11 @@ export function SessionSidebar({ selectedSessionId, onSelectSession, onNewSessio >