"use client"; import { IconAlertTriangle } from "@tabler/icons-react"; import { Alert, AlertDescription } from "@kandev/ui/alert"; import { formatTimeDistance, useDateLocale } from "@/lib/i18n/date-locale"; import type { GitHubPRDiscoveryHealth } from "@/lib/types/github"; import { useTranslation } from "react-i18next"; const CATEGORY_LABEL_KEYS: Record, string> = { invalid_query: "github:prDiscoveryCategoryInvalidQuery", rate_limited: "github:prDiscoveryCategoryRateLimited", unavailable: "github:prDiscoveryCategoryUnavailable", }; function isDegraded(health?: GitHubPRDiscoveryHealth): health is GitHubPRDiscoveryHealth { return Boolean(health && health.state === "degraded" && health.failed_target_count > 0); } function relativeTime( value: string | undefined, locale: ReturnType, fallback: string, ) { return formatTimeDistance(value, locale) || fallback; } export function GitHubPRDiscoveryHealthWarning({ health }: { health?: GitHubPRDiscoveryHealth }) { const { t } = useTranslation(); const locale = useDateLocale(); if (!isDegraded(health)) return null; const category = health.category ? t(CATEGORY_LABEL_KEYS[health.category]) : t("github:prDiscoveryCategoryUnavailable"); const unknownTime = t("github:prDiscoveryUnknownTime"); return (

{t("github:prDiscoveryFailed")}

{t("github:prDiscoveryCategory", { category })}

{t("github:prDiscoveryLastFailure", { time: relativeTime(health.last_failure_at, locale, unknownTime), })}

{t("github:prDiscoveryAffectedTargets", { count: health.failed_target_count })}

{health.retry_at && (

{t("github:prDiscoveryRetryAt", { time: relativeTime(health.retry_at, locale, unknownTime), })}

)}
); } export function GitHubPRDiscoveryHealthDetails({ health }: { health?: GitHubPRDiscoveryHealth }) { return ; }