import { useState } from 'react'; import { copy } from './copy'; import { plural, presentComponent, presentReason } from './presentation'; import { formatDateTime } from './locale'; import { backupPresentation, refreshSystemStatus, systemStateLabel as label, useSystemStatus } from './systemStatus'; function Badge({ state }: { state: string }) { const ready = state === 'healthy'; return {label(state)}; } function age(seconds?: number): string { if (seconds == null || !Number.isFinite(seconds)) return copy.systemStatus.notAvailable; if (seconds < 60) return `${Math.max(0, Math.round(seconds))} ${copy.systemStatus.seconds}`; if (seconds < 3600) return `${Math.round(seconds / 60)} ${copy.systemStatus.minutes}`; if (seconds < 86400) { const hours = Math.round(seconds / 3600); return `${hours} ${plural(hours, copy.systemStatus.hourAgo, copy.systemStatus.hoursAgo)}`; } const days = Math.round(seconds / 86400); return `${days} ${plural(days, copy.systemStatus.dayAgo, copy.systemStatus.daysAgo)}`; } export function SystemStatusPage() { const { state, status } = useSystemStatus(); const [backupAction, setBackupAction] = useState<'idle' | 'creating' | 'created' | 'error'>('idle'); if (state === 'loading') return
; if (state === 'unauthorized') return

{copy.systemStatus.unauthorized}

{copy.systemStatus.unauthorizedDetail}

; if (state === 'forbidden') return

{copy.systemStatus.forbidden}

{copy.systemStatus.forbiddenDetail}

; if (state === 'error' || !status) return

{copy.systemStatus.errorTitle}

{copy.systemStatus.errorDetail}

; const release = status.release; const backup = backupPresentation(status.backup); const createBackup = async () => { setBackupAction('creating'); try { const response = await fetch('/api/v1/system/backups', { method: 'POST' }); if (!response.ok) throw new Error('backup create failed'); setBackupAction('created'); refreshSystemStatus(); } catch { setBackupAction('error'); } }; return <>

{copy.systemStatus.eyebrow}

{copy.systemStatus.title}

{copy.systemStatus.intro}

{copy.systemStatus.current}

{label(status.overallState)}

{copy.systemStatus.version}: {release?.version || status.version} · {copy.systemStatus.commit}: {release?.commit || copy.systemStatus.notAvailable} · {copy.systemStatus.migration}: {release?.migrationVersion || copy.systemStatus.notAvailable}

{copy.systemStatus.built}: {release?.builtAt ? formatDateTime(release.builtAt) : copy.systemStatus.notAvailable} · {copy.systemStatus.generated}: {formatDateTime(status.generatedAt)}

{copy.systemStatus.components}

{copy.systemStatus.componentTitle}

{copy.systemStatus.backup}

{presentReason(backup.reason)} · {age(backup.ageSeconds)}{backup.verifiedAt ? ` · ${copy.systemStatus.verified}: ${formatDateTime(backup.verifiedAt)}` : ''}

{copy.systemStatus.backupFreshness}

{backupAction === 'created' &&

{copy.systemStatus.backupCreated}

}{backupAction === 'error' &&

{copy.systemStatus.backupCreateFailed}

}

{copy.systemStatus.sourceLag}

{status.sourceLag.length} {plural(status.sourceLag.length, copy.systemStatus.source, copy.systemStatus.sources)}

{status.sourceLag.length === 0 ?

{copy.systemStatus.noSources}

: }
; }