'use client' import React, { useState } from 'react' import { ChecklistView } from './ChecklistView' interface DocEntry { id: string type: string label: string url: string } const DOC_TYPES = [ { id: 'dse', label: 'DSI (Datenschutzinformation)' }, { id: 'agb', label: 'AGB / Nutzungsbedingungen' }, { id: 'impressum', label: 'Impressum' }, { id: 'cookie', label: 'Cookie-Richtlinie' }, { id: 'widerruf', label: 'Widerrufsbelehrung' }, { id: 'other', label: 'Sonstiges' }, ] function newEntry(): DocEntry { return { id: crypto.randomUUID().slice(0, 8), type: 'dse', label: '', url: '' } } export function DocCheckTab() { const [entries, setEntries] = useState([newEntry()]) const [checkCookieBanner, setCheckCookieBanner] = useState(false) const [loading, setLoading] = useState(false) const [progress, setProgress] = useState('') const [results, setResults] = useState(null) const [error, setError] = useState(null) const updateEntry = (id: string, field: keyof DocEntry, value: string) => { setEntries(prev => prev.map(e => e.id === id ? { ...e, [field]: value } : e)) } const removeEntry = (id: string) => { setEntries(prev => prev.filter(e => e.id !== id)) } const addEntry = () => { setEntries(prev => [...prev, newEntry()]) } // Auto-detect label from URL const autoLabel = (entry: DocEntry) => { if (entry.label) return try { const path = new URL(entry.url).pathname const last = path.split('/').filter(Boolean).pop() || '' const label = last.replace(/-\d+$/, '').replace(/-/g, ' ') .replace(/\b\w/g, c => c.toUpperCase()) if (label.length > 3) { updateEntry(entry.id, 'label', label) } } catch { /* invalid URL */ } } const handleSubmit = async () => { const validEntries = entries.filter(e => e.url.trim()) if (validEntries.length === 0) return setLoading(true) setError(null) setResults(null) setProgress('Pruefung wird gestartet...') try { const startRes = await fetch('/api/sdk/v1/agent/doc-check', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ entries: validEntries.map(e => ({ doc_type: e.type, label: e.label || e.url.split('/').pop() || 'Dokument', url: e.url.trim(), })), check_cookie_banner: checkCookieBanner, }), }) if (!startRes.ok) throw new Error(`Pruefung konnte nicht gestartet werden: ${startRes.status}`) const { check_id } = await startRes.json() if (!check_id) throw new Error('Keine Check-ID erhalten') // Poll for results let attempts = 0 while (attempts < 120) { await new Promise(r => setTimeout(r, 3000)) const pollRes = await fetch(`/api/sdk/v1/agent/doc-check?check_id=${check_id}`) if (!pollRes.ok) { attempts++; continue } const pollData = await pollRes.json() if (pollData.progress) setProgress(pollData.progress) if (pollData.status === 'completed' && pollData.result) { setResults(pollData.result) setProgress('') break } if (pollData.status === 'failed') { throw new Error(pollData.error || 'Pruefung fehlgeschlagen') } attempts++ } } catch (e) { setError(e instanceof Error ? e.message : 'Unbekannter Fehler') setProgress('') } finally { setLoading(false) } } return (
{/* URL Entries */}
{entries.map((entry, i) => (
updateEntry(entry.id, 'label', e.target.value)} placeholder="Bezeichnung (optional)" className="w-40 px-3 py-2.5 border border-gray-300 rounded-lg text-sm shrink-0" /> updateEntry(entry.id, 'url', e.target.value)} onBlur={() => autoLabel(entry)} placeholder="https://example.com/datenschutz" className="flex-1 px-3 py-2.5 border border-gray-300 rounded-lg text-sm" /> {entries.length > 1 && ( )}
))}
{/* Add URL + Options */}
{/* Submit */} {/* Progress */} {progress && (
{progress}
)} {/* Error */} {error && (
{error}
)} {/* Results */} {results && results.results && (
{/* Cookie Banner Result */} {results.cookie_banner_result && (

Cookie-Banner

{results.cookie_banner_result.banner_detected ? `Banner erkannt: ${results.cookie_banner_result.banner_provider || 'unbekannt'}` : 'Kein Banner erkannt'}
{results.cookie_banner_result.banner_checks?.violations?.length > 0 && (
{results.cookie_banner_result.banner_checks.violations.map((v: any, i: number) => (
!! {v.text}
))}
)}
)} {/* Email Status */} {results.email_status && (
E-Mail: {results.email_status === 'sent' ? 'Gesendet' : results.email_status}
)}
)}
) }