'use client' /** * Unified Inbox Mail Admin Page * * Admin interface for managing email accounts, viewing system status, * and configuring AI analysis settings. * * See: docs/klausur-modul/UNIFIED-INBOX-SPECIFICATION.md */ import { useState, useEffect, useCallback } from 'react' import AdminLayout from '@/components/admin/AdminLayout' import type { MailStats, SyncStatus, EmailAccount, TabId } from './types' import { API_BASE, tabs } from './constants' import OverviewTab from './_components/OverviewTab' import AccountsTab from './_components/AccountsTab' import AISettingsTab from './_components/AISettingsTab' import TemplatesTab from './_components/TemplatesTab' import AuditLogTab from './_components/AuditLogTab' export default function MailAdminPage() { const [activeTab, setActiveTab] = useState('overview') const [stats, setStats] = useState(null) const [accounts, setAccounts] = useState([]) const [syncStatus, setSyncStatus] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const fetchData = useCallback(async () => { try { setLoading(true) // Fetch stats and accounts in parallel const [statsRes, accountsRes, statusRes] = await Promise.all([ fetch(`${API_BASE}/api/v1/mail/stats`), fetch(`${API_BASE}/api/v1/mail/accounts`), fetch(`${API_BASE}/api/v1/mail/sync/status`), ]) if (statsRes.ok) { const statsData = await statsRes.json() setStats({ totalAccounts: statsData.total_accounts || 0, activeAccounts: statsData.active_accounts || 0, totalEmails: statsData.total_emails || 0, unreadEmails: statsData.unread_emails || 0, totalTasks: statsData.total_tasks || 0, pendingTasks: statsData.pending_tasks || 0, overdueTasks: statsData.overdue_tasks || 0, aiAnalyzedCount: statsData.ai_analyzed_count || 0, lastSyncTime: statsData.last_sync_time, }) } if (accountsRes.ok) { const accountsData = await accountsRes.json() setAccounts(accountsData.accounts || []) } if (statusRes.ok) { const statusData = await statusRes.json() setSyncStatus({ running: statusData.running || false, accountsInProgress: statusData.accounts_in_progress || [], lastCompleted: statusData.last_completed, errors: statusData.errors || [], }) } setError(null) } catch (err) { console.error('Failed to fetch mail data:', err) setError('Verbindung zum Mail-Service fehlgeschlagen') } finally { setLoading(false) } }, []) useEffect(() => { fetchData() // Refresh every 10 seconds if syncing const interval = setInterval(() => { if (syncStatus?.running) { fetchData() } }, 10000) return () => clearInterval(interval) }, [fetchData, syncStatus?.running]) return ( {/* Error Banner */} {error && (
{error}
)} {/* Tab Navigation */}
{/* Tab Content */} {activeTab === 'overview' && ( )} {activeTab === 'accounts' && ( )} {activeTab === 'ai-settings' && ( )} {activeTab === 'templates' && ( )} {activeTab === 'logs' && ( )}
) }