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"}
)
}