feat(ui) Add deviceName or deviceID to the browser tab title

Addresses #304. In local mode will show the deviceId, in cloud connection will show the deviceName.

Would be nice to show the hostname, but that would require device-side code changes to the /device endpoint.
This commit is contained in:
Marc Brooks 2025-06-13 06:20:24 -05:00
parent a1ed28c676
commit 17b364b58a
No known key found for this signature in database
GPG Key ID: 583A6AF2D6AE1DC6
1 changed files with 13 additions and 2 deletions

View File

@ -58,9 +58,11 @@ import { SystemVersionInfo } from "./devices.$id.settings.general.update";
interface LocalLoaderResp { interface LocalLoaderResp {
authMode: "password" | "noPassword" | null; authMode: "password" | "noPassword" | null;
deviceId: string;
} }
interface CloudLoaderResp { interface CloudLoaderResp {
deviceId: string;
deviceName: string; deviceName: string;
user: User | null; user: User | null;
iceConfig: { iceConfig: {
@ -85,7 +87,7 @@ const deviceLoader = async () => {
if (deviceRes.status === 401) return redirect("/login-local"); if (deviceRes.status === 401) return redirect("/login-local");
if (deviceRes.ok) { if (deviceRes.ok) {
const device = (await deviceRes.json()) as LocalDevice; const device = (await deviceRes.json()) as LocalDevice;
return { authMode: device.authMode }; return { authMode: device.authMode, deviceId: device.deviceId };
} }
throw new Error("Error fetching device"); throw new Error("Error fetching device");
@ -111,7 +113,7 @@ const cloudLoader = async (params: Params<string>): Promise<CloudLoaderResp> =>
device: { id: string; name: string; user: { googleId: string } }; device: { id: string; name: string; user: { googleId: string } };
}; };
return { user, iceConfig, deviceName: device.name || device.id }; return { user, iceConfig, deviceName: device.name || device.id, deviceId: device.id };
}; };
const loader = async ({ params }: LoaderFunctionArgs) => { const loader = async ({ params }: LoaderFunctionArgs) => {
@ -123,6 +125,7 @@ export default function KvmIdRoute() {
// Depending on the mode, we set the appropriate variables // Depending on the mode, we set the appropriate variables
const user = "user" in loaderResp ? loaderResp.user : null; const user = "user" in loaderResp ? loaderResp.user : null;
const deviceName = "deviceName" in loaderResp ? loaderResp.deviceName : null; const deviceName = "deviceName" in loaderResp ? loaderResp.deviceName : null;
const deviceId = "deviceId" in loaderResp ? loaderResp.deviceId : null;
const iceConfig = "iceConfig" in loaderResp ? loaderResp.iceConfig : null; const iceConfig = "iceConfig" in loaderResp ? loaderResp.iceConfig : null;
const authMode = "authMode" in loaderResp ? loaderResp.authMode : null; const authMode = "authMode" in loaderResp ? loaderResp.authMode : null;
@ -788,6 +791,14 @@ export default function KvmIdRoute() {
setupPeerConnection, setupPeerConnection,
]); ]);
// update the browser tab title with the name of the JetKVM we're discussing
useEffect(() => {
const name = deviceName || deviceId;
document.title = (name && name.length > 0)
? "JetKVM-" + name
: "JetKVM";
}, [deviceName, deviceId]);
return ( return (
<FeatureFlagProvider appVersion={appVersion}> <FeatureFlagProvider appVersion={appVersion}>
{!outlet && otaState.updating && ( {!outlet && otaState.updating && (