'use client' import React, { useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { DSRType, DSRSource, DSRPriority, DSR_TYPE_INFO, DSRCreateRequest } from '@/lib/sdk/dsr/types' import { createSDKDSR } from '@/lib/sdk/dsr/api' // ============================================================================= // TYPES // ============================================================================= interface FormData { type: DSRType | '' requesterName: string requesterEmail: string requesterPhone: string requesterAddress: string source: DSRSource | '' sourceDetails: string requestText: string priority: DSRPriority customerId: string } // ============================================================================= // COMPONENTS // ============================================================================= function TypeSelector({ selectedType, onSelect }: { selectedType: DSRType | '' onSelect: (type: DSRType) => void }) { return (
{Object.entries(DSR_TYPE_INFO).map(([type, info]) => ( ))}
{selectedType && (
{DSR_TYPE_INFO[selectedType].label}

{DSR_TYPE_INFO[selectedType].description}

Standardfrist: {DSR_TYPE_INFO[selectedType].defaultDeadlineDays} Tage {DSR_TYPE_INFO[selectedType].maxExtensionMonths > 0 && ( <> | Verlaengerbar um {DSR_TYPE_INFO[selectedType].maxExtensionMonths} Monate )}
)}
) } function SourceSelector({ selectedSource, sourceDetails, onSourceChange, onDetailsChange }: { selectedSource: DSRSource | '' sourceDetails: string onSourceChange: (source: DSRSource) => void onDetailsChange: (details: string) => void }) { const sources: { value: DSRSource; label: string; icon: string }[] = [ { value: 'web_form', label: 'Webformular', icon: 'M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9' }, { value: 'email', label: 'E-Mail', icon: 'M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z' }, { value: 'letter', label: 'Brief', icon: 'M3 19v-8.93a2 2 0 01.89-1.664l7-4.666a2 2 0 012.22 0l7 4.666A2 2 0 0121 10.07V19M3 19a2 2 0 002 2h14a2 2 0 002-2M3 19l6.75-4.5M21 19l-6.75-4.5M3 10l6.75 4.5M21 10l-6.75 4.5' }, { value: 'phone', label: 'Telefon', icon: 'M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z' }, { value: 'in_person', label: 'Persoenlich', icon: 'M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z' }, { value: 'other', label: 'Sonstiges', icon: 'M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z' } ] return (
{sources.map(source => ( ))}
{selectedSource && ( onDetailsChange(e.target.value)} placeholder={ selectedSource === 'web_form' ? 'z.B. Kontaktformular auf website.de' : selectedSource === 'email' ? 'z.B. info@firma.de' : selectedSource === 'phone' ? 'z.B. Anruf am 22.01.2025' : 'Weitere Details zur Quelle' } className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500" /> )}
) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function NewDSRPage() { const router = useRouter() const [isSubmitting, setIsSubmitting] = useState(false) const [errors, setErrors] = useState>({}) const [formData, setFormData] = useState({ type: '', requesterName: '', requesterEmail: '', requesterPhone: '', requesterAddress: '', source: '', sourceDetails: '', requestText: '', priority: 'normal', customerId: '' }) const updateField = (field: K, value: FormData[K]) => { setFormData(prev => ({ ...prev, [field]: value })) // Clear error when field is updated if (errors[field]) { setErrors(prev => { const newErrors = { ...prev } delete newErrors[field] return newErrors }) } } const validate = (): boolean => { const newErrors: Record = {} if (!formData.type) { newErrors.type = 'Bitte waehlen Sie den Anfragetyp' } if (!formData.requesterName.trim()) { newErrors.requesterName = 'Name ist erforderlich' } if (!formData.requesterEmail.trim()) { newErrors.requesterEmail = 'E-Mail ist erforderlich' } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.requesterEmail)) { newErrors.requesterEmail = 'Bitte geben Sie eine gueltige E-Mail-Adresse ein' } if (!formData.source) { newErrors.source = 'Bitte waehlen Sie die Quelle der Anfrage' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!validate()) return setIsSubmitting(true) try { // Create DSR request const request: DSRCreateRequest = { type: formData.type as DSRType, requester: { name: formData.requesterName, email: formData.requesterEmail, phone: formData.requesterPhone || undefined, address: formData.requesterAddress || undefined, customerId: formData.customerId || undefined }, source: formData.source as DSRSource, sourceDetails: formData.sourceDetails || undefined, requestText: formData.requestText || undefined, priority: formData.priority } await createSDKDSR(request) // Redirect to DSR list router.push('/sdk/dsr') } catch (error) { console.error('Failed to create DSR:', error) setErrors({ submit: 'Fehler beim Erstellen der Anfrage. Bitte versuchen Sie es erneut.' }) } finally { setIsSubmitting(false) } } return (
{/* Header */}

Neue Anfrage erfassen

Erfassen Sie eine neue Betroffenenanfrage (Art. 15-21 DSGVO)

{/* Form */}
{/* Type Selection */}
updateField('type', type)} /> {errors.type && (

{errors.type}

)}
{/* Requester Information */}

Antragsteller

{/* Name */}
updateField('requesterName', e.target.value)} placeholder="Max Mustermann" className={` w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 ${errors.requesterName ? 'border-red-300' : 'border-gray-300'} `} /> {errors.requesterName && (

{errors.requesterName}

)}
{/* Email */}
updateField('requesterEmail', e.target.value)} placeholder="max.mustermann@example.de" className={` w-full px-4 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 ${errors.requesterEmail ? 'border-red-300' : 'border-gray-300'} `} /> {errors.requesterEmail && (

{errors.requesterEmail}

)}
{/* Phone */}
updateField('requesterPhone', e.target.value)} placeholder="+49 170 1234567" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
{/* Customer ID */}
updateField('customerId', e.target.value)} placeholder="Falls bekannt" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500" />
{/* Address */}