'use client' import { useState } from 'react' import type { EmailAccount } from '../types' import { API_BASE } from '../types' interface AccountsTabProps { accounts: EmailAccount[] loading: boolean onRefresh: () => void } const statusColors: Record = { active: 'bg-green-100 text-green-800', inactive: 'bg-gray-100 text-gray-800', error: 'bg-red-100 text-red-800', syncing: 'bg-yellow-100 text-yellow-800', } const statusLabels: Record = { active: 'Aktiv', inactive: 'Inaktiv', error: 'Fehler', syncing: 'Synchronisiert...', } export function AccountsTab({ accounts, loading, onRefresh }: AccountsTabProps) { const [showAddModal, setShowAddModal] = useState(false) const testConnection = async (accountId: string) => { try { const res = await fetch(`${API_BASE}/api/v1/mail/accounts/${accountId}/test`, { method: 'POST', }) if (res.ok) { alert('Verbindung erfolgreich!') } else { alert('Verbindungsfehler') } } catch { alert('Verbindungsfehler') } } return (
{/* Header */}

E-Mail-Konten

Verwalten Sie die verbundenen E-Mail-Konten

{/* Loading State */} {loading && (
)} {/* Accounts Grid */} {!loading && (
{accounts.length === 0 ? ( ) : ( accounts.map((account) => ( )) )}
)} {/* Add Account Modal */} {showAddModal && ( setShowAddModal(false)} onSuccess={() => { setShowAddModal(false); onRefresh() }} /> )}
) } function EmptyAccountsState() { return (

Keine E-Mail-Konten

Fuegen Sie Ihr erstes E-Mail-Konto hinzu.

) } function AccountCard({ account, onTestConnection }: { account: EmailAccount onTestConnection: (id: string) => void }) { return (

{account.displayName || account.email}

{account.email}

{statusLabels[account.status]}

E-Mails

{account.emailCount}

Ungelesen

{account.unreadCount}

IMAP

{account.imapHost}:{account.imapPort}

Letzte Sync

{account.lastSync ? new Date(account.lastSync).toLocaleString('de-DE') : 'Nie'}

) } function AddAccountModal({ onClose, onSuccess }: { onClose: () => void onSuccess: () => void }) { const [formData, setFormData] = useState({ email: '', displayName: '', imapHost: '', imapPort: 993, smtpHost: '', smtpPort: 587, username: '', password: '', }) const [submitting, setSubmitting] = useState(false) const [error, setError] = useState(null) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitting(true) setError(null) try { const res = await fetch(`${API_BASE}/api/v1/mail/accounts`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: formData.email, display_name: formData.displayName, imap_host: formData.imapHost, imap_port: formData.imapPort, smtp_host: formData.smtpHost, smtp_port: formData.smtpPort, username: formData.username, password: formData.password, }), }) if (res.ok) { onSuccess() } else { const data = await res.json() setError(data.detail || 'Fehler beim Hinzufuegen des Kontos') } } catch { setError('Netzwerkfehler') } finally { setSubmitting(false) } } return (

E-Mail-Konto hinzufuegen

{error && (
{error}
)}
setFormData({ ...formData, email: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="schulleitung@grundschule-xy.de" />
setFormData({ ...formData, displayName: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="Schulleitung" />
setFormData({ ...formData, imapHost: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="imap.example.com" />
setFormData({ ...formData, imapPort: parseInt(e.target.value) })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" />
setFormData({ ...formData, smtpHost: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" placeholder="smtp.example.com" />
setFormData({ ...formData, smtpPort: parseInt(e.target.value) })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" />
setFormData({ ...formData, username: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" />
setFormData({ ...formData, password: e.target.value })} className="w-full px-3 py-2 border border-slate-300 rounded-lg focus:ring-2 focus:ring-blue-500" />

Das Passwort wird verschluesselt in Vault gespeichert.

) }