import { BackIcon } from "@/components/Icon" import ServerFlag from "@/components/ServerFlag" import { ServerDetailLoading } from "@/components/loading/ServerDetailLoading" import { Badge } from "@/components/ui/badge" import { Card, CardContent } from "@/components/ui/card" import { useWebSocketContext } from "@/hooks/use-websocket-context" import { formatBytes } from "@/lib/format" import { cn, formatNezhaInfo } from "@/lib/utils" import { NezhaWebsocketResponse } from "@/types/nezha-api" import { useTranslation } from "react-i18next" import { useNavigate } from "react-router-dom" import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "./ui/accordion" export default function ServerDetailOverview({ server_id }: { server_id: string }) { const { t } = useTranslation() const navigate = useNavigate() const { lastMessage, connected } = useWebSocketContext() if (!connected && !lastMessage) { return } const nezhaWsData = lastMessage ? (JSON.parse(lastMessage.data) as NezhaWebsocketResponse) : null if (!nezhaWsData) { return } const server = nezhaWsData.servers.find((s) => s.id === Number(server_id)) if (!server) { return } const { name, online, uptime, version, arch, mem_total, disk_total, country_code, platform, platform_version, cpu_info, gpu_info, load_1, load_5, load_15, net_out_transfer, net_in_transfer, last_active_time_string, } = formatNezhaInfo(nezhaWsData.now, server) const customBackgroundImage = // @ts-expect-error CustomBackgroundImage is a global variable (window.CustomBackgroundImage as string) !== "" ? window.CustomBackgroundImage : undefined return (
navigate("/")} className="flex flex-none cursor-pointer font-semibold leading-none items-center break-all tracking-tight gap-1 text-xl" > {name}

{t("serverDetail.status")}

{online ? t("serverDetail.online") : t("serverDetail.offline")}
{online && (

{t("serverDetail.uptime")}

{" "} {online ? (uptime / 86400).toFixed(0) : "N/A"} {t("serverDetail.days")}
)} {version && (

{t("serverDetail.version")}

{version}
)} {arch && (

{t("serverDetail.arch")}

{arch}
)} {mem_total ? (

{t("serverDetail.mem")}

{formatBytes(mem_total)}
) : null} {disk_total ? (

{t("serverDetail.disk")}

{formatBytes(disk_total)}
) : null} {country_code && (

{t("serverDetail.region")}

{country_code?.toUpperCase()}
{country_code && }
)}
{platform && (

{t("serverDetail.system")}

{" "} {platform} {platform_version ? " - " + platform_version : ""}
)} {cpu_info.length > 0 && (

{"CPU"}

{cpu_info.join(", ")}
)} {gpu_info.length > 0 && (

{"GPU"}

{gpu_info.join(", ")}
)}

{"Load"}

{load_1} / {load_5} / {load_15}
{net_out_transfer ? (

{t("serverDetail.upload")}

{net_out_transfer ? (
{formatBytes(net_out_transfer)}
) : (
{t("serverDetail.unknown")}
)}
) : null} {net_in_transfer ? (

{t("serverDetail.download")}

{net_in_transfer ? (
{formatBytes(net_in_transfer)}
) : (
{t("serverDetail.unknown")}
)}
) : null}
{server?.state.temperatures && server?.state.temperatures.length > 0 && (
{t("serverDetail.temperature")}
{server?.state.temperatures.map((item, index) => (

{item.Name}

: {item.Temperature.toFixed(2)} °C
))}
)}

{t("serverDetail.lastActive")}

{last_active_time_string ? last_active_time_string : "N/A"}
) }