import { useState, useMemo } from "react"; import { Button } from "@/components/ui/button"; import { StatsBar } from "@/components/sections/StatsBar"; import { NodeCard } from "@/components/sections/NodeCard"; import { NodeListHeader } from "@/components/sections/NodeListHeader"; import { NodeListItem } from "@/components/sections/NodeListItem"; import Loading from "@/components/loading"; import type { NodeWithStatus } from "@/types/node"; import { useNodeData } from "@/contexts/NodeDataContext"; import { useLiveData } from "@/contexts/LiveDataContext"; interface HomePageProps { viewMode: "card" | "list"; searchTerm: string; } const HomePage: React.FC = ({ viewMode, searchTerm }) => { const { nodes: staticNodes, loading, getGroups } = useNodeData(); const { liveData } = useLiveData(); const [selectedGroup, setSelectedGroup] = useState("所有"); const [displayOptions, setDisplayOptions] = useState({ time: true, online: true, regions: true, traffic: true, speed: true, }); const [currentTime] = useState(new Date()); const combinedNodes = useMemo(() => { if (!staticNodes) return []; return staticNodes.map((node) => { const isOnline = liveData?.online.includes(node.uuid) ?? false; const stats = isOnline ? liveData?.data[node.uuid] : undefined; return { ...node, status: isOnline ? "online" : "offline", stats: stats, }; }); }, [staticNodes, liveData]); const groups = useMemo(() => ["所有", ...getGroups()], [getGroups]); const filteredNodes = useMemo(() => { return combinedNodes .filter( (node: NodeWithStatus) => selectedGroup === "所有" || node.group === selectedGroup ) .filter((node: NodeWithStatus) => node.name.toLowerCase().includes(searchTerm.toLowerCase()) ); }, [combinedNodes, selectedGroup, searchTerm]); const stats = useMemo(() => { return { onlineCount: filteredNodes.filter((n) => n.status === "online").length, totalCount: filteredNodes.length, uniqueRegions: new Set(filteredNodes.map((n) => n.region)).size, totalTrafficUp: filteredNodes.reduce( (acc, node) => acc + (node.stats?.network.totalUp || 0), 0 ), totalTrafficDown: filteredNodes.reduce( (acc, node) => acc + (node.stats?.network.totalDown || 0), 0 ), currentSpeedUp: filteredNodes.reduce( (acc, node) => acc + (node.stats?.network.up || 0), 0 ), currentSpeedDown: filteredNodes.reduce( (acc, node) => acc + (node.stats?.network.down || 0), 0 ), }; }, [filteredNodes]); return (
分组 {groups.map((group: string) => ( ))}
{loading ? ( ) : filteredNodes.length > 0 ? (
{viewMode === "list" && } {filteredNodes.map((node: NodeWithStatus) => viewMode === "card" ? ( ) : ( ) )}
) : (

没有结果

请尝试更改筛选条件

)}
); }; export default HomePage;