"use client" import { useFilter } from "@/app/context/network-filter-context" import { useServerData } from "@/app/context/server-data-context" import { useStatus } from "@/app/context/status-context" import ServerCard from "@/components/ServerCard" import ServerCardInline from "@/components/ServerCardInline" import Switch from "@/components/Switch" import GlobalLoading from "@/components/loading/GlobalLoading" import { Loader } from "@/components/loading/Loader" import getEnv from "@/lib/env-entry" import { cn } from "@/lib/utils" import { MapIcon, ViewColumnsIcon } from "@heroicons/react/20/solid" import { useTranslations } from "next-intl" import dynamic from "next/dynamic" import { useEffect, useRef, useState } from "react" const ServerGlobal = dynamic(() => import("./Global"), { ssr: false, loading: () => , }) const sortServersByDisplayIndex = (servers: any[]) => { return servers.sort((a, b) => { const displayIndexDiff = (b.display_index || 0) - (a.display_index || 0) return displayIndexDiff !== 0 ? displayIndexDiff : a.id - b.id }) } const filterServersByStatus = (servers: any[], status: string) => { return status === "all" ? servers : servers.filter((server) => [status].includes(server.online_status ? "online" : "offline")) } const filterServersByTag = (servers: any[], tag: string, defaultTag: string) => { return tag === defaultTag ? servers : servers.filter((server) => server.tag === tag) } const sortServersByNetwork = (servers: any[]) => { return [...servers].sort((a, b) => { if (!a.online_status && b.online_status) return 1 if (a.online_status && !b.online_status) return -1 if (!a.online_status && !b.online_status) return 0 return b.status.NetInSpeed + b.status.NetOutSpeed - (a.status.NetInSpeed + a.status.NetOutSpeed) }) } const getTagCounts = (servers: any[]) => { return servers.reduce((acc: Record, server) => { if (server.tag) { acc[server.tag] = (acc[server.tag] || 0) + 1 } return acc }, {}) } const LoadingState = ({ t }: { t: any }) => (
{t("connecting")}...
) const ErrorState = ({ error, t }: { error: Error; t: any }) => (

{error.message}

{t("error_message")}

) const ServerList = ({ servers, inline, containerRef }: { servers: any[]; inline: string; containerRef: any }) => { if (inline === "1") { return (
{servers.map((serverInfo) => ( ))}
) } return (
{servers.map((serverInfo) => ( ))}
) } export default function ServerListClient() { const { status } = useStatus() const { filter } = useFilter() const t = useTranslations("ServerListClient") const containerRef = useRef(null) const defaultTag = "defaultTag" const [tag, setTag] = useState(defaultTag) const [showMap, setShowMap] = useState(false) const [inline, setInline] = useState("0") useEffect(() => { const inlineState = localStorage.getItem("inline") if (inlineState !== null) { setInline(inlineState) } const savedTag = sessionStorage.getItem("selectedTag") || defaultTag setTag(savedTag) restoreScrollPosition() }, []) const handleTagChange = (newTag: string) => { setTag(newTag) sessionStorage.setItem("selectedTag", newTag) sessionStorage.setItem("scrollPosition", String(containerRef.current?.scrollTop || 0)) } const restoreScrollPosition = () => { const savedPosition = sessionStorage.getItem("scrollPosition") if (savedPosition && containerRef.current) { containerRef.current.scrollTop = Number(savedPosition) } } useEffect(() => { const handleRouteChange = () => { restoreScrollPosition() } window.addEventListener("popstate", handleRouteChange) return () => { window.removeEventListener("popstate", handleRouteChange) } }, []) const { data, error } = useServerData() if (error) return if (!data?.result) return const { result } = data const sortedServers = sortServersByDisplayIndex(result) const filteredServersByStatus = filterServersByStatus(sortedServers, status) const allTag = filteredServersByStatus.map((server) => server.tag).filter(Boolean) const uniqueTags = [...new Set(allTag)] uniqueTags.unshift(defaultTag) let filteredServers = filterServersByTag(filteredServersByStatus, tag, defaultTag) if (filter) { filteredServers = sortServersByNetwork(filteredServers) } const tagCountMap = getTagCounts(filteredServersByStatus) return ( <>
{getEnv("NEXT_PUBLIC_ShowTag") === "true" && ( )}
{showMap && } ) }