From d6b2e154ef3756aecab936d47a66ea201f3a5495 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Mon, 17 Aug 2026 09:32:01 +0000 Subject: [PATCH] fix(app): keep recent project picker open --- packages/app/src/context/global.tsx | 4 + packages/app/src/i18n/en.ts | 3 +- .../app/src/pages/home/home-controller.ts | 3 +- .../pages/home/home-projects-controller.tsx | 3 +- .../app/src/pages/home/home-projects-view.tsx | 92 +++++++++---------- packages/app/src/pages/home/home-projects.tsx | 14 ++- 6 files changed, 64 insertions(+), 55 deletions(-) diff --git a/packages/app/src/context/global.tsx b/packages/app/src/context/global.tsx index cb981891c6d..d62f41294be 100644 --- a/packages/app/src/context/global.tsx +++ b/packages/app/src/context/global.tsx @@ -138,6 +138,9 @@ function createServerController( limit: RECENTLY_CLOSED_DISPLAY_LIMIT, }).map((worktree) => enrich({ worktree, expanded: false })) }) + const recentProjectsList = createMemo(() => + [...recentlyClosedList(), ...knownProjectsList()].slice(0, RECENTLY_CLOSED_DISPLAY_LIMIT), + ) const isLocal = (conn?.type === "sidecar" && conn.variant === "base") || (conn?.type === "http" && isLocalHost(conn.http.url)) @@ -151,6 +154,7 @@ function createServerController( list: projectsList, recentlyClosed: recentlyClosedList, known: knownProjectsList, + recent: recentProjectsList, }, permission, notification, diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index ea5e05fe754..e84f09ee663 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -637,8 +637,7 @@ export const dict = { "home.title": "Home", "home.projects": "Projects", "home.project.add": "Add project", - "home.recentlyClosed": "Recently closed", - "home.knownProjects": "Known projects", + "home.recentlyClosed": "Recent projects", "home.server.collapse": "Collapse server projects", "home.server.expand": "Expand server projects", "home.sessions.search.placeholder": "Search sessions", diff --git a/packages/app/src/pages/home/home-controller.ts b/packages/app/src/pages/home/home-controller.ts index d5673182763..b6c21739e10 100644 --- a/packages/app/src/pages/home/home-controller.ts +++ b/packages/app/src/pages/home/home-controller.ts @@ -63,8 +63,7 @@ export function createHomeController() { selected: selectedProject, newSession: newSessionProject, forServer: (conn: ServerConnection.Any) => global.ensureServerCtx(conn).projects.list(), - recentlyClosedForServer: (conn: ServerConnection.Any) => global.ensureServerCtx(conn).projects.recentlyClosed(), - knownForServer: (conn: ServerConnection.Any) => global.ensureServerCtx(conn).projects.known(), + recentForServer: (conn: ServerConnection.Any) => global.ensureServerCtx(conn).projects.recent(), homedirForServer: (conn: ServerConnection.Any) => global.ensureServerCtx(conn).sync.data.path.home, select: (conn: ServerConnection.Any, directory: string) => { const key = ServerConnection.key(conn) diff --git a/packages/app/src/pages/home/home-projects-controller.tsx b/packages/app/src/pages/home/home-projects-controller.tsx index 3409d768348..8ae23a8bc47 100644 --- a/packages/app/src/pages/home/home-projects-controller.tsx +++ b/packages/app/src/pages/home/home-projects-controller.tsx @@ -68,8 +68,7 @@ export function createHomeProjectsController(home: HomeController) { }, project: { list: home.project.list, - recentlyClosedForServer: home.project.recentlyClosedForServer, - knownForServer: home.project.knownForServer, + recentForServer: home.project.recentForServer, homedirForServer: home.project.homedirForServer, select: home.project.select, add: home.project.add, diff --git a/packages/app/src/pages/home/home-projects-view.tsx b/packages/app/src/pages/home/home-projects-view.tsx index 8bb03b9a8b4..84b53fb16f8 100644 --- a/packages/app/src/pages/home/home-projects-view.tsx +++ b/packages/app/src/pages/home/home-projects-view.tsx @@ -34,8 +34,8 @@ export type HomeProjectsViewProps = { selection: HomeProjectSelection serverHealth: (server: ServerConnection.Any) => ServerHealth | undefined projectsForServer: (server: ServerConnection.Any) => LocalProject[] - recentlyClosedForServer: (server: ServerConnection.Any) => LocalProject[] - knownForServer: (server: ServerConnection.Any) => LocalProject[] + recentForServer: (server: ServerConnection.Any) => LocalProject[] + showRecentForServer: (server: ServerConnection.Any) => boolean homedirForServer: (server: ServerConnection.Any) => string collapsed: (server: ServerConnection.Any) => boolean canDefaultServer: boolean @@ -85,11 +85,7 @@ export function HomeProjectsView(props: HomeProjectsViewProps) { 0 || - props.knownForServer(props.servers[0]).length > 0) - ) + !(props.showRecentForServer(props.servers[0]) && props.recentForServer(props.servers[0]).length > 0) } > @@ -112,13 +108,12 @@ export function HomeProjectsView(props: HomeProjectsViewProps) { fallback={
0} + when={!props.showRecentForServer(props.servers[0]) && props.projects.length > 0} fallback={ } > @@ -131,11 +126,11 @@ export function HomeProjectsView(props: HomeProjectsViewProps) { {(item) => { const projects = () => props.projectsForServer(item) - const recentlyClosed = () => props.recentlyClosedForServer(item) - const known = () => props.knownForServer(item) + const recent = () => props.recentForServer(item) const healthy = () => !!props.serverHealth(item)?.healthy const hasProjects = () => projects().length > 0 - const hasChildren = () => hasProjects() || recentlyClosed().length > 0 || known().length > 0 + const showRecent = () => props.showRecentForServer(item) + const hasChildren = () => hasProjects() || recent().length > 0 const collapsed = () => props.collapsed(item) return (
@@ -151,15 +146,8 @@ export function HomeProjectsView(props: HomeProjectsViewProps) {
- } + when={!showRecent() && hasProjects()} + fallback={} > @@ -415,8 +403,7 @@ function HomeProjectSlot( function HomeProjectEmpty( props: HomeProjectsViewProps & { server: ServerConnection.Any - recentlyClosed: LocalProject[] - known: LocalProject[] + items: LocalProject[] }, ) { const unreachable = () => props.serverHealth(props.server)?.healthy === false @@ -432,20 +419,12 @@ function HomeProjectEmpty( {props.language.t("home.project.add")} - 0}> + 0}>
{props.language.t("home.recentlyClosed")}
- - {(project) => } - -
- 0}> -
-
{props.language.t("home.knownProjects")}
-
- - {(project) => } + + {(project) => }
@@ -456,7 +435,6 @@ function HomeSuggestedProjectRow( props: HomeProjectsViewProps & { project: LocalProject server: ServerConnection.Any - kind: "recent" | "known" }, ) { const unreachable = () => props.serverHealth(props.server)?.healthy === false @@ -467,18 +445,38 @@ function HomeSuggestedProjectRow( return worktree } return ( - - props.onAddProjects(props.server, [props.project.worktree])} +
+ + props.onAddProjects(props.server, [props.project.worktree])} + > + + {displayName(props.project)} + + +
- - {displayName(props.project)} - - + + } + aria-label={props.language.t("home.project.add")} + disabled={unreachable()} + onClick={() => props.onAddProjects(props.server, [props.project.worktree])} + /> + +
+
) } diff --git a/packages/app/src/pages/home/home-projects.tsx b/packages/app/src/pages/home/home-projects.tsx index 6962a6b525a..d7397986524 100644 --- a/packages/app/src/pages/home/home-projects.tsx +++ b/packages/app/src/pages/home/home-projects.tsx @@ -1,8 +1,18 @@ import type { HomeProjectsController } from "./home-projects-controller" import { HomeProjectsView } from "./home-projects-view" import type { HomeScrollController } from "./home-scroll-controller" +import { ServerConnection } from "@/context/servers" export function HomeProjects(props: { projects: HomeProjectsController; scroll: HomeScrollController }) { + const recentMode = new Map() + const showRecentForServer = (server: ServerConnection.Any) => { + const key = ServerConnection.key(server) + if (recentMode.get(key)) return true + if (props.projects.server.projects(server).length > 0) return false + recentMode.set(key, true) + return true + } + return (