From ddca96a60e9165f1168266b00ad933da70db350b Mon Sep 17 00:00:00 2001 From: MacRimi Date: Fri, 24 Oct 2025 19:20:37 +0200 Subject: [PATCH] Update AppImage --- AppImage/components/network-traffic-chart.tsx | 32 +++++++++++++++---- AppImage/components/system-overview.tsx | 26 ++++++++++++--- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/AppImage/components/network-traffic-chart.tsx b/AppImage/components/network-traffic-chart.tsx index 48afdc9..38e99c2 100644 --- a/AppImage/components/network-traffic-chart.tsx +++ b/AppImage/components/network-traffic-chart.tsx @@ -13,6 +13,7 @@ interface NetworkMetricsData { interface NetworkTrafficChartProps { timeframe: string + onTotalsCalculated?: (totals: { received: number; sent: number }) => void } const CustomNetworkTooltip = ({ active, payload, label }: any) => { @@ -25,7 +26,7 @@ const CustomNetworkTooltip = ({ active, payload, label }: any) => {
{entry.name}: - {entry.value} GB + {entry.value.toFixed(3)} GB
))}
@@ -35,7 +36,7 @@ const CustomNetworkTooltip = ({ active, payload, label }: any) => { return null } -export function NetworkTrafficChart({ timeframe }: NetworkTrafficChartProps) { +export function NetworkTrafficChart({ timeframe, onTotalsCalculated }: NetworkTrafficChartProps) { const [data, setData] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) @@ -75,7 +76,8 @@ export function NetworkTrafficChart({ timeframe }: NetworkTrafficChartProps) { return } - const transformedData = result.data.map((item: any) => { + // RRD data contains rate (bytes/second), we need to calculate traffic per interval + const transformedData = result.data.map((item: any, index: number) => { const date = new Date(item.time * 1000) let timeLabel = "" @@ -105,15 +107,33 @@ export function NetworkTrafficChart({ timeframe }: NetworkTrafficChartProps) { }) } + // Calculate time interval between data points (in seconds) + let intervalSeconds = 60 // Default to 1 minute + if (index > 0) { + intervalSeconds = item.time - result.data[index - 1].time + } + + // Convert rate (bytes/second) to traffic in this interval (GB) + // netin and netout are in bytes/second, multiply by interval to get total bytes + const netInBytes = (item.netin || 0) * intervalSeconds + const netOutBytes = (item.netout || 0) * intervalSeconds + return { time: timeLabel, timestamp: item.time, - netIn: item.netin ? Number((item.netin / 1024 / 1024 / 1024).toFixed(2)) : 0, - netOut: item.netout ? Number((item.netout / 1024 / 1024 / 1024).toFixed(2)) : 0, + netIn: Number((netInBytes / 1024 / 1024 / 1024).toFixed(4)), + netOut: Number((netOutBytes / 1024 / 1024 / 1024).toFixed(4)), } }) setData(transformedData) + + const totalReceived = transformedData.reduce((sum: number, item: NetworkMetricsData) => sum + item.netIn, 0) + const totalSent = transformedData.reduce((sum: number, item: NetworkMetricsData) => sum + item.netOut, 0) + + if (onTotalsCalculated) { + onTotalsCalculated({ received: totalReceived, sent: totalSent }) + } } catch (err: any) { console.error("[v0] Error fetching network metrics:", err) setError(err.message || "Error loading metrics") @@ -197,7 +217,7 @@ export function NetworkTrafficChart({ timeframe }: NetworkTrafficChartProps) { className="text-foreground" tick={{ fill: "currentColor", fontSize: 12 }} label={{ value: "GB", angle: -90, position: "insideLeft", fill: "currentColor" }} - domain={[0, "dataMax"]} + domain={[0, "auto"]} /> } /> diff --git a/AppImage/components/system-overview.tsx b/AppImage/components/system-overview.tsx index 387b146..c7bec5e 100644 --- a/AppImage/components/system-overview.tsx +++ b/AppImage/components/system-overview.tsx @@ -232,6 +232,7 @@ export function SystemOverview() { const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [networkTimeframe, setNetworkTimeframe] = useState("day") + const [networkTotals, setNetworkTotals] = useState<{ received: number; sent: number }>({ received: 0, sent: 0 }) useEffect(() => { const fetchData = async () => { @@ -396,7 +397,7 @@ export function SystemOverview() { return `${sizeInGB.toFixed(1)} GB` } else { // 1024 GB or more, show in TB - return `${(sizeInGB / 1024).toFixed(1)} TB` + return `${(sizeInGB / 1024).toFixed(2)} TB` } } @@ -459,6 +460,21 @@ export function SystemOverview() { const loadStatus = getLoadStatus(systemData.load_average[0], systemData.cpu_cores || 8) + const getTimeframeLabel = (timeframe: string): string => { + switch (timeframe) { + case "hour": + return "1h" + case "day": + return "24h" + case "week": + return "7d" + case "month": + return "30d" + default: + return timeframe + } + } + return (
{/* Key Metrics Cards */} @@ -693,19 +709,21 @@ export function SystemOverview() {
Received: - ↓ {formatStorage(networkData.traffic.bytes_recv / 1024 ** 3)} + ↓ {formatStorage(networkTotals.received)} + ({getTimeframeLabel(networkTimeframe)})
Sent: - ↑ {formatStorage(networkData.traffic.bytes_sent / 1024 ** 3)} + ↑ {formatStorage(networkTotals.sent)} + ({getTimeframeLabel(networkTimeframe)})
- +
) : (