From 70fbaa0bfd6d8672e56eee61e391255dbfee7aa1 Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sat, 7 Mar 2026 19:27:31 +0100 Subject: [PATCH] Update latency-detail-modal.tsx --- AppImage/components/latency-detail-modal.tsx | 43 ++++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/AppImage/components/latency-detail-modal.tsx b/AppImage/components/latency-detail-modal.tsx index 94fbfdf2..2c13f0b5 100644 --- a/AppImage/components/latency-detail-modal.tsx +++ b/AppImage/components/latency-detail-modal.tsx @@ -170,9 +170,17 @@ const generateLatencyReport = (report: ReportData) => { endTime: new Date(report.data[report.data.length - 1].timestamp * 1000).toLocaleString(), } : null - // Generate chart SVG - const chartData = report.isRealtime - ? report.realtimeResults.map(r => r.latency_avg || 0) + // Generate chart SVG - expand realtime to all 3 values (min, avg, max) per sample + const chartData = report.isRealtime + ? report.realtimeResults.flatMap(r => { + const points: number[] = [] + if (r.latency_min !== null) points.push(r.latency_min) + if (r.latency_avg !== null && r.latency_avg !== r.latency_min && r.latency_avg !== r.latency_max) { + points.push(r.latency_avg) + } + if (r.latency_max !== null) points.push(r.latency_max) + return points.length > 0 ? points : [r.latency_avg ?? 0] + }) : report.data.map(d => d.value || 0) let chartSvg = '

Not enough data points for chart

' @@ -695,11 +703,10 @@ ${report.isRealtime && report.realtimeResults.length > 0 ? ` ` - const printWindow = window.open('', '_blank') - if (printWindow) { - printWindow.document.write(html) - printWindow.document.close() - } + // Use Blob URL for Safari-safe preview (avoids document.write issues on mobile) + const blob = new Blob([html], { type: "text/html" }) + const url = URL.createObjectURL(blob) + window.open(url, "_blank") } export function LatencyDetailModal({ open, onOpenChange, currentLatency }: LatencyDetailModalProps) { @@ -822,11 +829,21 @@ export function LatencyDetailModal({ open, onOpenChange, currentLatency }: Laten time: new Date(point.timestamp * 1000).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }), })) - const realtimeChartData = realtimeResults.map((r, i) => ({ - time: new Date(r.timestamp || Date.now()).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }), - value: r.latency_avg, - packet_loss: r.packet_loss, - })) + // Expand each sample to 3 data points (min, avg, max) for accurate representation + const realtimeChartData = realtimeResults.flatMap((r, i) => { + const time = new Date(r.timestamp || Date.now()).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', second: '2-digit' }) + const points = [] + if (r.latency_min !== null) points.push({ time, value: r.latency_min, packet_loss: r.packet_loss }) + if (r.latency_avg !== null && r.latency_avg !== r.latency_min && r.latency_avg !== r.latency_max) { + points.push({ time, value: r.latency_avg, packet_loss: r.packet_loss }) + } + if (r.latency_max !== null) points.push({ time, value: r.latency_max, packet_loss: r.packet_loss }) + // If no valid points, add avg as fallback + if (points.length === 0 && r.latency_avg !== null) { + points.push({ time, value: r.latency_avg, packet_loss: r.packet_loss }) + } + return points + }) // Calculate realtime stats const realtimeStats = realtimeResults.length > 0 ? {