import React, { useEffect, useState } from "react"; import { Status, StatusIndicator } from "@/components/ui/shadcn-io/status"; import { Button } from "@/components/ui/button.tsx"; import { ButtonGroup } from "@/components/ui/button-group.tsx"; import { Terminal } from "lucide-react"; import { getServerStatusById } from "@/ui/main-axios.ts"; import { useTabs } from "@/ui/Mobile/Apps/Navigation/Tabs/TabContext.tsx"; import type { HostProps } from "../../../../../types/index.js"; export function Host({ host, onHostConnect }: HostProps): React.ReactElement { const { addTab } = useTabs(); const [serverStatus, setServerStatus] = useState< "online" | "offline" | "degraded" >("degraded"); const tags = Array.isArray(host.tags) ? host.tags : []; const hasTags = tags.length > 0; const title = host.name?.trim() ? host.name : `${host.username}@${host.ip}:${host.port}`; useEffect(() => { let cancelled = false; const fetchStatus = async () => { try { const res = await getServerStatusById(host.id); if (!cancelled) { setServerStatus(res?.status === "online" ? "online" : "offline"); } } catch (error: unknown) { if (!cancelled) { const err = error as { response?: { status?: number } }; if (err?.response?.status === 503) { setServerStatus("offline"); } else if (err?.response?.status === 504) { setServerStatus("degraded"); } else if (err?.response?.status === 404) { setServerStatus("offline"); } else { setServerStatus("offline"); } } } }; fetchStatus(); const intervalId = window.setInterval(fetchStatus, 30000); return () => { cancelled = true; if (intervalId) window.clearInterval(intervalId); }; }, [host.id]); const handleTerminalClick = () => { addTab({ type: "terminal", title, hostConfig: host }); onHostConnect(); }; return (

{host.name || host.ip}

{host.enableTerminal && ( )}
{hasTags && (
{tags.map((tag: string) => (

{tag}

))}
)}
); }