import { useState, useEffect } from 'react'; import { RefreshCw, Plus, Mail, Inbox, Send, Trash2 } from 'lucide-react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { cachedEmailApi, stressfreiEmailApi, CachedEmail } from '../../services/api'; import { useAuth } from '../../context/AuthContext'; import Button from '../ui/Button'; import EmailList from './EmailList'; import EmailDetail from './EmailDetail'; import ComposeEmailModal from './ComposeEmailModal'; import AssignToContractModal from './AssignToContractModal'; import TrashEmailList from './TrashEmailList'; type EmailFolder = 'INBOX' | 'SENT' | 'TRASH'; interface EmailClientTabProps { customerId: number; } export default function EmailClientTab({ customerId }: EmailClientTabProps) { const [selectedAccountId, setSelectedAccountId] = useState(null); const [selectedFolder, setSelectedFolder] = useState('INBOX'); const [selectedEmail, setSelectedEmail] = useState(null); const [showCompose, setShowCompose] = useState(false); const [showAssign, setShowAssign] = useState(false); const [replyToEmail, setReplyToEmail] = useState(null); const queryClient = useQueryClient(); const { hasPermission } = useAuth(); const canAccessTrash = hasPermission('emails:delete'); // Mailbox-Konten laden const { data: accountsData, isLoading: accountsLoading } = useQuery({ queryKey: ['mailbox-accounts', customerId], queryFn: () => cachedEmailApi.getMailboxAccounts(customerId), }); const accounts = accountsData?.data || []; // Erstes Konto automatisch auswählen useEffect(() => { if (accounts.length > 0 && !selectedAccountId) { setSelectedAccountId(accounts[0].id); } }, [accounts, selectedAccountId]); const selectedAccount = accounts.find((a) => a.id === selectedAccountId); // E-Mails laden (nur für INBOX und SENT) const { data: emailsData, isLoading: emailsLoading, refetch: refetchEmails } = useQuery({ queryKey: ['emails', 'customer', customerId, selectedAccountId, selectedFolder], queryFn: () => cachedEmailApi.getForCustomer(customerId, { accountId: selectedAccountId || undefined, folder: selectedFolder as 'INBOX' | 'SENT', }), enabled: !!selectedAccountId && selectedFolder !== 'TRASH', }); const emails = emailsData?.data || []; // Papierkorb-E-Mails laden const { data: trashData, isLoading: trashLoading } = useQuery({ queryKey: ['emails', 'trash', customerId], queryFn: () => cachedEmailApi.getTrash(customerId), enabled: selectedFolder === 'TRASH' && canAccessTrash, }); const trashEmails = trashData?.data || []; // Ordner-Anzahlen für Badges (total und ungelesen pro Ordner) const { data: folderCountsData } = useQuery({ queryKey: ['folder-counts', selectedAccountId], queryFn: () => stressfreiEmailApi.getFolderCounts(selectedAccountId!), enabled: !!selectedAccountId, }); const folderCounts = folderCountsData?.data || { inbox: 0, inboxUnread: 0, sent: 0, sentUnread: 0, trash: 0, trashUnread: 0, }; // Einzelne E-Mail laden (mit Body) const { data: emailDetailData } = useQuery({ queryKey: ['email', selectedEmail?.id], queryFn: () => cachedEmailApi.getById(selectedEmail!.id), enabled: !!selectedEmail?.id, }); const emailDetail = emailDetailData?.data || selectedEmail; // Synchronisation const syncMutation = useMutation({ mutationFn: (accountId: number) => stressfreiEmailApi.syncEmails(accountId), onSuccess: () => { // E-Mail-Listen neu laden queryClient.invalidateQueries({ queryKey: ['emails'] }); // Ordner-Anzahlen aktualisieren queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); // Mailbox-Accounts aktualisieren queryClient.invalidateQueries({ queryKey: ['mailbox-accounts', customerId] }); }, }); const handleSync = () => { if (selectedAccountId) { syncMutation.mutate(selectedAccountId); } }; const handleSelectEmail = (email: CachedEmail) => { setSelectedEmail(email); }; const handleReply = () => { setReplyToEmail(emailDetail || null); setShowCompose(true); }; const handleNewEmail = () => { setReplyToEmail(null); setShowCompose(true); }; const handleAssignContract = () => { setShowAssign(true); }; // Keine Mailbox-Konten vorhanden if (!accountsLoading && accounts.length === 0) { return (

Keine E-Mail-Konten vorhanden

Erstellen Sie eine Stressfrei-Wechseln E-Mail-Adresse mit aktivierter Mailbox, um E-Mails hier empfangen und versenden zu können.

); } const handleFolderChange = (folder: EmailFolder) => { setSelectedFolder(folder); setSelectedEmail(null); }; return (
{/* Header */}
{/* Account Selector */}
{/* Folder Tabs */}
{canAccessTrash && ( )}
{/* Actions */}
{selectedFolder !== 'TRASH' && ( )}
{/* Content */}
{/* Email List */}
{selectedFolder === 'TRASH' ? ( { if (selectedEmail?.id === emailId) { setSelectedEmail(null); } // Trash und normale E-Mails neu laden + Folder-Counts aktualisieren queryClient.invalidateQueries({ queryKey: ['emails'] }); queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); }} onEmailDeleted={(emailId) => { if (selectedEmail?.id === emailId) { setSelectedEmail(null); } queryClient.invalidateQueries({ queryKey: ['emails', 'trash'] }); queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); }} isLoading={trashLoading} /> ) : ( { // Falls die gelöschte E-Mail ausgewählt war, Auswahl aufheben if (selectedEmail?.id === emailId) { setSelectedEmail(null); } // Folder-Counts aktualisieren (Trash-Counter ist jetzt dort) queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); }} isLoading={emailsLoading} folder={selectedFolder as 'INBOX' | 'SENT'} accountId={selectedAccountId} /> )}
{/* Email Detail */}
{emailDetail ? ( { setSelectedEmail(null); queryClient.invalidateQueries({ queryKey: ['emails'] }); queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); }} isSentFolder={selectedFolder === 'SENT'} isTrashView={selectedFolder === 'TRASH'} onRestored={() => { setSelectedEmail(null); queryClient.invalidateQueries({ queryKey: ['emails'] }); queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); }} accountId={selectedAccountId || undefined} /> ) : (

Wählen Sie eine E-Mail aus

)}
{/* Compose Modal */} {selectedAccount && ( { setShowCompose(false); setReplyToEmail(null); }} account={selectedAccount} replyTo={replyToEmail || undefined} onSuccess={() => { // Gesendete E-Mails aktualisieren queryClient.invalidateQueries({ queryKey: ['emails', 'customer', customerId, selectedAccountId, 'SENT'] }); // Folder-Counts aktualisieren queryClient.invalidateQueries({ queryKey: ['folder-counts', selectedAccountId] }); // Falls wir im Gesendet-Ordner sind, Liste neu laden if (selectedFolder === 'SENT') { refetchEmails(); } }} /> )} {/* Assign Contract Modal */} {emailDetail && ( setShowAssign(false)} email={emailDetail} customerId={customerId} onSuccess={() => { refetchEmails(); }} /> )}
); }