import { useState } from 'react'; import { Undo2, Trash2, ChevronRight, Inbox, Send, X } from 'lucide-react'; import { CachedEmail, cachedEmailApi } from '../../services/api'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import Button from '../ui/Button'; import toast from 'react-hot-toast'; interface TrashEmailListProps { emails: CachedEmail[]; selectedEmailId?: number; onSelectEmail: (email: CachedEmail) => void; onEmailRestored?: (emailId: number) => void; onEmailDeleted?: (emailId: number) => void; isLoading?: boolean; } export default function TrashEmailList({ emails, selectedEmailId, onSelectEmail, onEmailRestored, onEmailDeleted, isLoading, }: TrashEmailListProps) { const [actionConfirmId, setActionConfirmId] = useState(null); const [actionType, setActionType] = useState<'restore' | 'delete' | null>(null); const queryClient = useQueryClient(); // Absender/Empfänger anzeigen const getDisplayName = (email: CachedEmail) => { if (email.folder === 'SENT') { try { const toAddresses = JSON.parse(email.toAddresses); if (toAddresses.length > 0) { return `An: ${toAddresses[0]}${toAddresses.length > 1 ? ` (+${toAddresses.length - 1})` : ''}`; } } catch { return 'An: (Unbekannt)'; } } return email.fromName || email.fromAddress; }; const restoreMutation = useMutation({ mutationFn: (emailId: number) => cachedEmailApi.restore(emailId), onSuccess: (_data, emailId) => { queryClient.invalidateQueries({ queryKey: ['emails'] }); toast.success('E-Mail wiederhergestellt'); setActionConfirmId(null); setActionType(null); onEmailRestored?.(emailId); }, onError: (error: Error) => { console.error('Restore error:', error); toast.error(error.message || 'Fehler beim Wiederherstellen'); setActionConfirmId(null); setActionType(null); }, }); const deleteMutation = useMutation({ mutationFn: (emailId: number) => cachedEmailApi.permanentDelete(emailId), onSuccess: (_data, emailId) => { queryClient.invalidateQueries({ queryKey: ['emails'] }); toast.success('E-Mail endgültig gelöscht'); setActionConfirmId(null); setActionType(null); onEmailDeleted?.(emailId); }, onError: (error: Error) => { console.error('Permanent delete error:', error); toast.error(error.message || 'Fehler beim endgültigen Löschen'); setActionConfirmId(null); setActionType(null); }, }); const unassignMutation = useMutation({ mutationFn: (emailId: number) => cachedEmailApi.unassignFromContract(emailId), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['emails'] }); toast.success('Vertragszuordnung aufgehoben'); }, onError: (error: Error) => { console.error('Unassign error:', error); toast.error(error.message || 'Fehler beim Aufheben der Zuordnung'); }, }); const handleUnassign = (e: React.MouseEvent, emailId: number) => { e.stopPropagation(); unassignMutation.mutate(emailId); }; const handleRestoreClick = (e: React.MouseEvent, emailId: number) => { e.stopPropagation(); setActionConfirmId(emailId); setActionType('restore'); }; const handleDeleteClick = (e: React.MouseEvent, emailId: number) => { e.stopPropagation(); setActionConfirmId(emailId); setActionType('delete'); }; const handleConfirm = (e: React.MouseEvent) => { e.stopPropagation(); if (actionConfirmId && actionType) { if (actionType === 'restore') { restoreMutation.mutate(actionConfirmId); } else { deleteMutation.mutate(actionConfirmId); } } }; const handleCancel = (e: React.MouseEvent) => { e.stopPropagation(); setActionConfirmId(null); setActionType(null); }; const formatDate = (dateStr: string) => { const date = new Date(dateStr); return date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' }); }; const formatDeletedAt = (dateStr?: string) => { if (!dateStr) return ''; const date = new Date(dateStr); const now = new Date(); const isToday = date.toDateString() === now.toDateString(); if (isToday) { return `Gelöscht um ${date.toLocaleTimeString('de-DE', { hour: '2-digit', minute: '2-digit' })}`; } return `Gelöscht am ${date.toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit' })}`; }; if (isLoading) { return (
); } if (emails.length === 0) { return (

Papierkorb ist leer

); } return (
{emails.map((email) => (
onSelectEmail(email)} className={[ 'flex items-start gap-3 p-3 cursor-pointer transition-colors', selectedEmailId === email.id ? 'bg-red-100' : 'hover:bg-gray-100 bg-gray-50/50' ].join(' ')} style={{ borderLeft: selectedEmailId === email.id ? '4px solid #dc2626' : '4px solid transparent' }} > {/* Folder Icon */}
{email.folder === 'SENT' ? ( ) : ( )}
{/* Restore */} {/* Permanent Delete */} {/* Email Content */}
{/* From/To & Date */}
{getDisplayName(email)} {formatDate(email.receivedAt)}
{/* Subject */}
{email.subject || '(Kein Betreff)'}
{/* Deleted At */}
{formatDeletedAt(email.deletedAt)}
{/* Contract Badge */} {email.contract && (
{email.contract.contractNumber} {/* X-Button nur für ursprüngliche INBOX oder manuell zugeordnete gesendete E-Mails */} {(email.folder === 'INBOX' || (email.folder === 'SENT' && !email.isAutoAssigned)) && ( )}
)}
{/* Chevron */}
))} {/* Bestätigungs-Modal */} {actionConfirmId && actionType && (

{actionType === 'restore' ? 'E-Mail wiederherstellen?' : 'E-Mail endgültig löschen?'}

{actionType === 'restore' ? 'Die E-Mail wird wieder in den ursprünglichen Ordner verschoben.' : 'Die E-Mail wird unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.'}

)}
); }