import { CheckCircle2, Circle, Loader2, AlertTriangle, Power, LogIn } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { useStatus } from "../hooks/useStatus"; import { Connection } from "@bindings/services"; import type { SystemEvent } from "@bindings/services/models.js"; import { Button } from "../components/Button"; import { Card } from "../components/Card"; import { cn } from "../lib/cn"; import { NetBirdConnectToggle, ConnectionState } from "../components/NetBirdConnectToggle"; export default function Status() { const { status, error } = useStatus(); const navigate = useNavigate(); const connState = status?.status ?? "Idle"; const connected = connState === "Connected"; const connecting = connState === "Connecting"; // The daemon reports "NeedsLogin" on a fresh install or after a session // expires; "SessionExpired" once a previously good session lapses. In both // cases Connect would fail without a fresh SSO login. const needsLogin = connState === "NeedsLogin" || connState === "SessionExpired" || connState === "LoginFailed"; // DaemonUnavailable is the synthetic status the UI emits when the gRPC // socket is unreachable; Up/Down would just error, so the toggle is dead. const unreachable = connState === "DaemonUnavailable"; // Always offer Login while we aren't Connected — including Connecting, // because a stuck Login on the daemon leaves us in Connecting forever and // the user has no other way out. Disconnect is the manual unstick path. const showLogin = !connected; const toggleState: ConnectionState = connected ? ConnectionState.Connected : connecting ? ConnectionState.Connecting : ConnectionState.Disconnected; const login = () => navigate("/login"); const connect = () => Connection.Up({ profileName: "", username: "" }).catch(console.error); const disconnect = () => Connection.Down().catch(console.error); const toggleConnection = () => { if (needsLogin) { navigate("/login"); return; } if (connected) { disconnect(); return; } connect(); }; return (
{status?.local.fqdn || "—"}
No recent events.
; } return ({label}
{value}
{label}
{link?.url || "—"}
{link?.error && ({link.error}
)}