'use client' import { useState, useEffect } from 'react' import { useRouter } from 'next/navigation' import { useTheme } from '@/lib/ThemeContext' import { useLanguage } from '@/lib/LanguageContext' import { useAlertsB2B, B2BHit, ImportanceLabel, getImportanceLabelColor, getPackageIcon, getPackageLabel } from '@/lib/AlertsB2BContext' import { Sidebar } from '@/components/Sidebar' import { B2BMigrationWizard } from '@/components/B2BMigrationWizard' import { TipBox } from '@/components/InfoBox' import { Footer } from '@/components/Footer' import { LanguageDropdown } from '@/components/LanguageDropdown' import { ThemeToggle } from '@/components/ThemeToggle' import { HitCard } from './_components/HitCard' import { HitDetailModal } from './_components/HitDetailModal' import { EmailImportModal } from './_components/EmailImportModal' import { DigestView } from './_components/DigestView' export default function AlertsB2BPage() { const router = useRouter() const { isDark } = useTheme() const { t } = useLanguage() const { tenant, settings, updateSettings, hits, topics, unreadCount, relevantCount, needsReviewCount, markAsRead, markAllAsRead, submitFeedback, processEmailContent, getDigest } = useAlertsB2B() const [selectedHit, setSelectedHit] = useState(null) const [showWizard, setShowWizard] = useState(false) const [showImportModal, setShowImportModal] = useState(false) const [viewMode, setViewMode] = useState<'inbox' | 'digest'>('inbox') const [filterDecision, setFilterDecision] = useState('all') const [filterImportance, setFilterImportance] = useState('all') const [importSuccess, setImportSuccess] = useState(null) useEffect(() => { if (!settings.wizardCompleted) setShowWizard(true) }, [settings.wizardCompleted]) const filteredHits = hits.filter(hit => { if (filterDecision === 'unread') return !hit.isRead if (filterDecision !== 'all' && hit.decisionLabel !== filterDecision) return false if (filterImportance !== 'all' && hit.importanceLabel !== filterImportance) return false return true }).sort((a, b) => b.importanceScore - a.importanceScore) const handleHitClick = (hit: B2BHit) => { setSelectedHit(hit) if (!hit.isRead) markAsRead(hit.id) } const handleFeedback = (hitId: string, feedback: 'relevant' | 'irrelevant') => { submitFeedback(hitId, feedback) } if (showWizard) { return ( { updateSettings({ wizardCompleted: true, migrationCompleted: true }); setShowWizard(false) }} onSkip={() => { updateSettings({ wizardCompleted: true }); setShowWizard(false) }} onCancel={() => { router.push('/') }} /> ) } return (
{/* Animated Background Blobs */}
{/* Header */}

🏢 B2B Alerts {unreadCount > 0 && ( {unreadCount} neu )}

{tenant.companyName} - Procurement Alerts

{(['inbox', 'digest'] as const).map(mode => ( ))}
{/* Main Panel (2/3) */}
{viewMode === 'inbox' ? ( <> {/* Decision Filter */}
{['all', 'unread', 'relevant', 'needs_review', 'irrelevant'].map((filter) => ( ))}
{unreadCount > 0 && ( )}
{/* Importance Filter */}
Wichtigkeit: {['all', 'KRITISCH', 'DRINGEND', 'WICHTIG', 'PRUEFEN', 'INFO'].map((filter) => ( ))}
{/* Hits List */} {filteredHits.length === 0 ? (
📭

Keine Hits gefunden

) : (
{filteredHits.map(hit => handleHitClick(hit)} />)}
)} ) : ( )}
{/* Right Sidebar (1/3) */}
{/* Stats */}

📊 Statistik

{[ { label: 'Gesamt Hits', value: hits.length, color: isDark ? 'text-white' : 'text-slate-900' }, { label: 'Ungelesen', value: unreadCount, color: 'text-purple-500' }, { label: 'Relevant', value: relevantCount, color: 'text-green-500' }, { label: 'Pruefung noetig', value: needsReviewCount, color: 'text-amber-500' }, ].map(({ label, value, color }) => (
{label} {value}
))}
{/* Topics */}

🎯 Topics

{topics.length === 0 ? (

Keine Topics konfiguriert.

) : (
{topics.map(topic => (
{getPackageIcon(topic.package)}

{topic.name}

{getPackageLabel(topic.package)}

))}
)}
{/* Settings Summary */}

⚙️ Einstellungen

Benachrichtigung {settings.notificationCadence}
Noise-Modus {settings.noiseMode}
Max. Digest {settings.maxDigestItems} Items

Im STRICT-Modus werden nur ~10% der Hits als relevant markiert. Der Rest wird automatisch gefiltert.

{selectedHit && setSelectedHit(null)} onFeedback={(feedback) => handleFeedback(selectedHit.id, feedback)} />} {showImportModal && ( setShowImportModal(false)} onImport={(content, subject) => { const newHit = processEmailContent(content, subject) setImportSuccess(newHit) setTimeout(() => setImportSuccess(null), 5000) }} /> )} {importSuccess && (

E-Mail erfolgreich importiert!

{importSuccess.title.slice(0, 60)}...

{importSuccess.decisionLabel === 'relevant' ? 'Relevant' : importSuccess.decisionLabel === 'needs_review' ? 'Pruefung' : 'Info'} Score: {importSuccess.importanceScore}
)}
) }