From 3c9838a0d3d4f93fd8193c4a54fb2c5a14d36c79 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 13 Feb 2026 22:42:53 -0800 Subject: [PATCH] fix(desktop): only show ports in sidebar when actively in use Static ports from ports.json were always displayed even when not running. Now ports only appear when detected by the port scanner, with static config used solely for label overrides. --- .../PortsList/hooks/usePortsData.ts | 8 ++-- .../PortsList/utils/merge-ports.ts | 45 ++++++------------- bun.lock | 2 +- 3 files changed, 19 insertions(+), 36 deletions(-) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/hooks/usePortsData.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/hooks/usePortsData.ts index aa5c11457c1..fdc22e1be76 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/hooks/usePortsData.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/hooks/usePortsData.ts @@ -114,10 +114,10 @@ export function usePortsData() { }, ); - // Sort alphabetically by workspace name - groups.sort((a, b) => a.workspaceName.localeCompare(b.workspaceName)); - - return groups; + // Remove workspaces with no active ports and sort alphabetically + return groups + .filter((g) => g.ports.length > 0) + .sort((a, b) => a.workspaceName.localeCompare(b.workspaceName)); }, [allWorkspaceIds, allStaticPortsData?.ports, ports, workspaceNames]); const totalPortCount = workspacePortGroups.reduce( diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/utils/merge-ports.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/utils/merge-ports.ts index ba87af60365..c5fdd7bcdd3 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/utils/merge-ports.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/PortsList/utils/merge-ports.ts @@ -4,9 +4,9 @@ import type { DetectedPort, MergedPort, StaticPort } from "shared/types"; * Merge static port configuration with dynamically detected ports. * * Logic: - * 1. Start with all static ports (always shown, even when inactive) - * 2. For dynamic ports matching a static port number: merge process info, mark active - * 3. For dynamic ports not in static config: add as dynamic-only entries + * 1. Only show ports that are actively in use (detected by the port scanner) + * 2. For active ports matching a static port number: apply the label from config + * 3. For active ports not in static config: show as dynamic-only entries * 4. Sort by port number */ export function mergePorts({ @@ -22,40 +22,23 @@ export function mergePorts({ (p) => p.workspaceId === workspaceId, ); - const dynamicByPort = new Map(workspaceDynamicPorts.map((p) => [p.port, p])); - const staticPortNumbers = new Set(staticPorts.map((p) => p.port)); + const staticByPort = new Map(staticPorts.map((p) => [p.port, p])); const merged: MergedPort[] = []; - for (const staticPort of staticPorts) { - const dynamic = dynamicByPort.get(staticPort.port); + for (const dynamic of workspaceDynamicPorts) { + const staticPort = staticByPort.get(dynamic.port); merged.push({ - port: staticPort.port, + port: dynamic.port, workspaceId, - label: staticPort.label, - isActive: !!dynamic, - pid: dynamic?.pid ?? null, - processName: dynamic?.processName ?? null, - paneId: dynamic?.paneId ?? null, - address: dynamic?.address ?? null, - detectedAt: dynamic?.detectedAt ?? null, + label: staticPort?.label ?? null, + isActive: true, + pid: dynamic.pid, + processName: dynamic.processName, + paneId: dynamic.paneId, + address: dynamic.address, + detectedAt: dynamic.detectedAt, }); } - for (const dynamic of workspaceDynamicPorts) { - if (!staticPortNumbers.has(dynamic.port)) { - merged.push({ - port: dynamic.port, - workspaceId, - label: null, - isActive: true, - pid: dynamic.pid, - processName: dynamic.processName, - paneId: dynamic.paneId, - address: dynamic.address, - detectedAt: dynamic.detectedAt, - }); - } - } - return merged.sort((a, b) => a.port - b.port); } diff --git a/bun.lock b/bun.lock index a458df61983..ca6ef70df85 100644 --- a/bun.lock +++ b/bun.lock @@ -105,7 +105,7 @@ }, "apps/desktop": { "name": "@superset/desktop", - "version": "0.0.73", + "version": "0.0.76", "dependencies": { "@better-auth/stripe": "1.4.18", "@dnd-kit/core": "^6.3.1",