Files
Void-Homelab/public/views/cards/speedtest.js
2026-06-02 22:51:22 +10:00

28 lines
1.3 KiB
JavaScript

// public/views/cards/speedtest.js
import { el, mount } from '../../dom.js';
import { api } from '../../api.js';
let body;
async function load() {
if (!body) return;
try {
const hist = await api.get('/api/speedtest/history');
const latest = hist[0];
const max = Math.max(1, ...hist.map(h => Number(h.down_mbps)));
const bars = el('div', { style: { display: 'flex', gap: '2px', alignItems: 'flex-end', height: '40px', marginTop: '8px' } },
hist.slice(0, 30).reverse().map(h =>
el('div', { style: { flex: '1', background: 'var(--accent-dim)',
height: (Number(h.down_mbps) / max * 100) + '%' } })));
mount(body,
el('div', { class: 'sv-row', style: { fontSize: '20px' } },
el('span', { style: { fontFamily: 'var(--font-mono)' } }, latest ? `${Number(latest.down_mbps).toFixed(0)}${Number(latest.up_mbps).toFixed(0)}` : '—'),
el('button', { class: 'sv-run', onclick: runNow }, 'Run')),
bars);
} catch { mount(body, el('span', { class: 'muted' }, 'No speedtest data')); }
}
async function runNow() { try { await api.post('/api/speedtest/run', {}); } catch {} setTimeout(load, 3000); }
export default {
id: 'speedtest', title: 'Speedtest', size: 'm',
mount(el_) { body = el_; load(); }, start() {}, stop() { body = null; }
};