import { useCallback, useEffect, useState } from 'react' import { getJson } from '../api/postgrest' import type { ModeLogRecentRow } from '../types/ems' function modeBadgeClass(code: string): string { const c = code.toUpperCase() if (c === 'AUTO') return 'bg-emerald-500/15 text-emerald-300 ring-1 ring-emerald-500/35' if (c === 'SELF_SUSTAIN') return 'bg-cyan-500/15 text-cyan-300 ring-1 ring-cyan-500/35' if (c === 'CHARGE_CHEAP') return 'bg-violet-500/15 text-violet-200 ring-1 ring-violet-500/35' if (c === 'PRESERVE') return 'bg-amber-500/15 text-amber-200 ring-1 ring-amber-500/35' if (c === 'MANUAL') return 'bg-slate-600/50 text-slate-200 ring-1 ring-slate-500/40' return 'bg-slate-700/60 text-slate-200 ring-1 ring-slate-600/50' } function num(v: string | number | null | undefined): number { if (v == null) return NaN const n = typeof v === 'number' ? v : Number(v) return n } function formatDuration(sec: number): string { if (!Number.isFinite(sec) || sec < 0) return '—' const h = Math.floor(sec / 3600) const m = Math.floor((sec % 3600) / 60) const s = Math.floor(sec % 60) if (h > 0) return `${h} h ${m} min` if (m > 0) return `${m} min ${s > 0 ? `${s} s` : ''}`.trim() return `${s} s` } function fmtTime(iso: string): string { try { const d = new Date(iso) return d.toLocaleString('cs-CZ', { dateStyle: 'short', timeStyle: 'medium' }) } catch { return iso } } type Props = { siteId: number | null } export function ModeLog({ siteId }: Props) { const [rows, setRows] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const load = useCallback(async () => { if (siteId == null) { setRows([]) setLoading(false) return } setLoading(true) setError(null) try { const data = await getJson('/vw_mode_log_recent', { site_id: `eq.${siteId}`, order: 'activated_at.desc', limit: '20', }) setRows(Array.isArray(data) ? data : []) } catch (e) { setError(String(e)) setRows([]) } finally { setLoading(false) } }, [siteId]) useEffect(() => { void load() }, [load]) if (siteId == null) { return

Vyberte nebo načtěte lokalitu.

} if (loading) { return
} if (error) { return

Nelze načíst log: {error}

} return (
{rows.length === 0 ? ( ) : ( rows.map((r) => ( )) )}
Čas Režim Trvání Kdo Poznámka
Žádné záznamy za posledních 7 dní.
{fmtTime(r.activated_at)} {r.mode_code} {formatDuration(num(r.duration_sec))} {r.activated_by ?? '—'} {r.notes?.trim() ? r.notes : '—'}
) }