"use client"; import { useMemo, useState } from "react"; import { PopoverShell } from "@/modules/system/components/status-bar/popover-shell"; import type { WifiPopoverProps } from "@/modules/system/components/status-bar/types"; import { EthernetIcon, WifiSignalIcon, WifiStatusIcon, } from "@/modules/system/components/status-bar/wifi-icons"; import { useNetworkActions } from "@/modules/system/hooks/useNetworkActions"; import { useWifiNetworks } from "@/modules/system/hooks/useWifiNetworks"; import { Check, Lock, } from "@/components/icons/platform-icons"; import type { WifiAccessPoint } from "@/lib/shared/contracts/network"; function WifiStrengthIcon({ quality }: { quality: number | null }) { if (quality === null) { return ; } if (quality >= 70) { return ; } if (quality >= 40) return ; return ; } export function WifiPopover({ metrics, networkStatus, isDemoMode = false, onClose }: WifiPopoverProps) { const { data: networksFromApi } = useWifiNetworks(); const { connectNetwork, disconnectNetwork, isConnecting, isDisconnecting, actionError, } = useNetworkActions(); const [pendingSsid, setPendingSsid] = useState(null); const fallbackNetworks = useMemo( () => (metrics?.wifi.availableNetworks ?? []).map((network) => ({ ssid: network.ssid, bssid: null, signalPercent: network.qualityPercent, channel: network.channel, frequencyMhz: null, security: network.security, })), [metrics?.wifi.availableNetworks], ); const status = networkStatus ?? { connected: Boolean(metrics?.wifi.connected), iface: metrics?.wifi.iface ?? null, ssid: metrics?.wifi.ssid ?? null, ipv4: metrics?.wifi.ipv4 ?? null, signalPercent: metrics?.wifi.signalPercent ?? null, }; const hasStatus = Boolean(networkStatus || metrics); const isEthernet = Boolean(status.connected && !status.ssid); const networks = (networksFromApi?.length ?? 0) > 0 ? (networksFromApi ?? []) : fallbackNetworks; const hasNetworks = networks.length > 0; async function handleConnect(network: WifiAccessPoint) { try { setPendingSsid(network.ssid); const password = network.security && network.security.length > 0 ? window.prompt(`Password for ${network.ssid}`) ?? "" : undefined; if (network.security && (!password || password.trim().length === 0)) { return; } await connectNetwork({ ssid: network.ssid, password, }); } finally { setPendingSsid(null); } } async function handleDisconnect() { await disconnectNetwork({ iface: status.iface ?? undefined, }); } return ( {/* Header */}
{isEthernet ? ( ) : ( )} {isEthernet ? "Ethernet" : "Wi-Fi"}
{status.connected ? "Connected" : "Disconnected"}
{/* Status body */}
{hasStatus ? ( <>
{isEthernet ? ( ) : ( )}

{isEthernet ? (status.iface ?? "Ethernet") : (status.ssid ?? "No active Wi-Fi network")}

{isEthernet ? "Wired connection" : status.iface ? `Interface ${status.iface}` : "Interface unavailable"}

{status.connected && ( )}
{!isDemoMode && IPv4: {status.ipv4 ?? "--"}} {!isEthernet && ( Signal: {status.signalPercent ?? "--"}% )} Download: {metrics?.wifi.downloadMbps ?? "--"} Mbps Upload: {metrics?.wifi.uploadMbps ?? "--"} Mbps
{!isEthernet && (
)} ) : (

Loading network details...

)} {actionError ? (

{actionError.message}

) : null}
{/* Nearby networks — only shown for Wi-Fi */} {!isEthernet && (

Nearby Networks

{hasNetworks ? ( networks.map((network, idx) => (
{network.ssid} {network.security ? ( ) : null}
Ch {network.channel ?? "--"} ·{" "} {network.signalPercent ?? "--"}%
)) ) : (
No Wi-Fi scan data available
)}
)}
); }