'use client'; import { useState, useEffect } from 'react'; import { useSearchParams } from 'next/navigation'; import Link from 'next/link'; interface Email { key: string; subject: string; date: string; processed: string; processedAt: string | null; // Wird nicht mehr angezeigt, aber im Interface belassen processedBy: string | null; queuedTo: string | null; status: string | null; } export default function Emails() { const searchParams = useSearchParams(); const bucket = searchParams.get('bucket'); const mailbox = searchParams.get('mailbox'); const [emails, setEmails] = useState([]); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { if (!bucket || !mailbox) { setError('Missing parameters'); setLoading(false); return; } const auth = localStorage.getItem('auth'); if (!auth) { setError('Not authenticated'); setLoading(false); return; } fetch(`/api/emails?bucket=${bucket}&mailbox=${encodeURIComponent(mailbox)}`, { headers: { Authorization: `Basic ${auth}` } }) .then(res => { if (!res.ok) throw new Error('Failed to fetch emails'); return res.json(); }) .then(data => { const sorted = data.sort((a: Email, b: Email) => new Date(b.date).getTime() - new Date(a.date).getTime()); setEmails(sorted); }) .catch(err => setError(err.message)) .finally(() => setLoading(false)); }, [bucket, mailbox]); if (loading) return
Loading...
; if (error) return
{error}
; const formatDate = (dateStr: string | null) => { if (!dateStr) return ''; const date = new Date(dateStr); // Kompaktes Datum formatieren return date.toLocaleString('en-US', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false }); }; // DEFINITION DES GRID LAYOUTS // 1fr = Subject (nimmt den Rest) // auto = Passt sich exakt der Breite des Inhalts an (für Key, Date, etc.) const gridLayoutClass = "grid grid-cols-[1fr_auto_auto_auto_auto_auto_auto_auto] gap-x-4 items-center"; return (

{mailbox} in {bucket}

{/* Container - overflow-x-auto erlaubt Scrollen nur wenn der Key GIGANTISCH ist und den Bildschirm sprengt */}
{/* HEADER */}
Subject
Date
Key
Proc.
{/* Proc At entfernt */}
Proc. By
Queued
Status
Action
{/* ROWS */}
{emails.length === 0 ? (
No emails found
) : emails.map((e: Email) => (
{/* 1. Subject: truncate sorgt für "..." am Ende, min-w-0 ist wichtig für Grid Truncation */}
{e.subject}
{/* 2. Date: Fixed width content via whitespace-nowrap */}
{formatDate(e.date)}
{/* 3. Key: Monospace Font, volle Sichtbarkeit, selektierbar */}
{e.key}
{/* 4. Processed: Kurz */}
{e.processed === 'true' ? 'Y' : 'N'}
{/* Proc At entfernt */} {/* 5. Processed By: Auto width */}
{e.processedBy ? e.processedBy.split('@')[0] : '-'}
{/* 6. Queued: Auto width */}
{e.queuedTo || '-'}
{/* 7. Status */}
{e.status ? ( {e.status} ) : -}
{/* 8. Action: Rechtsbündig aligned mit Header */}
View
))}
); }