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
>