'use client' import React, { useEffect, useState, useCallback, use } from 'react' interface MonitoringData { project_id: string deadlines: { date: string; label: string }[] summary: { active_vulns: number critical_vulns: number high_vulns: number breached_24h_reporting: number breached_72h_reporting: number sbom_versions: number configured_checks: number } post_market_checklist: { item: string; done: boolean; href_suffix: string }[] } export default function MonitoringPage({ params, }: { params: Promise<{ projectId: string }> }) { const { projectId } = use(params) const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const load = useCallback(async () => { try { const res = await fetch(`/api/sdk/v1/cra/projects/${projectId}/monitoring`, { headers: { 'X-Tenant-ID': '00000000-0000-0000-0000-000000000001' }, }) if (!res.ok) throw new Error(await res.text()) setData(await res.json()) } catch (e) { setError(e instanceof Error ? e.message : 'Fehler beim Laden') } finally { setLoading(false) } }, [projectId]) useEffect(() => { load() }, [load]) if (loading) return

Laedt...

if (error) return

{error}

if (!data) return null const completeness = data.post_market_checklist.filter(c => c.done).length const totalChecks = data.post_market_checklist.length return (
← Zurueck zum Projekt

Post-Market Monitoring

CRA-Stichtage + Vuln-Reporting-Compliance + Post-Market-Pflichten.

{/* CRA-Stichtage */}

CRA-Stichtage

{data.deadlines.map(d => { const target = new Date(d.date).getTime() const days = Math.round((target - Date.now()) / 86400000) const isPast = days < 0 const isSoon = days >= 0 && days < 90 const styles = isPast ? 'bg-gray-100 border-gray-200' : isSoon ? 'bg-red-50 border-red-200' : days < 365 ? 'bg-orange-50 border-orange-200' : 'bg-blue-50 border-blue-200' return (
{d.date}
{d.label}
{isPast ? `vor ${-days} Tagen` : `noch ${days} Tage`}
) })}
{/* Vuln-Reporting Compliance Banner */} {(data.summary.breached_24h_reporting > 0 || data.summary.breached_72h_reporting > 0) && (

⚠ CRA-Pflichten verletzt

{data.summary.breached_24h_reporting > 0 && (

{data.summary.breached_24h_reporting} Schwachstelle(n) ohne 24h-Fruehwarnung an ENISA — Art. 14(2)(a) CRA.

)} {data.summary.breached_72h_reporting > 0 && (

{data.summary.breached_72h_reporting} Schwachstelle(n) ohne 72h-Detailbericht — Art. 14(2)(b) CRA.

)} Zu den Schwachstellen →
)} {/* Summary Cards */}
0 ? 'green' : 'gray'} /> 0 ? 'green' : 'gray'} />
{/* Post-Market Checklist */}

Post-Market-Pflichten

    {data.post_market_checklist.map((c, i) => (
  • {c.done ? '✓' : '○'} {c.item} {!c.done && ( Erledigen → )}
  • ))}
Hinweis: Diese Seite aggregiert CRA-Pflichten aus SBOM, Checks und Vulnerability-Tracker. Die Reporting-Pflichten 24h/72h gelten ab CRA Art. 14(2) — verletzte Fristen erscheinen als rotes Banner.
) } function SummaryCard({ label, value, subtitle, color }: { label: string; value: number | string; subtitle: string; color: 'blue' | 'red' | 'green' | 'orange' | 'gray' }) { const bg = { blue: 'bg-blue-50 border-blue-200 text-blue-700', red: 'bg-red-50 border-red-200 text-red-700', green: 'bg-green-50 border-green-200 text-green-700', orange: 'bg-orange-50 border-orange-200 text-orange-700', gray: 'bg-gray-50 border-gray-200 text-gray-600', }[color] return (

{label}

{value}

{subtitle}

) }