diff --git a/packages/app/src/components/windows-app-menu.tsx b/packages/app/src/components/windows-app-menu.tsx index e12387c38dd..e823e9fdb0c 100644 --- a/packages/app/src/components/windows-app-menu.tsx +++ b/packages/app/src/components/windows-app-menu.tsx @@ -102,32 +102,42 @@ export function WindowsAppMenu(props: { if (entry.type === "separator") return if (entry.dynamic === "recentProjects") { const servers = global.servers.list() - const projects = servers.flatMap((server) => - global - .ensureServerCtx(server) - .projects.recent() - .map((project) => ({ server, project })), - ) + const groups = servers + .map((server) => ({ + server, + projects: global.ensureServerCtx(server).projects.recent().slice(0, 5), + })) + .filter((group) => group.projects.length > 0) return ( - - {(item) => ( - 1 - ? `${displayName(item.project)} — ${serverName(item.server)}` - : displayName(item.project) - } - disabled={false} - onSelect={() => - runCommand( - desktopRecentProjectCommand( - ServerConnection.key(item.server), - item.project.worktree, - ), - ) - } - /> + + {(group, index) => ( + <> + 0}> + + + 1}> + + {serverName(group.server)} + + + + {(project) => ( + + runCommand( + desktopRecentProjectCommand( + ServerConnection.key(group.server), + project.worktree, + ), + ) + } + /> + )} + + )} diff --git a/packages/desktop/src/main/menu.ts b/packages/desktop/src/main/menu.ts index 1b68f4ef9b1..40630b0efa6 100644 --- a/packages/desktop/src/main/menu.ts +++ b/packages/desktop/src/main/menu.ts @@ -47,10 +47,25 @@ function nativeItem(entry: DesktopMenuEntry, deps: Deps): MenuItemConstructorOpt } if (entry.dynamic === "recentProjects") { - item.submenu = deps.recentProjects().map((project) => ({ - label: project.server ? `${project.label} — ${project.server}` : project.label, - click: () => deps.trigger(project.command), - })) + const projects = deps.recentProjects() + const servers = new Map() + projects.forEach((project) => { + if (!project.server) return + servers.set(project.server, [...(servers.get(project.server) ?? []), project]) + }) + item.submenu = servers.size + ? [...servers.entries()].flatMap(([server, entries], index) => [ + ...(index > 0 ? ([{ type: "separator" as const }] satisfies MenuItemConstructorOptions[]) : []), + { label: server, enabled: false }, + ...entries.slice(0, 5).map((project) => ({ + label: project.label, + click: () => deps.trigger(project.command), + })), + ]) + : projects.slice(0, 5).map((project) => ({ + label: project.label, + click: () => deps.trigger(project.command), + })) item.enabled = item.submenu.length > 0 return item }