减少 portal 目录层级和多余出口文件
This commit is contained in:
1 parent
84ec777e49
commit
41a946d39c
41 files changed
+67
-255
No files matched your search
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,7 +0,0 @@
|
||||
export {LoadingSpinner} from './LoadingSpinner';
|
||||
export {EmptyState} from './EmptyState';
|
||||
export {ChartPlaceholder} from './ChartPlaceholder';
|
||||
export {CustomTooltip} from './CustomTooltip';
|
||||
export {TimeRangeSelector} from './TimeRangeSelector';
|
||||
export {Card} from './Card';
|
||||
export {MobileLegend} from './MobileLegend';
|
||||
@@ -1,5 +1,5 @@
|
||||
import {AlertCircle, Clock, MapPin} from 'lucide-react';
|
||||
import {StatusBadge} from '../common/StatusBadge.tsx';
|
||||
import {StatusBadge} from '@portal/components/StatusBadge';
|
||||
import {CertBadge} from './CertBadge';
|
||||
import {AGENT_COLORS} from '@portal/constants/colors';
|
||||
import {formatDateTime, formatTime} from '@portal/utils/util';
|
||||
|
||||
@@ -4,28 +4,13 @@ import {useQuery} from "@tanstack/react-query";
|
||||
import {type GetMetricsResponse, getMonitorHistory} from "@/api/monitor.ts";
|
||||
import {useMemo} from "react";
|
||||
import CyberCard from "@portal/components/CyberCard.tsx";
|
||||
import {StatusBadge} from "@portal/components/common/StatusBadge.tsx";
|
||||
import {StatusBadge} from "@portal/components/StatusBadge";
|
||||
import {CertBadge} from "@portal/components/monitor/CertBadge.tsx";
|
||||
import {formatDateTime} from "@portal/utils/util.ts";
|
||||
import {MiniChart} from "@portal/components/monitor/MiniChart.tsx";
|
||||
import type {DisplayMode} from "@portal/components/monitor/index.ts";
|
||||
import {Activity, Globe, Server, ShieldCheck, Wifi} from "lucide-react";
|
||||
import {TypeIcon} from "@portal/components/monitor/TypeIcon";
|
||||
|
||||
// 类型图标组件
|
||||
const TypeIcon = ({type}: { type: string }) => {
|
||||
switch (type.toUpperCase()) {
|
||||
case 'HTTPS':
|
||||
return <ShieldCheck className="w-4 h-4 text-purple-400"/>;
|
||||
case 'HTTP':
|
||||
return <Globe className="w-4 h-4 text-blue-400"/>;
|
||||
case 'TCP':
|
||||
return <Server className="w-4 h-4 text-amber-400"/>;
|
||||
case 'ICMP':
|
||||
return <Wifi className="w-4 h-4 text-cyan-500"/>;
|
||||
default:
|
||||
return <Activity className="w-4 h-4 text-slate-400"/>;
|
||||
}
|
||||
};
|
||||
export type DisplayMode = 'avg' | 'max';
|
||||
|
||||
const MonitorCard = ({monitor, displayMode}: {
|
||||
monitor: PublicMonitor;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import {ArrowLeft} from 'lucide-react';
|
||||
import {TypeIcon} from './TypeIcon';
|
||||
import {StatusBadge} from '../common/StatusBadge.tsx';
|
||||
import {StatusBadge} from '@portal/components/StatusBadge';
|
||||
import {CertBadge} from './CertBadge';
|
||||
import LittleStatCard from '@portal/components/common/LittleStatCard';
|
||||
import LittleStatCard from '@portal/components/LittleStatCard';
|
||||
import type {PublicMonitor} from '@/types';
|
||||
import CyberCard from "@portal/components/CyberCard.tsx";
|
||||
import {formatDateTime} from "@portal/utils/util.ts";
|
||||
|
||||
@@ -7,7 +7,10 @@ import {MONITOR_TIME_RANGE_OPTIONS} from '@portal/constants/time';
|
||||
import {useIsMobile} from '@portal/hooks/use-mobile';
|
||||
import type {AgentMonitorStat} from '@/types';
|
||||
import CyberCard from "@portal/components/CyberCard.tsx";
|
||||
import {ChartPlaceholder, CustomTooltip, MobileLegend, TimeRangeSelector} from "@portal/components/common";
|
||||
import {ChartPlaceholder} from "@portal/components/ChartPlaceholder";
|
||||
import {CustomTooltip} from "@portal/components/CustomTooltip";
|
||||
import {MobileLegend} from "@portal/components/MobileLegend";
|
||||
import {TimeRangeSelector} from "@portal/components/TimeRangeSelector";
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
interface ResponseTimeChartProps {
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
export {CertBadge} from './CertBadge';
|
||||
export {MiniChart} from './MiniChart';
|
||||
export {StatusBadge} from '../common/StatusBadge.tsx';
|
||||
export {TypeIcon} from './TypeIcon';
|
||||
export {MonitorHero} from './MonitorHero';
|
||||
export {ResponseTimeChart} from './ResponseTimeChart';
|
||||
export {AgentStatsTable} from './AgentStatsTable';
|
||||
|
||||
|
||||
export type DisplayMode = 'avg' | 'max';
|
||||
export type FilterStatus = 'all' | 'up' | 'down' | 'unknown';
|
||||
File renamed without changes.
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useMemo} from 'react';
|
||||
import {Cpu} from 'lucide-react';
|
||||
import {Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useMemo} from 'react';
|
||||
import {HardDrive} from 'lucide-react';
|
||||
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useMemo} from 'react';
|
||||
import {Zap} from 'lucide-react';
|
||||
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {Zap} from 'lucide-react';
|
||||
import {Card} from '@portal/components/common';
|
||||
import {Card} from '@portal/components/Card';
|
||||
import {formatBytes} from '@portal/utils/util';
|
||||
import type {LatestMetrics} from '@/types';
|
||||
|
||||
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useMemo} from 'react';
|
||||
import {MemoryStick} from 'lucide-react';
|
||||
import {Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
+4
-2
@@ -1,8 +1,10 @@
|
||||
import {useMemo} from 'react';
|
||||
import {Activity} from 'lucide-react';
|
||||
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip, MobileLegend} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {MobileLegend} from '@portal/components/MobileLegend';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {useIsMobile} from '@portal/hooks/use-mobile';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useEffect, useMemo, useState} from 'react';
|
||||
import {Network} from 'lucide-react';
|
||||
import {Area, AreaChart, CartesianGrid, Legend, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery, useNetworkInterfacesQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery, useNetworkInterfacesQuery} from '@portal/hooks/server';
|
||||
import {INTERFACE_COLORS} from '@portal/constants/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useMemo} from 'react';
|
||||
import {Network} from 'lucide-react';
|
||||
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import {Network} from 'lucide-react';
|
||||
import {Card} from '@portal/components/common';
|
||||
import {Card} from '@portal/components/Card';
|
||||
import type {LatestMetrics} from '@/types';
|
||||
|
||||
interface NetworkConnectionSectionProps {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import {ArrowLeft} from 'lucide-react';
|
||||
import {formatBytes, formatDateTime, formatUptime} from '@portal/utils/util';
|
||||
import type {Agent, LatestMetrics} from '@/types';
|
||||
import LittleStatCard from '@portal/components/common/LittleStatCard';
|
||||
import LittleStatCard from '@portal/components/LittleStatCard';
|
||||
import CyberCard from "@portal/components/CyberCard.tsx";
|
||||
import {StatusBadge} from "@portal/components/common/StatusBadge.tsx";
|
||||
import {StatusBadge} from "@portal/components/StatusBadge";
|
||||
|
||||
interface ServerHeroProps {
|
||||
agent: Agent;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import {Cpu, HardDrive, MemoryStick, Network} from 'lucide-react';
|
||||
import {InfoGrid, type SnapshotCardData, SnapshotSection} from '@portal/components/server';
|
||||
import {InfoGrid} from '@portal/components/server/InfoGrid';
|
||||
import {SnapshotSection} from '@portal/components/server/SnapshotSection';
|
||||
import type {SnapshotCardData} from '@portal/components/server/SnapshotGrid';
|
||||
import {formatBytes, formatDateTime, formatPercentValue, formatUptime} from '@portal/utils/util';
|
||||
import type {Agent, LatestMetrics} from '@/types';
|
||||
import CyberCard from "@portal/components/CyberCard.tsx";
|
||||
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
import {useEffect, useMemo, useState} from 'react';
|
||||
import {Thermometer} from 'lucide-react';
|
||||
import {CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis} from 'recharts';
|
||||
import {ChartPlaceholder, CustomTooltip} from '@portal/components/common';
|
||||
import {useMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {ChartPlaceholder} from '@portal/components/ChartPlaceholder';
|
||||
import {CustomTooltip} from '@portal/components/CustomTooltip';
|
||||
import {useMetricsQuery} from '@portal/hooks/server';
|
||||
import {TEMPERATURE_COLORS} from '@portal/constants/server';
|
||||
import {ChartContainer} from './ChartContainer';
|
||||
import {formatChartTime} from '@portal/utils/util';
|
||||
@@ -1,5 +1,5 @@
|
||||
import {Thermometer} from 'lucide-react';
|
||||
import {Card} from '@portal/components/common';
|
||||
import {Card} from '@portal/components/Card';
|
||||
import type {LatestMetrics} from '@/types';
|
||||
|
||||
interface TemperatureMonitorSectionProps {
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
export {ChartContainer} from './ChartContainer';
|
||||
export {CpuChart} from './CpuChart';
|
||||
export {MemoryChart} from './MemoryChart';
|
||||
export {NetworkChart} from './NetworkChart';
|
||||
export {DiskIOChart} from './DiskIOChart';
|
||||
export {NetworkConnectionChart} from './NetworkConnectionChart';
|
||||
export {GpuChart} from './GpuChart';
|
||||
export {TemperatureChart} from './TemperatureChart';
|
||||
export {MonitorChart} from './MonitorChart';
|
||||
@@ -1,9 +0,0 @@
|
||||
export {InfoGrid} from './InfoGrid';
|
||||
export {SnapshotGrid} from './SnapshotGrid';
|
||||
export {SnapshotSection} from './SnapshotSection';
|
||||
export type {SnapshotCardData} from './SnapshotGrid';
|
||||
export {ServerHero} from './ServerHero';
|
||||
export {SystemInfoSection} from './SystemInfoSection';
|
||||
export {NetworkConnectionSection} from './NetworkConnectionSection';
|
||||
export {GpuMonitorSection} from './GpuMonitorSection';
|
||||
export {TemperatureMonitorSection} from './TemperatureMonitorSection';
|
||||
@@ -1,5 +0,0 @@
|
||||
// React Query hooks
|
||||
export {useAgentQuery} from './queries/useAgentQuery';
|
||||
export {useLatestMetricsQuery} from './queries/useLatestMetricsQuery';
|
||||
export {useMetricsQuery} from './queries/useMetricsQuery';
|
||||
export {useNetworkInterfacesQuery} from './queries/useNetworkInterfacesQuery';
|
||||
@@ -1,4 +0,0 @@
|
||||
export {useAgentQuery} from './useAgentQuery';
|
||||
export {useLatestMetricsQuery} from './useLatestMetricsQuery';
|
||||
export {useMetricsQuery} from './useMetricsQuery';
|
||||
export {useNetworkInterfacesQuery} from './useNetworkInterfacesQuery';
|
||||
@@ -1,16 +0,0 @@
|
||||
import {useQuery} from '@tanstack/react-query';
|
||||
import {getAgent} from '@/api/agent';
|
||||
|
||||
/**
|
||||
* 查询 Agent 基础信息
|
||||
* @param agentId Agent ID
|
||||
* @returns Agent 查询结果
|
||||
*/
|
||||
export const useAgentQuery = (agentId?: string) => {
|
||||
return useQuery({
|
||||
queryKey: ['agent', agentId],
|
||||
queryFn: () => getAgent(agentId!),
|
||||
enabled: !!agentId,
|
||||
staleTime: 60000, // 1分钟缓存
|
||||
});
|
||||
};
|
||||
@@ -1,17 +0,0 @@
|
||||
import {useQuery} from '@tanstack/react-query';
|
||||
import {getAgentLatestMetrics} from '@/api/agent';
|
||||
|
||||
/**
|
||||
* 查询 Agent 最新指标
|
||||
* 自动每 5 秒刷新一次
|
||||
* @param agentId Agent ID
|
||||
* @returns 最新指标查询结果
|
||||
*/
|
||||
export const useLatestMetricsQuery = (agentId?: string) => {
|
||||
return useQuery({
|
||||
queryKey: ['agent', agentId, 'metrics', 'latest'],
|
||||
queryFn: () => getAgentLatestMetrics(agentId!),
|
||||
enabled: !!agentId,
|
||||
refetchInterval: 5000, // 5秒自动刷新
|
||||
});
|
||||
};
|
||||
@@ -1,33 +0,0 @@
|
||||
import {useQuery} from '@tanstack/react-query';
|
||||
import {getAgentMetrics, type GetAgentMetricsRequest} from '@/api/agent';
|
||||
|
||||
interface UseMetricsQueryOptions {
|
||||
agentId: string;
|
||||
type: GetAgentMetricsRequest['type'];
|
||||
range?: string;
|
||||
start?: number;
|
||||
end?: number;
|
||||
interfaceName?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询 Agent 历史指标数据
|
||||
* @param options 查询选项
|
||||
* @returns 历史指标查询结果
|
||||
*/
|
||||
export const useMetricsQuery = ({agentId, type, range, start, end, interfaceName}: UseMetricsQueryOptions) => {
|
||||
return useQuery({
|
||||
queryKey: ['agent', agentId, 'metrics', type, range, start, end, interfaceName],
|
||||
queryFn: () =>
|
||||
getAgentMetrics({
|
||||
agentId,
|
||||
type,
|
||||
range,
|
||||
start,
|
||||
end,
|
||||
interface: interfaceName,
|
||||
}),
|
||||
enabled: !!agentId,
|
||||
// refetchInterval: 30000, // 30秒自动刷新
|
||||
});
|
||||
};
|
||||
@@ -1,15 +0,0 @@
|
||||
import {useQuery} from '@tanstack/react-query';
|
||||
import {getAvailableNetworkInterfaces} from '@/api/agent';
|
||||
|
||||
/**
|
||||
* 查询 Agent 可用网卡列表
|
||||
* @param agentId Agent ID
|
||||
* @returns 网卡列表查询结果
|
||||
*/
|
||||
export const useNetworkInterfacesQuery = (agentId?: string) => {
|
||||
return useQuery({
|
||||
queryKey: ['agent', agentId, 'network-interfaces'],
|
||||
queryFn: () => getAvailableNetworkInterfaces(agentId!),
|
||||
enabled: !!agentId,
|
||||
});
|
||||
};
|
||||
@@ -1,62 +0,0 @@
|
||||
import {Shield} from "lucide-react";
|
||||
import {cn} from "@/lib/utils.ts";
|
||||
import type {CertStats} from "@/types";
|
||||
import {formatDate} from "@portal/utils/util.ts";
|
||||
|
||||
export const renderCert = (stats: CertStats) => {
|
||||
const hasCert = stats.certExpiryTime > 0;
|
||||
const certExpired = hasCert && stats.certDaysLeft < 0;
|
||||
const certExpiringSoon = hasCert && stats.certDaysLeft >= 0 && stats.certDaysLeft < 30;
|
||||
if (!hasCert) {
|
||||
return <span className="text-sm text-slate-400 dark:text-slate-500">-</span>
|
||||
}
|
||||
|
||||
return <div className="flex items-center gap-2">
|
||||
<Shield
|
||||
className={cn(
|
||||
"h-4 w-4",
|
||||
certExpired
|
||||
? 'text-red-600 dark:text-red-400'
|
||||
: certExpiringSoon
|
||||
? 'text-yellow-600 dark:text-yellow-500'
|
||||
: 'text-slate-400 dark:text-slate-500'
|
||||
)}/>
|
||||
<div className="text-xs">
|
||||
<div
|
||||
className={cn(
|
||||
"font-medium",
|
||||
certExpired
|
||||
? 'text-red-700 dark:text-red-300'
|
||||
: certExpiringSoon
|
||||
? 'text-yellow-700 dark:text-yellow-300'
|
||||
: 'text-slate-700 dark:text-slate-200'
|
||||
)}>
|
||||
{formatDate(stats.certExpiryTime)}
|
||||
</div>
|
||||
<div
|
||||
className={cn(
|
||||
certExpired
|
||||
? 'text-red-600 dark:text-red-400'
|
||||
: certExpiringSoon
|
||||
? 'text-yellow-600 dark:text-yellow-400'
|
||||
: 'text-slate-500 dark:text-slate-400'
|
||||
)}>
|
||||
{certExpired ? `已过期 ${Math.abs(stats.certDaysLeft)} 天` : `剩余 ${stats.certDaysLeft} 天`}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
export const UptimeBar = ({uptime}: { uptime: number }) => {
|
||||
const percentage = Math.min(Math.max(uptime, 0), 100);
|
||||
const colorClass = percentage >= 99 ? 'bg-emerald-500' : percentage >= 95 ? 'bg-yellow-500' : 'bg-red-500';
|
||||
|
||||
return (
|
||||
<div className="relative h-2 w-full overflow-hidden rounded-lg bg-slate-100 dark:bg-slate-800">
|
||||
<div
|
||||
className={cn("absolute inset-y-0 left-0 transition-all duration-500", colorClass)}
|
||||
style={{width: `${percentage}%`}}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -2,8 +2,11 @@ import {useNavigate, useParams} from 'react-router-dom';
|
||||
import {useQuery} from '@tanstack/react-query';
|
||||
import {getMonitorAgentStats, getMonitorStatsById} from '@/api/monitor.ts';
|
||||
import type {AgentMonitorStat, PublicMonitor} from '@/types';
|
||||
import {MonitorHero, ResponseTimeChart, AgentStatsTable} from '@portal/components/monitor';
|
||||
import {EmptyState, LoadingSpinner} from '@portal/components/common';
|
||||
import {MonitorHero} from '@portal/components/monitor/MonitorHero';
|
||||
import {ResponseTimeChart} from '@portal/components/monitor/ResponseTimeChart';
|
||||
import {AgentStatsTable} from '@portal/components/monitor/AgentStatsTable';
|
||||
import {EmptyState} from '@portal/components/EmptyState';
|
||||
import {LoadingSpinner} from '@portal/components/LoadingSpinner';
|
||||
|
||||
/**
|
||||
* 监控详情页面
|
||||
|
||||
@@ -6,8 +6,7 @@ import {getPublicMonitors} from '@/api/monitor.ts';
|
||||
import type {PublicMonitor} from '@/types';
|
||||
import {cn} from '@/lib/utils';
|
||||
import StatBlock from "@portal/components/StatBlock.tsx";
|
||||
import type {DisplayMode, FilterStatus} from "@portal/components/monitor";
|
||||
import MonitorCard from "@portal/components/monitor/MonitorCard.tsx";
|
||||
import MonitorCard, {type DisplayMode} from "@portal/components/monitor/MonitorCard";
|
||||
|
||||
const LoadingSpinner = () => (
|
||||
<div className="flex min-h-[400px] w-full items-center justify-center">
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
import {useState} from 'react';
|
||||
import {useNavigate, useParams} from 'react-router-dom';
|
||||
import {Card, EmptyState, LoadingSpinner, TimeRangeSelector} from '@portal/components/common';
|
||||
import {
|
||||
GpuMonitorSection,
|
||||
NetworkConnectionSection,
|
||||
ServerHero,
|
||||
SystemInfoSection,
|
||||
TemperatureMonitorSection,
|
||||
} from '@portal/components/server';
|
||||
import {
|
||||
CpuChart,
|
||||
DiskIOChart,
|
||||
GpuChart,
|
||||
MemoryChart,
|
||||
MonitorChart,
|
||||
NetworkChart,
|
||||
NetworkConnectionChart,
|
||||
TemperatureChart,
|
||||
} from '@portal/components/server/charts';
|
||||
import {useAgentQuery, useLatestMetricsQuery} from '@portal/hooks/server/queries';
|
||||
import {Card} from '@portal/components/Card';
|
||||
import {EmptyState} from '@portal/components/EmptyState';
|
||||
import {LoadingSpinner} from '@portal/components/LoadingSpinner';
|
||||
import {TimeRangeSelector} from '@portal/components/TimeRangeSelector';
|
||||
import {GpuMonitorSection} from '@portal/components/server/GpuMonitorSection';
|
||||
import {NetworkConnectionSection} from '@portal/components/server/NetworkConnectionSection';
|
||||
import {ServerHero} from '@portal/components/server/ServerHero';
|
||||
import {SystemInfoSection} from '@portal/components/server/SystemInfoSection';
|
||||
import {TemperatureMonitorSection} from '@portal/components/server/TemperatureMonitorSection';
|
||||
import {CpuChart} from '@portal/components/server/CpuChart';
|
||||
import {DiskIOChart} from '@portal/components/server/DiskIOChart';
|
||||
import {GpuChart} from '@portal/components/server/GpuChart';
|
||||
import {MemoryChart} from '@portal/components/server/MemoryChart';
|
||||
import {MonitorChart} from '@portal/components/server/MonitorChart';
|
||||
import {NetworkChart} from '@portal/components/server/NetworkChart';
|
||||
import {NetworkConnectionChart} from '@portal/components/server/NetworkConnectionChart';
|
||||
import {TemperatureChart} from '@portal/components/server/TemperatureChart';
|
||||
import {useAgentQuery, useLatestMetricsQuery} from '@portal/hooks/server';
|
||||
import {SERVER_TIME_RANGE_OPTIONS} from '@portal/constants/time';
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user