Files
breakpilot-lehrer/website/app/admin/alerts/page.tsx
Benjamin Admin 0b37c5e692 [split-required] Split website + studio-v2 monoliths (Phase 3 continued)
Website (14 monoliths split):
- compliance/page.tsx (1,519 → 9), docs/audit (1,262 → 20)
- quality (1,231 → 16), alerts (1,203 → 10), docs (1,202 → 11)
- i18n.ts (1,173 → 8 language files)
- unity-bridge (1,094 → 12), backlog (1,087 → 6)
- training (1,066 → 8), rag (1,063 → 8)
- Deleted index_original.ts (4,899 LOC dead backup)

Studio-v2 (5 monoliths split):
- meet/page.tsx (1,481 → 9), messages (1,166 → 9)
- AlertsB2BContext.tsx (1,165 → 5 modules)
- alerts-b2b/page.tsx (1,019 → 6), korrektur/archiv (1,001 → 6)

All existing imports preserved. Zero new TypeScript errors.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-24 17:52:36 +02:00

93 lines
3.1 KiB
TypeScript

'use client'
/**
* Alerts Monitoring Admin Page
*
* Google Alerts & Feed-Ueberwachung Dashboard
* Provides inbox management, topic configuration, rule builder, and relevance profiles
*/
import { useState } from 'react'
import AdminLayout from '@/components/admin/AdminLayout'
import SystemInfoSection from '@/components/admin/SystemInfoSection'
import type { TabId } from './_components/types'
import { useAlertsData } from './_components/useAlertsData'
import { alertsSystemConfig } from './_components/alertsSystemConfig'
import DashboardTab from './_components/DashboardTab'
import InboxTab from './_components/InboxTab'
import TopicsTab from './_components/TopicsTab'
import RulesTab from './_components/RulesTab'
import ProfileTab from './_components/ProfileTab'
import DocumentationTab from './_components/DocumentationTab'
export default function AlertsPage() {
const [activeTab, setActiveTab] = useState<TabId>('dashboard')
const {
stats,
alerts,
topics,
rules,
profile,
error,
inboxFilter,
setInboxFilter,
filteredAlerts,
} = useAlertsData()
const tabs: { id: TabId; label: string; badge?: number }[] = [
{ id: 'dashboard', label: 'Dashboard' },
{ id: 'inbox', label: 'Inbox', badge: stats?.new_alerts || 0 },
{ id: 'topics', label: 'Topics' },
{ id: 'rules', label: 'Regeln' },
{ id: 'profile', label: 'Profil' },
{ id: 'audit', label: 'Audit' },
{ id: 'documentation', label: 'Dokumentation' },
]
return (
<AdminLayout title="Alerts Monitoring" description="Google Alerts & Feed-Ueberwachung">
{/* Tab Navigation */}
<div className="border-b border-slate-200 mb-6">
<nav className="flex gap-4">
{tabs.map((tab) => (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={`pb-3 px-1 text-sm font-medium border-b-2 transition-colors flex items-center gap-2 ${
activeTab === tab.id
? 'border-primary-600 text-primary-600'
: 'border-transparent text-slate-500 hover:text-slate-700'
}`}
>
{tab.label}
{tab.badge !== undefined && tab.badge > 0 && (
<span className="px-2 py-0.5 rounded-full text-xs font-semibold bg-red-500 text-white">
{tab.badge}
</span>
)}
</button>
))}
</nav>
</div>
{activeTab === 'dashboard' && (
<DashboardTab stats={stats} topics={topics} alerts={alerts} error={error} />
)}
{activeTab === 'inbox' && (
<InboxTab inboxFilter={inboxFilter} setInboxFilter={setInboxFilter} filteredAlerts={filteredAlerts} />
)}
{activeTab === 'topics' && <TopicsTab topics={topics} />}
{activeTab === 'rules' && <RulesTab rules={rules} />}
{activeTab === 'profile' && <ProfileTab profile={profile} />}
{activeTab === 'audit' && <SystemInfoSection config={alertsSystemConfig} />}
{activeTab === 'documentation' && <DocumentationTab />}
</AdminLayout>
)
}