'use client' import React, { useEffect, useState, useCallback, use } from 'react' import { useRouter } from 'next/navigation' const LANGUAGES = [ { value: '', label: '— bitte waehlen —' }, { value: 'js', label: 'JavaScript / TypeScript' }, { value: 'python', label: 'Python' }, { value: 'go', label: 'Go' }, { value: 'rust', label: 'Rust' }, { value: 'java', label: 'Java / Kotlin' }, { value: 'csharp', label: 'C# / .NET' }, { value: 'cpp', label: 'C / C++' }, { value: 'swift', label: 'Swift' }, { value: 'mixed', label: 'Mehrere Sprachen' }, { value: 'other', label: 'Andere' }, ] interface CRAProject { id: string name: string description: string repo_url: string | null primary_language: string | null has_firmware: boolean connected_to_internet: boolean has_software_updates: boolean processes_personal_data: boolean is_critical_infra_supplier: boolean intended_use: string } export default function IntakePage({ params, }: { params: Promise<{ projectId: string }> }) { const { projectId } = use(params) const router = useRouter() const [loading, setLoading] = useState(true) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const [name, setName] = useState('') const [description, setDescription] = useState('') const [repoUrl, setRepoUrl] = useState('') const [primaryLanguage, setPrimaryLanguage] = useState('') const [hasFirmware, setHasFirmware] = useState(false) const [connectedInternet, setConnectedInternet] = useState(false) const [hasUpdates, setHasUpdates] = useState(false) const [processesPersonal, setProcessesPersonal] = useState(false) const [isCriticalInfra, setIsCriticalInfra] = useState(false) const [intendedUse, setIntendedUse] = useState('') const tenant = '00000000-0000-0000-0000-000000000001' const load = useCallback(async () => { try { const res = await fetch(`/api/sdk/v1/cra/projects/${projectId}`, { headers: { 'X-Tenant-ID': tenant }, }) if (!res.ok) throw new Error(await res.text()) const p: CRAProject = await res.json() setName(p.name) setDescription(p.description || '') setRepoUrl(p.repo_url || '') setPrimaryLanguage(p.primary_language || '') setHasFirmware(p.has_firmware) setConnectedInternet(p.connected_to_internet) setHasUpdates(p.has_software_updates) setProcessesPersonal(p.processes_personal_data) setIsCriticalInfra(p.is_critical_infra_supplier) setIntendedUse(p.intended_use || '') } catch (e) { setError(e instanceof Error ? e.message : 'Fehler beim Laden') } finally { setLoading(false) } }, [projectId]) useEffect(() => { load() }, [load]) const save = async () => { setSaving(true) setError('') try { const res = await fetch(`/api/sdk/v1/cra/projects/${projectId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', 'X-Tenant-ID': tenant }, body: JSON.stringify({ name, description, repo_url: repoUrl || null, primary_language: primaryLanguage || null, has_firmware: hasFirmware, connected_to_internet: connectedInternet, has_software_updates: hasUpdates, processes_personal_data: processesPersonal, is_critical_infra_supplier: isCriticalInfra, intended_use: intendedUse, status: 'scoped', }), }) if (!res.ok) throw new Error(await res.text()) router.push(`/sdk/cra/${projectId}/scope`) } catch (e) { setError(e instanceof Error ? e.message : 'Speichern fehlgeschlagen') } finally { setSaving(false) } } if (loading) return

Laedt...

return (
← Zurueck zum Projekt

Intake — Software-Profil

Schritt 1 von 3 — Beschreibe Software, Firmware und Connectivity. Daraus leiten wir die CRA-Klassifikation ab.

{error && (
{error}
)}
setName(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500" placeholder="z.B. SmartHome Gateway v3" />