"use client"; import { useEffect, useState } from "react"; import type { NspdDumpMeta } from "@/types/nspd"; interface Props { dump: NspdDumpMeta | null | undefined; } export function NspdFreshnessBadge({ dump }: Props) { // Issue #234: countdown пока harvest идёт. Сбрасывается на ETA при каждом // новом triggered=true response (или ETA значении). const eta = dump?.harvest_eta_seconds ?? null; const [remaining, setRemaining] = useState(eta); useEffect(() => { setRemaining(eta); }, [eta]); useEffect(() => { if (remaining === null || remaining <= 0) return; const id = setInterval(() => { setRemaining((v) => (v === null || v <= 1 ? 0 : v - 1)); }, 1000); return () => clearInterval(id); }, [remaining]); if (!dump) { return ( НСПД: нет данных ); } if (dump.harvest_triggered && !dump.available) { const countdownLabel = remaining !== null && remaining > 0 ? `НСПД: загрузка ~${remaining}с` : "НСПД: загрузка…"; return ( {countdownLabel} ); } if (!dump.available) { return ( НСПД: нет дампа ); } const dateStr = dump.fetched_at_utc ? new Date(dump.fetched_at_utc).toLocaleDateString("ru-RU") : null; if (dump.stale) { return ( НСПД: устарело{dateStr ? ` (${dateStr})` : ""} ); } return ( НСПД: актуально{dateStr ? ` (${dateStr})` : ""} ); }