'use client' /** * Privacy Policy Generator Seite * * Generiert Datenschutzerklaerungen aus dem Datenpunktkatalog. */ import { useState, useEffect } from 'react' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { PrivacyPolicyPreview } from '@/components/sdk/einwilligungen' import { EinwilligungenProvider, useEinwilligungen, } from '@/lib/sdk/einwilligungen/context' import { PREDEFINED_DATA_POINTS, } from '@/lib/sdk/einwilligungen/catalog/loader' import { generatePrivacyPolicy, } from '@/lib/sdk/einwilligungen/generator/privacy-policy' import { CompanyInfo, SupportedLanguage, ExportFormat, GeneratedPrivacyPolicy, } from '@/lib/sdk/einwilligungen/types' import { Building2, Mail, Phone, Globe, User, Save, ArrowLeft, } from 'lucide-react' import Link from 'next/link' // ============================================================================= // COMPANY INFO FORM // ============================================================================= interface CompanyInfoFormProps { companyInfo: CompanyInfo | null onChange: (info: CompanyInfo) => void } function CompanyInfoForm({ companyInfo, onChange }: CompanyInfoFormProps) { const [formData, setFormData] = useState( companyInfo || { name: '', address: '', city: '', postalCode: '', country: 'Deutschland', email: '', phone: '', website: '', dpoName: '', dpoEmail: '', dpoPhone: '', registrationNumber: '', vatId: '', } ) const handleChange = (field: keyof CompanyInfo, value: string) => { const updated = { ...formData, [field]: value } setFormData(updated) onChange(updated) } return (

Unternehmensdaten

{/* Company Name */}
handleChange('name', e.target.value)} placeholder="Muster GmbH" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" required />
{/* Address */}
handleChange('address', e.target.value)} placeholder="Musterstrasse 123" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" required />
{/* Postal Code */}
handleChange('postalCode', e.target.value)} placeholder="12345" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" required />
{/* City */}
handleChange('city', e.target.value)} placeholder="Musterstadt" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" required />
{/* Country */}
handleChange('country', e.target.value)} placeholder="Deutschland" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{/* Email */}
handleChange('email', e.target.value)} placeholder="datenschutz@example.de" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" required />
{/* Phone */}
handleChange('phone', e.target.value)} placeholder="+49 123 456789" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{/* Website */}
handleChange('website', e.target.value)} placeholder="https://example.de" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{/* Registration Number */}
handleChange('registrationNumber', e.target.value)} placeholder="HRB 12345 Amtsgericht Musterstadt" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{/* VAT ID */}
handleChange('vatId', e.target.value)} placeholder="DE123456789" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
{/* DPO Section */}

Datenschutzbeauftragter (optional)

handleChange('dpoName', e.target.value)} placeholder="Max Mustermann" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
handleChange('dpoEmail', e.target.value)} placeholder="dsb@example.de" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
handleChange('dpoPhone', e.target.value)} placeholder="+49 123 456780" className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" />
) } // ============================================================================= // PRIVACY POLICY CONTENT // ============================================================================= function PrivacyPolicyContent() { const { state } = useSDK() const { allDataPoints, state: einwilligungenState, } = useEinwilligungen() const [companyInfo, setCompanyInfo] = useState(null) const [language, setLanguage] = useState('de') const [format, setFormat] = useState('HTML') const [policy, setPolicy] = useState(null) const [isGenerating, setIsGenerating] = useState(false) const handleGenerate = async () => { if (!companyInfo || !companyInfo.name || !companyInfo.email || !companyInfo.address) { alert('Bitte fuellen Sie zuerst die Pflichtfelder (Firmenname, Adresse, E-Mail) aus.') return } setIsGenerating(true) try { // Generate locally (could also call API) const generatedPolicy = generatePrivacyPolicy( state.tenantId || 'demo', allDataPoints, companyInfo, language, format ) setPolicy(generatedPolicy) } catch (error) { console.error('Error generating policy:', error) alert('Fehler beim Generieren der Datenschutzerklaerung') } finally { setIsGenerating(false) } } const handleDownload = (downloadFormat: ExportFormat) => { if (!policy?.content) return const blob = new Blob([policy.content], { type: downloadFormat === 'HTML' ? 'text/html' : 'text/markdown', }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = `datenschutzerklaerung-${language}.${downloadFormat === 'HTML' ? 'html' : 'md'}` document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } return (
{/* Back Link */} Zurueck zum Katalog {/* Header */}

Datenschutzerklaerung Generator

Generieren Sie eine DSGVO-konforme Datenschutzerklaerung aus Ihrem Datenpunktkatalog.

{/* Stats */}
Datenpunkte
{allDataPoints.length}
Kategorien
8
Abschnitte
9
Sprachen
2
{/* Two Column Layout */}
{/* Left: Company Info */}
{/* Right: Preview */}
) } // ============================================================================= // MAIN PAGE // ============================================================================= export default function PrivacyPolicyPage() { return ( ) }