19 lines
1.6 KiB
TypeScript
19 lines
1.6 KiB
TypeScript
import { Alert, AlertDescription, AlertTitle } from "@/components/reui/alert"
|
|
import type { TrafficObservationMeta } from "@/lib/traffic-observations"
|
|
|
|
export function TrafficObservationStatus({ observations: o, unknown }: { observations?: TrafficObservationMeta; unknown: boolean }) {
|
|
const labels = { error: "Ошибка опроса трафика", pending: "Опрос трафика выполняется", stale: "Измерения трафика устарели",
|
|
disabled: "Опрос трафика отключён", unknown: "Скорость пока не измерена", current: "Скорость пока не измерена" }
|
|
const warning = unknown || !!o?.error || o?.currentState && o.currentState !== "current"
|
|
return <>
|
|
{warning && <Alert variant="warning" role="status" className="mb-3">
|
|
<AlertTitle>{o?.error && o.currentState === "current" ? "Часть измерений недоступна" : labels[o?.currentState ?? "unknown"]}</AlertTitle>
|
|
<AlertDescription>{o?.error || "История сохранена. Для текущей скорости нужны достоверные свежие измерения."}</AlertDescription>
|
|
</Alert>}
|
|
{o?.lastAttemptAt && <p aria-label="Попытка опроса трафика" className="text-xs text-muted-foreground mb-3">
|
|
Последняя попытка: <time dateTime={o.lastAttemptAt}>{new Date(o.lastAttemptAt).toLocaleString("ru-RU")}</time>
|
|
{o.lastSucceededAt && <> · успешный сбор: <time dateTime={o.lastSucceededAt}>{new Date(o.lastSucceededAt).toLocaleString("ru-RU")}</time></>}
|
|
</p>}
|
|
</>
|
|
}
|