import { useMemo, useState } from 'react'; import type { PreflightIssue, PreflightResult, PreflightSeverity } from '../lib/engine.ts'; import styles from './PreflightPanel.module.css'; interface Props { result: PreflightResult; onIssueHover: (issue: PreflightIssue | null) => void; onIssueSelect: (issue: PreflightIssue) => void; } const SEVERITIES: readonly PreflightSeverity[] = ['error', 'warning', 'info']; export default function PreflightPanel({ result, onIssueHover, onIssueSelect }: Props) { const [showInfo, setShowInfo] = useState(true); const groups = useMemo( () => SEVERITIES.flatMap((severity) => { if (severity === 'info' && !showInfo) return []; const issues = result.issues.filter((issue) => issue.severity === severity); const byCode = new Map(); for (const issue of issues) { const entries = byCode.get(issue.code); if (entries) entries.push(issue); else byCode.set(issue.code, [issue]); } return issues.length ? [{ severity, byCode }] : []; }), [result.issues, showInfo], ); if (result.issues.length === 0) return null; return (
preflight · {result.summary.total} finding{result.summary.total === 1 ? '' : 's'} {result.summary.info > 0 && ( )}
{groups.map(({ severity, byCode }) => (
{severity} · {result.summary[severity]}
{[...byCode].map(([code, issues]) => (
{code} {issues.length > 1 ? ` ×${issues.length}` : ''}
{issues.map((issue, index) => ( ))}
))}
))}
); }