/** * Ticket Email Address Manager Component * Allows businesses to manage their ticket email addresses */ import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Mail, Plus, Trash2, Edit, CheckCircle, XCircle, Loader2, Star, TestTube, RefreshCw, Eye, EyeOff, } from 'lucide-react'; import { useTicketEmailAddresses, useDeleteTicketEmailAddress, useTestImapConnection, useTestSmtpConnection, useFetchEmailsNow, useSetAsDefault, TicketEmailAddressListItem, } from '../hooks/useTicketEmailAddresses'; import toast from 'react-hot-toast'; import TicketEmailAddressModal from './TicketEmailAddressModal'; const TicketEmailAddressManager: React.FC = () => { const { t } = useTranslation(); const [isModalOpen, setIsModalOpen] = useState(false); const [editingAddress, setEditingAddress] = useState(null); const [showPasswords, setShowPasswords] = useState>({}); const { data: emailAddresses = [], isLoading } = useTicketEmailAddresses(); const deleteAddress = useDeleteTicketEmailAddress(); const testImap = useTestImapConnection(); const testSmtp = useTestSmtpConnection(); const fetchEmails = useFetchEmailsNow(); const setDefault = useSetAsDefault(); const handleAdd = () => { setEditingAddress(null); setIsModalOpen(true); }; const handleEdit = (address: TicketEmailAddressListItem) => { setEditingAddress(address); setIsModalOpen(true); }; const handleDelete = async (id: number, displayName: string) => { if (confirm(`Are you sure you want to delete ${displayName}?`)) { try { await deleteAddress.mutateAsync(id); toast.success(`${displayName} deleted successfully`); } catch (error) { toast.error('Failed to delete email address'); } } }; const handleTestImap = async (id: number, displayName: string) => { toast.loading(`Testing IMAP connection for ${displayName}...`, { id: `imap-${id}` }); try { const result = await testImap.mutateAsync(id); if (result.success) { toast.success(result.message, { id: `imap-${id}` }); } else { toast.error(result.message, { id: `imap-${id}` }); } } catch (error: any) { toast.error(error.response?.data?.message || 'IMAP test failed', { id: `imap-${id}` }); } }; const handleTestSmtp = async (id: number, displayName: string) => { toast.loading(`Testing SMTP connection for ${displayName}...`, { id: `smtp-${id}` }); try { const result = await testSmtp.mutateAsync(id); if (result.success) { toast.success(result.message, { id: `smtp-${id}` }); } else { toast.error(result.message, { id: `smtp-${id}` }); } } catch (error: any) { toast.error(error.response?.data?.message || 'SMTP test failed', { id: `smtp-${id}` }); } }; const handleFetchEmails = async (id: number, displayName: string) => { toast.loading(`Fetching emails for ${displayName}...`, { id: `fetch-${id}` }); try { const result = await fetchEmails.mutateAsync(id); if (result.success) { toast.success( `${result.message}. Processed: ${result.processed || 0}, Errors: ${result.errors || 0}`, { id: `fetch-${id}`, duration: 5000 } ); } else { toast.error(result.message, { id: `fetch-${id}` }); } } catch (error: any) { toast.error(error.response?.data?.message || 'Failed to fetch emails', { id: `fetch-${id}` }); } }; const handleSetDefault = async (id: number, displayName: string) => { try { const result = await setDefault.mutateAsync(id); if (result.success) { toast.success(result.message); } } catch (error) { toast.error('Failed to set as default'); } }; if (isLoading) { return (
); } return (
{/* Header */}

Email Addresses

Manage email addresses for receiving and sending support tickets

{/* Email Addresses List */} {emailAddresses.length === 0 ? (

No email addresses configured

Add your first email address to start receiving tickets via email

) : (
{emailAddresses.map((address) => (

{address.display_name}

{address.is_default && ( Default )} {address.is_active ? ( Active ) : ( Inactive )}

{address.email_address}

Processed: {address.emails_processed_count} emails {address.last_check_at && ( Last checked: {new Date(address.last_check_at).toLocaleString()} )}
{!address.is_default && ( )}
))}
)} {/* Modal */} {isModalOpen && ( { setIsModalOpen(false); setEditingAddress(null); }} /> )}
); }; export default TicketEmailAddressManager;