From 07afc44eb7a70989b6a25f91d51163ab478bae41 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Thu, 6 Feb 2025 00:26:20 +0800 Subject: [PATCH] refactor: modularize ServerListClient with utility functions and components --- .../main/ServerListClient.tsx | 159 +++++++++--------- 1 file changed, 84 insertions(+), 75 deletions(-) diff --git a/app/(main)/ClientComponents/main/ServerListClient.tsx b/app/(main)/ClientComponents/main/ServerListClient.tsx index 1bf90a5..af63491 100644 --- a/app/(main)/ClientComponents/main/ServerListClient.tsx +++ b/app/(main)/ClientComponents/main/ServerListClient.tsx @@ -20,6 +20,77 @@ const ServerGlobal = dynamic(() => import("./Global"), { 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() @@ -36,12 +107,9 @@ export default function ServerListClient() { if (inlineState !== null) { setInline(inlineState) } - }, []) - useEffect(() => { const savedTag = sessionStorage.getItem("selectedTag") || defaultTag setTag(savedTag) - restoreScrollPosition() }, []) @@ -71,73 +139,30 @@ export default function ServerListClient() { const { data, error } = useServerData() - if (error) - return ( -
-

{error.message}

-

{t("error_message")}

-
- ) - - if (!data?.result) - return ( -
-
- - {t("connecting")}... -
-
- ) + if (error) return + if (!data?.result) return const { result } = data - const sortedServers = result.sort((a, b) => { - const displayIndexDiff = (b.display_index || 0) - (a.display_index || 0) - if (displayIndexDiff !== 0) return displayIndexDiff - return a.id - b.id - }) - - const filteredServersByStatus = - status === "all" - ? sortedServers - : sortedServers.filter((server) => - [status].includes(server.online_status ? "online" : "offline"), - ) - + 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) - const filteredServers = - tag === defaultTag - ? filteredServersByStatus - : filteredServersByStatus.filter((server) => server.tag === tag) + let filteredServers = filterServersByTag(filteredServersByStatus, tag, defaultTag) if (filter) { - filteredServers.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) - ) - }) + filteredServers = sortServersByNetwork(filteredServers) } - const tagCountMap: Record = {} - for (const server of filteredServersByStatus) { - if (server.tag) { - tagCountMap[server.tag] = (tagCountMap[server.tag] || 0) + 1 - } - } + const tagCountMap = getTagCounts(filteredServersByStatus) return ( <>
{showMap && } - {inline === "1" && ( -
- {filteredServers.map((serverInfo) => ( - - ))} -
- )} - - {inline === "0" && ( -
- {filteredServers.map((serverInfo) => ( - - ))} -
- )} + ) }