Bound retained workspace screens (#1472)

* fix(app): prune retained workspace deck entries

* fix(app): narrow workspace deck retention selectors

* fix(app): preserve deck lru during route transitions

* test(app): update startup reconnect expectation
This commit is contained in:
Mohamed Boudra
2026-06-11 17:00:05 +00:00
committed by GitHub
parent c0614c3207
commit 62d9e656d7
7 changed files with 317 additions and 34 deletions
@@ -3,11 +3,13 @@ import { useStoreWithEqualityFn } from "zustand/traditional";
import { useSidebarOrderStore } from "@/stores/sidebar-order-store";
import {
composeWorkspaceStructure,
selectHasHydratedWorkspaces,
selectHasWorkspaces,
selectProjectOrder,
selectRecommendedProjectPaths,
selectResolveWorkspaceIdByCwd,
selectWorkspace,
selectWorkspaceExists,
selectWorkspaceExecutionAuthority,
selectWorkspaceFields,
selectWorkspaceKeys,
@@ -54,6 +56,22 @@ export function useWorkspaceFields<T>(
);
}
export function useWorkspaceExists(serverId: string | null, workspaceId: string | null): boolean {
return useStoreWithEqualityFn(
useSessionStore,
(state) => selectWorkspaceExists(state, serverId, workspaceId),
workspaceEqualityFns.identity,
);
}
export function useHasHydratedWorkspaces(serverId: string | null): boolean {
return useStoreWithEqualityFn(
useSessionStore,
(state) => selectHasHydratedWorkspaces(state, serverId),
workspaceEqualityFns.identity,
);
}
export function useWorkspaceExecutionAuthority(
serverId: string | null,
workspaceId: string | null,
@@ -17,7 +17,10 @@ export type { DesktopBadgeWorkspaceStatus } from "@/utils/desktop-badge-state";
export type { WorkspaceStructure, WorkspaceStructureProject } from "@/projects/workspace-structure";
export interface SessionsSnapshot {
sessions: Record<string, { workspaces: Map<string, WorkspaceDescriptor> }>;
sessions: Record<
string,
{ hasHydratedWorkspaces?: boolean; workspaces: Map<string, WorkspaceDescriptor> }
>;
}
export interface SidebarOrderSnapshot {
@@ -110,6 +113,21 @@ export function selectWorkspaceFields<T>(
return workspace ? project(workspace) : null;
}
export function selectWorkspaceExists(
state: SessionsSnapshot,
serverId: string | null,
workspaceId: string | null,
): boolean {
return selectWorkspace(state, serverId, workspaceId) !== null;
}
export function selectHasHydratedWorkspaces(
state: SessionsSnapshot,
serverId: string | null,
): boolean {
return serverId ? (state.sessions[serverId]?.hasHydratedWorkspaces ?? false) : false;
}
export function selectWorkspaceExecutionAuthority(
state: SessionsSnapshot,
serverId: string | null,