import { NezhaWebsocketResponse } from "@/types/nezha-api"; import ServerCard from "@/components/ServerCard"; import { formatNezhaInfo } from "@/lib/utils"; import ServerOverview from "@/components/ServerOverview"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { useQuery } from "@tanstack/react-query"; import { fetchServerGroup } from "@/lib/nezha-api"; import GroupSwitch from "@/components/GroupSwitch"; import { ServerGroup } from "@/types/nezha-api"; import { useWebSocketContext } from "@/hooks/use-websocket-context"; import { useTranslation } from "react-i18next"; export default function Servers() { const { t } = useTranslation(); const { data: groupData } = useQuery({ queryKey: ["server-group"], queryFn: () => fetchServerGroup(), }); const { lastMessage, readyState } = useWebSocketContext(); const [currentGroup, setCurrentGroup] = useState("All"); const groupTabs = [ "All", ...(groupData?.data?.map((item: ServerGroup) => item.group.name) || []), ]; useEffect(() => { if (readyState == 1) { toast.success(t("info.websocketConnected")); } }, [readyState]); if (readyState !== 1) { return (

{t("info.websocketConnecting")}

); } const nezhaWsData = lastMessage ? (JSON.parse(lastMessage.data) as NezhaWebsocketResponse) : null; if (!nezhaWsData) { return (

{t("info.processing")}

); } const totalServers = nezhaWsData?.servers?.length || 0; const onlineServers = nezhaWsData?.servers?.filter((server) => formatNezhaInfo(server).online) ?.length || 0; const offlineServers = nezhaWsData?.servers?.filter((server) => !formatNezhaInfo(server).online) ?.length || 0; const up = nezhaWsData?.servers?.reduce( (total, server) => total + server.state.net_out_transfer, 0, ) || 0; const down = nezhaWsData?.servers?.reduce( (total, server) => total + server.state.net_in_transfer, 0, ) || 0; const filteredServers = nezhaWsData?.servers?.filter((server) => { if (currentGroup === "All") return true; const group = groupData?.data?.find( (g: ServerGroup) => g.group.name === currentGroup && Array.isArray(g.servers) && g.servers.includes(server.id), ); return !!group; }) || []; return (
{filteredServers.map((serverInfo) => ( ))}
); }