import { Cpu, Wifi, WifiOff, Loader, Terminal, ChevronDown, LogOut, User, } from "lucide-react"; import type { GpuInfo, MonitoringSample } from "../../types.js"; import { fmt } from "../../utils/units.js"; import { useCurveStore } from "../../store/curveStore.js"; import { useState, useRef, useEffect } from "react"; interface Props { gpuInfo: GpuInfo | null; wsStatus: "connecting" | "connected" | "disconnected"; monitor: MonitoringSample | null; user?: string | null; onLogout?: () => void; } const statusIcon = { connected: , connecting: , disconnected: , }; const statusText = { connected: "Connected", connecting: "Connecting…", disconnected: "Disconnected", }; export function StatusBar({ gpuInfo, wsStatus, monitor, user, onLogout, }: Props) { const { availableGpus, selectedGpuIndex, setSelectedGpuIndex } = useCurveStore(); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setIsOpen(false); } } document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
{/* Left: GPU name */}
NVCurve NVCurve
{availableGpus.length > 1 ? (
{isOpen && (
{availableGpus.map((gpu) => ( ))}
)}
) : ( <> {gpuInfo?.name ?? "No Device"} )} {gpuInfo?.driver_version && (
{gpuInfo.driver_version}
)}
{/* Centre: live stats */}
{/* Right: user + connection status */}
{user && (
{user} {onLogout && ( )}
)}
{statusIcon[wsStatus]} {statusText[wsStatus]}
); } function StatPill({ label, value, color, }: { label: string; value: string; color: string; }) { return (
{label} {value}
); }