"use client"; import { useState } from "react"; import type { GateVerdict, GateVerdictLabel } from "@/types/site-finder"; import { SectionLabel } from "@/components/ui/SectionLabel"; interface GateVerdictBannerProps { verdict: GateVerdict | null | undefined; } interface VerdictColor { bg: string; border: string; icon: string; iconBg: string; } const COLOR_BY_LABEL: Record = { Можно: { bg: "#ecfdf5", border: "#34d399", icon: "✅", iconBg: "#10b981" }, Нельзя: { bg: "#fef2f2", border: "#f87171", icon: "🚫", iconBg: "#ef4444" }, "С ограничениями": { bg: "#fffbeb", border: "#fbbf24", icon: "⚠️", iconBg: "#f59e0b", }, "Нужна проверка": { bg: "#f9fafb", border: "#9ca3af", icon: "❓", iconBg: "#6b7280", }, }; const SOURCE_LABEL: Record = { nspd_dump: "данные NSPD актуальны", nspd_dump_partial: "данные NSPD устарели (>180 дней)", no_data: "данные NSPD не подгружены", }; function blockerCountLabel(n: number): string { if (n === 1) return "1 блокер"; if (n >= 2 && n <= 4) return `${n} блокера`; return `${n} блокеров`; } function warningCountLabel(n: number): string { if (n === 1) return "1 предупреждение"; if (n >= 2 && n <= 4) return `${n} предупреждения`; return `${n} предупреждений`; } export function GateVerdictBanner({ verdict }: GateVerdictBannerProps) { const [expanded, setExpanded] = useState(false); if (!verdict) return null; const color = COLOR_BY_LABEL[verdict.verdict_label]; const hasDetails = verdict.blockers.length > 0 || verdict.warnings.length > 0; const sourceHint = verdict.source === "nspd_dump_partial" ? "⏱ устарели" : verdict.source === "no_data" ? "❓ нет данных" : "🟢 свежие"; const summaryParts: string[] = []; if (verdict.blockers.length > 0) summaryParts.push(blockerCountLabel(verdict.blockers.length)); if (verdict.warnings.length > 0) summaryParts.push(warningCountLabel(verdict.warnings.length)); const summaryText = summaryParts.length > 0 ? summaryParts.join(" · ") : "Без замечаний"; return (
{/* Header row */}
{color.icon}
МКД: {verdict.verdict_label}
{summaryText} {" · "} {sourceHint}
{hasDetails && ( )}
{/* Expanded details */} {expanded && (
{verdict.blockers.length > 0 && (
🚫 Блокеры
    {verdict.blockers.map((b) => (
  • {b.code}: {b.detail}
  • ))}
)} {verdict.warnings.length > 0 && (
⚠️ Предупреждения
    {verdict.warnings.map((w) => (
  • {w.code}: {w.detail}
  • ))}
)} {verdict.checks_performed.length > 0 && (
Проверки: {verdict.checks_performed.join(" · ")}
)}
)}
); }