import { useId, useMemo, useState } from 'react'; import { useI18n } from '../i18n'; import { authFileRequestStats, requestRateColor } from '../services/authFileRequests'; import './AuthFileRequestStatus.css'; export function AuthFileRequestStatus({ file, compact = false }: { file: Record; compact?: boolean }) { const { t, formatNumber } = useI18n(); const stats = useMemo(() => authFileRequestStats(file), [file]); const [active, setActive] = useState(null); const tooltipId = useId(); const rateText = (rate: number | null) => rate === null ? '—' : formatNumber(rate, { style: 'percent', maximumFractionDigits: 1, }); const countText = (count: number | null) => count === null ? '—' : formatNumber(count); const rateClass = stats.recentRate === null ? '' : stats.recentRate >= 0.9 ? 'success' : stats.recentRate >= 0.5 ? 'mixed' : 'failure'; const detail = active === null ? null : stats.buckets[active]; const latestRequest = [...stats.buckets].reverse().find((bucket) => bucket.rate !== null); const bucketLabel = (index: number) => { const bucket = stats.buckets[index]; const time = bucket.time || t('authFiles.requests.interval', { index: index + 1 }); return bucket.rate === null ? `${time} · ${t('authFiles.requests.empty')}` : `${time} · ${t('authFiles.requests.success', { count: formatNumber(bucket.success) })} · ${t('authFiles.requests.failure', { count: formatNumber(bucket.failure) })} · ${t('authFiles.requests.rate', { rate: rateText(bucket.rate) })}`; }; return (
{compact ?
{latestRequest?.time || '—'}
:
{t('authFiles.requests.title')} {t('authFiles.requests.success', { count: countText(stats.success) })} {t('authFiles.requests.failure', { count: countText(stats.failure) })} {stats.recentAvailable ? {t('authFiles.requests.window')} : null}
} {stats.recentAvailable ? (
setActive(null)}> {stats.buckets.map((bucket, index) => (
{detail && active !== null ? (
12 ? 'end' : ''}`} id={tooltipId} role="tooltip"> {detail.time || t('authFiles.requests.interval', { index: active + 1 })} {detail.rate === null ? {t('authFiles.requests.empty')} : <> {t('authFiles.requests.success', { count: formatNumber(detail.success) })} {t('authFiles.requests.failure', { count: formatNumber(detail.failure) })} {t('authFiles.requests.rate', { rate: rateText(detail.rate) })} }
) : null}
{!compact ? {rateText(stats.recentRate)} : null} {stats.recentRate === null ? {t('authFiles.requests.empty')} : null}
) : {t('authFiles.requests.unavailable')}}
); }