import { useState, useEffect, lazy, Suspense, useMemo } from "react"; import { useParams, useNavigate } from "react-router-dom"; import { useNodeData } from "@/contexts/NodeDataContext"; import { useLiveData } from "@/contexts/LiveDataContext"; import type { NodeData, NodeWithStatus } from "@/types/node"; import { Button } from "@/components/ui/button"; import { ArrowLeft } from "lucide-react"; import Instance from "./Instance"; const LoadCharts = lazy(() => import("./LoadCharts")); const PingChart = lazy(() => import("./PingChart")); import Loading from "@/components/loading"; import Flag from "@/components/sections/Flag"; import { useConfigItem } from "@/config"; const InstancePage = () => { const { uuid } = useParams<{ uuid: string }>(); const navigate = useNavigate(); const { nodes: staticNodes, publicSettings, loading: nodesLoading, } = useNodeData(); const { liveData } = useLiveData(); useNodeData(); const [staticNode, setStaticNode] = useState(null); const [chartType, setChartType] = useState<"load" | "ping">("load"); const [loadHours, setLoadHours] = useState(0); const [pingHours, setPingHours] = useState(1); // 默认1小时 const enableInstanceDetail = useConfigItem("enableInstanceDetail"); const enablePingChart = useConfigItem("enablePingChart"); const maxRecordPreserveTime = publicSettings?.record_preserve_time || 0; // 默认0表示关闭 const maxPingRecordPreserveTime = publicSettings?.ping_record_preserve_time || 24; // 默认1天 const timeRanges = useMemo(() => { return [ { label: "实时", hours: 0 }, { label: "1小时", hours: 1 }, { label: "6小时", hours: 6 }, { label: "1天", hours: 24 }, { label: "7天", hours: 168 }, { label: "30天", hours: 720 }, ]; }, []); const pingTimeRanges = useMemo(() => { const filtered = timeRanges.filter( (range) => range.hours !== 0 && range.hours <= maxPingRecordPreserveTime ); if (maxPingRecordPreserveTime > 720) { filtered.push({ label: `${maxPingRecordPreserveTime}小时`, hours: maxPingRecordPreserveTime, }); } return filtered; }, [timeRanges, maxPingRecordPreserveTime]); const loadTimeRanges = useMemo(() => { const filtered = timeRanges.filter( (range) => range.hours <= maxRecordPreserveTime ); if (maxRecordPreserveTime > 720) { filtered.push({ label: `${maxRecordPreserveTime}小时`, hours: maxRecordPreserveTime, }); } return filtered; }, [timeRanges, maxRecordPreserveTime]); useEffect(() => { const foundNode = staticNodes.find((n) => n.uuid === uuid); setStaticNode(foundNode || null); }, [staticNodes, uuid]); const node = useMemo(() => { if (!staticNode) return null; const isOnline = liveData?.online.includes(staticNode.uuid) ?? false; const stats = isOnline ? liveData?.data[staticNode.uuid] : undefined; return { ...staticNode, status: isOnline ? "online" : "offline", stats, }; }, [staticNode, liveData]); if (!node || !staticNode) { if (nodesLoading) { return (
); } return (
未找到该节点
); } return (
{node.name}
{node.status === "online" ? "在线" : "离线"}
{enableInstanceDetail && }
{enablePingChart && ( )}
{chartType === "load" ? (
{loadTimeRanges.map((range) => ( ))}
) : (
{pingTimeRanges.map((range) => ( ))}
)}
}> {chartType === "load" && staticNode ? ( ) : chartType === "ping" && staticNode ? ( ) : null} ); }; export default InstancePage;