fix(sidebar): preserve pins after partial session loads

This commit is contained in:
Bohdan Triapitsyn
2026-07-12 00:51:36 +03:00
parent fb173067f5
commit 0daad180a1
3 changed files with 10 additions and 6 deletions
@@ -320,6 +320,7 @@ export const SessionSidebar: React.FC<SessionSidebarProps> = ({
const liveSessions = useAllLiveSessions();
const isVSCode = React.useMemo(() => isVSCodeRuntime(), []);
const hasLoadedGlobalSessions = useGlobalSessionsStore((state) => state.hasLoaded);
const hasAuthoritativeGlobalSessions = useGlobalSessionsStore((state) => state.status === 'ready');
const globalActiveSessions = useGlobalSessionsStore((state) => state.activeSessions);
const archivedSessions = useGlobalSessionsStore((state) => state.archivedSessions);
const currentSessionId = useSessionUIStore((state) => state.currentSessionId);
@@ -539,7 +540,7 @@ export const SessionSidebar: React.FC<SessionSidebarProps> = ({
const { scheduleCollapsedProjectsPersist } = useSidebarPersistence({
isVSCode,
hasLoadedGlobalSessions,
hasAuthoritativeGlobalSessions,
safeStorage,
keys: {
sessionExpanded: SESSION_EXPANDED_STORAGE_KEY,
@@ -33,7 +33,7 @@ const LEGACY_EXPANSION_CONTEXT_PREFIXES = [
type Args = {
isVSCode: boolean;
hasLoadedGlobalSessions: boolean;
hasAuthoritativeGlobalSessions: boolean;
safeStorage: SafeStorageLike;
keys: Keys;
sessions: Session[];
@@ -49,7 +49,7 @@ type Args = {
export const useSidebarPersistence = (args: Args) => {
const {
isVSCode,
hasLoadedGlobalSessions,
hasAuthoritativeGlobalSessions,
safeStorage,
keys,
sessions,
@@ -151,14 +151,14 @@ export const useSidebarPersistence = (args: Args) => {
}, [keys.projectCollapse, keys.sessionExpanded, keys.sessionExpandedLegacy, safeStorage, setCollapsedProjects, setExpandedParents]);
React.useEffect(() => {
if (!hasLoadedGlobalSessions) {
if (!hasAuthoritativeGlobalSessions) {
return;
}
setPinnedSessionIds((prev) => {
return prunePinnedSessionIds(sessions, prev);
});
}, [hasLoadedGlobalSessions, sessions, setPinnedSessionIds]);
}, [hasAuthoritativeGlobalSessions, sessions, setPinnedSessionIds]);
React.useEffect(() => {
try {
@@ -420,7 +420,10 @@ export const useGlobalSessionsStore = create<GlobalSessionsState>((set, get) =>
// instance — drop it.
return { activeSessions: [], archivedSessions: [] };
}
set((state) => applySnapshot(state, nextActiveSessions, nextArchivedSessions, 'ready'));
const status = activeResult.status === 'fulfilled' && archivedResult.status === 'fulfilled'
? 'ready'
: 'error';
set((state) => applySnapshot(state, nextActiveSessions, nextArchivedSessions, status));
return { activeSessions: nextActiveSessions, archivedSessions: nextArchivedSessions };
} catch (error) {
if (generation !== loadGeneration) {