import { Link } from "react-router-dom"; import type { ApiSettings } from "../../types"; import Button from "../../components/Button"; import PageTitle from "../../components/PageTitle"; import Card from "../../components/Card"; import StatusBadge from "../../components/StatusBadge"; import { useCampaignWorkspaceData } from "./hooks/useCampaignWorkspaceData"; import { asArray, asRecord, formatDateTime, stringifyPreview, summaryValue } from "./utils/campaignView"; export default function ReviewDataPage({ settings, campaignId }: { settings: ApiSettings; campaignId: string }) { const { data, loading, error, reload } = useCampaignWorkspaceData(settings, campaignId, { includeSummary: true }); const version = data.currentVersion; const issues = collectIssues(data.summary?.issues); return (
Review
{error &&
{error}
}
{!version?.validation_summary &&

No validation summary is stored yet.

}
{!version?.build_summary &&

No build summary is stored yet.

}
Grouped issue display will be expanded in the next review pass.}> {issues.length === 0 &&

No stored issues were returned for this campaign summary.

} {issues.length > 0 && (
{issues.map((issue, index) => ( ))}
Severity Section Message
{String(issue.section || issue.field || "—")} {String(issue.message || issue.code || stringifyPreview(issue, 180))}
)}
); } function SummaryTile({ label, value }: { label: string; value: string | number }) { return (
{label} {value}
); } function collectIssues(raw: unknown): Record[] { if (Array.isArray(raw)) return raw.map(asRecord); if (!raw || typeof raw !== "object") return []; const record = raw as Record; const direct = asArray(record.items ?? record.issues ?? record.results); if (direct.length) return direct.map(asRecord); return Object.entries(record).flatMap(([section, value]) => asArray(value).map((item) => ({ section, ...asRecord(item) }))); }