handleTabClick(tab)}
+ onClick={() => handleClick(tab)}
className={cn(
"relative cursor-pointer rounded-3xl px-2.5 py-[8px] text-[13px] font-[600] transition-all duration-500",
currentTab === tab ? "text-black dark:text-white" : "text-stone-400 dark:text-stone-500",
diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx
index 761cfcc..8bf80bd 100644
--- a/src/pages/Server.tsx
+++ b/src/pages/Server.tsx
@@ -1,5 +1,4 @@
import GlobalMap from "@/components/GlobalMap"
-import GroupSwitch from "@/components/GroupSwitch"
import ServerCard from "@/components/ServerCard"
import ServerOverview from "@/components/ServerOverview"
import { ServiceTracker } from "@/components/ServiceTracker"
@@ -17,8 +16,9 @@ import { NezhaWebsocketResponse } from "@/types/nezha-api"
import { ServerGroup } from "@/types/nezha-api"
import { ArrowDownIcon, ArrowUpIcon, ArrowsUpDownIcon, ChartBarSquareIcon, MapIcon } from "@heroicons/react/20/solid"
import { useQuery } from "@tanstack/react-query"
-import { useEffect, useRef, useState } from "react"
+import { useCallback, useEffect, useRef, useState } from "react"
import { useTranslation } from "react-i18next"
+import DirectCountrySelect from "@/components/DirectCountrySelect"
export default function Servers() {
const { t } = useTranslation()
@@ -52,25 +52,16 @@ export default function Servers() {
}
}
- const handleTagChange = (newGroup: string) => {
- groupRef.current = newGroup
- countryRef.current = "All" // 切换组时重置国家筛选
+ const handleCountryChange = useCallback((newCountry: string) => {
+ countryRef.current = newCountry;
- setCurrentGroup(newGroup)
- setCurrentCountry("All")
+ // 强制立即更新状态
+ setCurrentCountry(newCountry);
- sessionStorage.setItem("selectedGroup", newGroup)
- sessionStorage.setItem("selectedCountry", "All")
- sessionStorage.setItem("scrollPosition", String(containerRef.current?.scrollTop || 0))
- }
-
- const handleCountryChange = (newCountry: string) => {
- countryRef.current = newCountry
- setCurrentCountry(newCountry)
-
- sessionStorage.setItem("selectedCountry", newCountry)
- sessionStorage.setItem("scrollPosition", String(containerRef.current?.scrollTop || 0))
- }
+ // 保存到会话存储
+ sessionStorage.setItem("selectedCountry", newCountry);
+ sessionStorage.setItem("scrollPosition", String(containerRef.current?.scrollTop || 0));
+ }, []);
useEffect(() => {
const showServicesState = localStorage.getItem("showServices")
@@ -124,6 +115,7 @@ export default function Servers() {
useEffect(() => {
if (!lastMessage || !initializedRef.current) return;
+ // 保持用户选择的筛选状态
setCurrentGroup(groupRef.current)
setCurrentCountry(countryRef.current)
}, [lastMessage])
@@ -137,15 +129,6 @@ export default function Servers() {
.sort()
: []
- const groupTabs = [
- "All",
- ...(groupData?.data
- ?.filter((item: ServerGroup) => {
- return Array.isArray(item.servers) && item.servers.some((serverId) => nezhaWsData?.servers?.some((server) => server.id === serverId))
- })
- ?.map((item: ServerGroup) => item.group.name) || []),
- ]
-
const countryTabs = [
"All",
...availableCountries.map(code => code.toUpperCase())
@@ -347,8 +330,6 @@ export default function Servers() {
})}
/>
-
-
@@ -411,7 +392,17 @@ export default function Servers() {
{showMap === "1" &&