import { useEffect, useState } from 'react'; import { api } from '../api/client'; import StatusBadge from '../components/StatusBadge'; interface Broker { id: number; name: string; status: string } interface Datapoint { id: number; name: string; label: string; value: string | null; unit: string | null; source_type: string; status: string; updated_at: string | null } interface Display { id: number; name: string; last_seen: string | null } export default function Dashboard() { const [brokers, setBrokers] = useState([]); const [datapoints, setDatapoints] = useState([]); const [displays, setDisplays] = useState([]); const [error, setError] = useState(''); useEffect(() => { Promise.all([ api.get('/api/mqtt/brokers'), api.get('/api/datapoints'), api.get('/api/displays'), ]) .then(([b, d, disp]) => { setBrokers(b); setDatapoints(d); setDisplays(disp); }) .catch((err) => setError((err as Error).message)); }, []); const lastUpdate = datapoints .map((d) => d.updated_at) .filter(Boolean) .sort() .at(-1); const tiles = [ { label: 'MQTT Broker', value: brokers.length, color: 'bg-blue-50 border-blue-200' }, { label: 'Datenpunkte', value: datapoints.length, color: 'bg-green-50 border-green-200' }, { label: 'Displays', value: displays.length, color: 'bg-purple-50 border-purple-200' }, { label: 'Letztes Update', value: lastUpdate ? new Date(lastUpdate).toLocaleString('de') : '-', color: 'bg-yellow-50 border-yellow-200' }, ]; return (

Dashboard

{error &&
{error}
}
{tiles.map(({ label, value, color }) => (

{label}

{value}

))}

Datenpunkte

{datapoints.length === 0 && ( )} {datapoints.map((dp) => ( ))}
Bezeichnung Wert Einheit Status
Keine Datenpunkte vorhanden
{dp.label || dp.name} {dp.value ?? '-'} {dp.unit ?? ''}
); }