'use client' import React, { useState, useEffect, Suspense } from 'react' import { useRouter, useSearchParams } from 'next/navigation' import { AssessmentResultCard } from '@/components/sdk/use-case-assessment/AssessmentResultCard' // ============================================================================= // WIZARD STEPS CONFIG // ============================================================================= const WIZARD_STEPS = [ { id: 1, title: 'Grundlegendes', description: 'Titel und Beschreibung' }, { id: 2, title: 'Datenkategorien', description: 'Welche Daten werden verarbeitet?' }, { id: 3, title: 'Verarbeitungszweck', description: 'Rechtsgrundlage und Zweck' }, { id: 4, title: 'Automatisierung', description: 'Grad der Automatisierung' }, { id: 5, title: 'Hosting & Modell', description: 'Technische Details' }, { id: 6, title: 'Datentransfer', description: 'Internationaler Datentransfer' }, { id: 7, title: 'Datenhaltung', description: 'Aufbewahrung und Speicherung' }, { id: 8, title: 'Vertraege', description: 'Compliance und Vereinbarungen' }, ] const DOMAINS = [ { value: 'healthcare', label: 'Gesundheit' }, { value: 'finance', label: 'Finanzen' }, { value: 'education', label: 'Bildung' }, { value: 'retail', label: 'Handel' }, { value: 'it_services', label: 'IT-Dienstleistungen' }, { value: 'consulting', label: 'Beratung' }, { value: 'manufacturing', label: 'Produktion' }, { value: 'hr', label: 'Personalwesen' }, { value: 'marketing', label: 'Marketing' }, { value: 'legal', label: 'Recht' }, { value: 'public', label: 'Oeffentlicher Sektor' }, { value: 'general', label: 'Allgemein' }, ] // ============================================================================= // MAIN COMPONENT // ============================================================================= function NewUseCasePageInner() { const router = useRouter() const searchParams = useSearchParams() const editId = searchParams.get('edit') const isEditMode = !!editId const [currentStep, setCurrentStep] = useState(1) const [isSubmitting, setIsSubmitting] = useState(false) const [editLoading, setEditLoading] = useState(false) const [result, setResult] = useState(null) const [error, setError] = useState(null) // Form state const [form, setForm] = useState({ title: '', use_case_text: '', domain: 'general', // Data Types personal_data: false, special_categories: false, minors_data: false, health_data: false, biometric_data: false, financial_data: false, // Purpose purpose_profiling: false, purpose_automated_decision: false, purpose_marketing: false, purpose_analytics: false, purpose_service_delivery: false, // Automation automation: 'assistive' as 'assistive' | 'semi_automated' | 'fully_automated', // Hosting hosting_provider: 'self_hosted', hosting_region: 'eu', // Model Usage model_rag: false, model_finetune: false, model_training: false, model_inference: true, // Legal Basis (Step 3) legal_basis: 'consent' as 'consent' | 'contract' | 'legitimate_interest' | 'legal_obligation' | 'vital_interest' | 'public_interest', // Data Transfer (Step 6) international_transfer: false, transfer_countries: [] as string[], transfer_mechanism: 'none' as 'none' | 'scc' | 'bcr' | 'adequacy' | 'derogation', // Retention (Step 7) retention_days: 90, retention_purpose: '', // Contracts (Step 8) has_dpa: false, has_aia_documentation: false, has_risk_assessment: false, subprocessors: '', }) const updateForm = (updates: Partial) => { setForm(prev => ({ ...prev, ...updates })) } // Pre-fill form when in edit mode useEffect(() => { if (!editId) return setEditLoading(true) fetch(`/api/sdk/v1/ucca/assessments/${editId}`) .then(r => r.json()) .then(data => { const intake = data.intake || {} setForm({ title: data.title || '', use_case_text: intake.use_case_text || '', domain: data.domain || 'general', personal_data: intake.data_types?.personal_data || false, special_categories: intake.data_types?.article_9_data || false, minors_data: intake.data_types?.minor_data || false, health_data: intake.data_types?.health_data || false, biometric_data: intake.data_types?.biometric_data || false, financial_data: intake.data_types?.financial_data || false, purpose_profiling: intake.purpose?.profiling || false, purpose_automated_decision: intake.purpose?.automated_decision || intake.purpose?.decision_making || false, purpose_marketing: intake.purpose?.marketing || false, purpose_analytics: intake.purpose?.analytics || false, purpose_service_delivery: intake.purpose?.service_delivery || intake.purpose?.customer_support || false, automation: intake.automation || 'assistive', hosting_provider: intake.hosting?.provider || 'self_hosted', hosting_region: intake.hosting?.region || 'eu', model_rag: intake.model_usage?.rag || false, model_finetune: intake.model_usage?.finetune || false, model_training: intake.model_usage?.training || false, model_inference: intake.model_usage?.inference ?? true, legal_basis: intake.legal_basis || 'consent', international_transfer: intake.international_transfer?.enabled || false, transfer_countries: intake.international_transfer?.countries || [], transfer_mechanism: intake.international_transfer?.mechanism || 'none', retention_days: intake.retention?.days || 90, retention_purpose: intake.retention?.purpose || '', has_dpa: intake.contracts?.has_dpa || false, has_aia_documentation: intake.contracts?.has_aia_documentation || false, has_risk_assessment: intake.contracts?.has_risk_assessment || false, subprocessors: intake.contracts?.subprocessors || '', }) }) .catch(() => {}) .finally(() => setEditLoading(false)) }, [editId]) const handleSubmit = async () => { setIsSubmitting(true) setError(null) try { const intake = { title: form.title, use_case_text: form.use_case_text, domain: form.domain, data_types: { personal_data: form.personal_data, special_categories: form.special_categories, minors_data: form.minors_data, health_data: form.health_data, biometric_data: form.biometric_data, financial_data: form.financial_data, }, purpose: { profiling: form.purpose_profiling, automated_decision: form.purpose_automated_decision, marketing: form.purpose_marketing, analytics: form.purpose_analytics, service_delivery: form.purpose_service_delivery, }, automation: form.automation, hosting: { provider: form.hosting_provider, region: form.hosting_region, }, model_usage: { rag: form.model_rag, finetune: form.model_finetune, training: form.model_training, inference: form.model_inference, }, legal_basis: form.legal_basis, international_transfer: { enabled: form.international_transfer, countries: form.transfer_countries, mechanism: form.transfer_mechanism, }, retention: { days: form.retention_days, purpose: form.retention_purpose, }, contracts: { has_dpa: form.has_dpa, has_aia_documentation: form.has_aia_documentation, has_risk_assessment: form.has_risk_assessment, subprocessors: form.subprocessors, }, store_raw_text: true, } const url = isEditMode ? `/api/sdk/v1/ucca/assessments/${editId}` : '/api/sdk/v1/ucca/assess' const method = isEditMode ? 'PUT' : 'POST' const response = await fetch(url, { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(intake), }) if (!response.ok) { const errData = await response.json().catch(() => null) throw new Error(errData?.error || `HTTP ${response.status}`) } if (isEditMode) { router.push(`/sdk/use-cases/${editId}`) return } const data = await response.json() setResult(data) } catch (err) { setError(err instanceof Error ? err.message : 'Fehler bei der Bewertung') } finally { setIsSubmitting(false) } } // If we have a result, show it if (result) { const r = result as { assessment?: { id: string }; result?: Record } return (

Assessment Ergebnis

{r.assessment?.id && ( )}
{r.result && ( [0]['result']} /> )}
) } return (
{/* Header */}

{isEditMode ? 'Assessment bearbeiten' : 'Neues Use Case Assessment'}

{isEditMode ? 'Angaben anpassen und Assessment neu bewerten' : 'Beschreiben Sie Ihren KI-Anwendungsfall Schritt fuer Schritt'}

{/* Edit loading indicator */} {editLoading && (
Lade Assessment-Daten...
)} {/* Step Indicator */}
{WIZARD_STEPS.map((step, idx) => ( {idx < WIZARD_STEPS.length - 1 &&
} ))}
{/* Error */} {error && (
{error}
)} {/* Step Content */}
{/* Step 1: Grundlegendes */} {currentStep === 1 && (

Grundlegende Informationen

updateForm({ title: e.target.value })} placeholder="z.B. Chatbot fuer Kundenservice" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" />