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 { Server, Terminal } from "lucide-react"; import { useTabs } from "@/ui/Desktop/Navigation/Tabs/TabContext.tsx"; import { getServerStatusById } from "@/ui/main-axios.ts"; import type { HostProps } from "../../../../types/index.js"; export function Host({ host }: 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 intervalId: number | undefined; let cancelled = false; const fetchStatus = async () => { try { const res = await getServerStatusById(host.id); if (!cancelled) { setServerStatus(res?.status === "online" ? "online" : "offline"); } } catch (error: any) { if (!cancelled) { if (error?.response?.status === 503) { setServerStatus("offline"); } else if (error?.response?.status === 504) { setServerStatus("degraded"); } else if (error?.response?.status === 404) { setServerStatus("offline"); } else { setServerStatus("offline"); } } } }; fetchStatus(); intervalId = window.setInterval(fetchStatus, 30000); return () => { cancelled = true; if (intervalId) window.clearInterval(intervalId); }; }, [host.id]); const handleTerminalClick = () => { addTab({ type: "terminal", title, hostConfig: host }); }; const handleServerClick = () => { addTab({ type: "server", title, hostConfig: host }); }; return (
{host.name || host.ip}
{tag}