diff --git a/src/renderer/pages/home/shared/controls.tsx b/src/renderer/pages/home/shared/controls.tsx index e049e02..b8bb572 100644 --- a/src/renderer/pages/home/shared/controls.tsx +++ b/src/renderer/pages/home/shared/controls.tsx @@ -678,6 +678,7 @@ export function EndpointTitleBar({ const statusLabel = running ? t("running") : t("not running"); const value = endpoint.trim() || t("Not configured"); const loopbackEndpoint = loopbackEndpointFromStatus(value, config); + const loopbackBaseUrl = gatewayBaseUrlFromEndpoint(loopbackEndpoint); const networkEndpoints = running ? gatewayStatus.networkEndpoints ?? [] : []; async function copyEndpoint(valueToCopy: string, key: string) { @@ -764,21 +765,24 @@ export function EndpointTitleBar({ >
void copyEndpoint(valueToCopy, `loopback:${loopbackEndpoint}`)} + value={loopbackBaseUrl} + onCopy={(valueToCopy) => void copyEndpoint(valueToCopy, `loopback:${loopbackBaseUrl}`)} /> - {networkEndpoints.map((entry, index) => ( - void copyEndpoint(valueToCopy, `network:${entry.interfaceName}:${entry.address}`)} - /> - ))} + {networkEndpoints.map((entry, index) => { + const baseUrl = gatewayBaseUrlFromEndpoint(entry.endpoint); + return ( + void copyEndpoint(valueToCopy, `network:${entry.interfaceName}:${entry.address}`)} + /> + ); + })}
@@ -845,6 +849,29 @@ function loopbackEndpointFromStatus(endpoint: string, config: AppConfig): string } } +function gatewayBaseUrlFromEndpoint(endpoint: string): string { + try { + const parsed = new URL(endpoint); + parsed.pathname = appendGatewayBasePath(parsed.pathname); + parsed.search = ""; + parsed.hash = ""; + return parsed.toString().replace(/\/$/, ""); + } catch { + return `${endpoint.replace(/\/+$/, "")}/v1`; + } +} + +function appendGatewayBasePath(pathname: string): string { + const normalized = pathname.replace(/\/+$/, ""); + if (!normalized || normalized === "/") { + return "/v1"; + } + if (normalized.endsWith("/v1")) { + return normalized; + } + return `${normalized}/v1`; +} + async function copyEndpointTextToClipboard(value: string): Promise { if (navigator.clipboard?.writeText) { try {