import { NezhaWebsocketResponse } from "@/types/nezha-api"; import ServerCard from "@/components/ServerCard"; import { cn, 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"; import { ChartBarSquareIcon, ViewColumnsIcon } from "@heroicons/react/20/solid"; import { ServiceTracker } from "@/components/ServiceTracker"; import ServerCardInline from "@/components/ServerCardInline"; import { Loader } from "@/components/loading/Loader"; export default function Servers() { const { t } = useTranslation(); const { data: groupData } = useQuery({ queryKey: ["server-group"], queryFn: () => fetchServerGroup(), }); const { lastMessage, connected } = useWebSocketContext(); const [showServices, setShowServices] = useState("0"); const [inline, setInline] = useState("0"); const [currentGroup, setCurrentGroup] = useState("All"); useEffect(() => { const showServicesState = localStorage.getItem("showServices"); if (showServicesState !== null) { setShowServices(showServicesState); } }, []); useEffect(() => { const inlineState = localStorage.getItem("inline"); if (inlineState !== null) { setInline(inlineState); } }, []); const groupTabs = [ "All", ...(groupData?.data?.map((item: ServerGroup) => item.group.name) || []), ]; useEffect(() => { const hasShownToast = sessionStorage.getItem("websocket-connected-toast"); if (connected && !hasShownToast) { toast.success(t("info.websocketConnected")); sessionStorage.setItem("websocket-connected-toast", "true"); } }, [connected]); if (!connected) { 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(nezhaWsData.now, server).online, )?.length || 0; const offlineServers = nezhaWsData?.servers?.filter( (server) => !formatNezhaInfo(nezhaWsData.now, server).online, )?.length || 0; const up = nezhaWsData?.servers?.reduce( (total, server) => formatNezhaInfo(nezhaWsData.now, server).online ? total + (server.state?.net_out_transfer ?? 0) : total, 0, ) || 0; const down = nezhaWsData?.servers?.reduce( (total, server) => formatNezhaInfo(nezhaWsData.now, server).online ? total + (server.state?.net_in_transfer ?? 0) : total, 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 (
{showServices === "1" && } {inline === "1" && (
{filteredServers.map((serverInfo) => ( ))}
)} {inline === "0" && (
{filteredServers.map((serverInfo) => ( ))}
)}
); }