import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, MailCheck, Trash2, Edit, TestTube, AlertCircle, CheckCircle, Clock, RefreshCw, } from 'lucide-react' import toast from 'react-hot-toast' import { useForm } from 'react-hook-form' import { Button } from '@/components/ui/Button' import { Input } from '@/components/ui/Input' import { Label } from '@/components/ui/Label' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from '@/components/ui/Dialog' import { mailboxesApi } from '@/api/mailboxes.api' import { getErrorMessage } from '@/api/client' import { formatDate, MAILBOX_STATUS_LABELS } from '@/lib/utils' import { cn } from '@/lib/utils' import type { MailboxCreateRequest, MailboxResponse } from '@/types/api.types' const STATUS_COLORS = { active: 'text-green-700 bg-green-100', paused: 'text-yellow-700 bg-yellow-100', error: 'text-red-700 bg-red-100', deleted: 'text-gray-700 bg-gray-100', } const STATUS_ICONS = { active: CheckCircle, paused: Clock, error: AlertCircle, deleted: Trash2, } export function MailboxesPage() { const queryClient = useQueryClient() const [showCreateDialog, setShowCreateDialog] = useState(false) const [editingMailbox, setEditingMailbox] = useState(null) const [testingId, setTestingId] = useState(null) const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null) const { data: mailboxesData, isLoading } = useQuery({ queryKey: ['mailboxes'], queryFn: () => mailboxesApi.list(1, 200), }) const deleteMutation = useMutation({ mutationFn: mailboxesApi.delete, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['mailboxes'] }) toast.success('Casella eliminata') }, onError: (e) => toast.error(getErrorMessage(e)), }) const handleTest = async (mailbox: MailboxResponse) => { setTestingId(mailbox.id) setTestResult(null) try { const result = await mailboxesApi.testConnection(mailbox.id, 'imap') setTestResult(result) toast[result.success ? 'success' : 'error'](result.message) } catch (e) { toast.error(getErrorMessage(e)) } finally { setTestingId(null) } } const handleDelete = async (mailbox: MailboxResponse) => { if (!confirm(`Eliminare la casella ${mailbox.email_address}? L'operazione è irreversibile.`)) return deleteMutation.mutate(mailbox.id) } const mailboxes = mailboxesData?.items || [] return (
{/* Header */}

Caselle PEC

({mailboxes.length})
{/* Contenuto */}
{isLoading ? (
) : mailboxes.length === 0 ? (

Nessuna casella PEC configurata

Aggiungi una casella per iniziare a gestire le PEC

) : (
{mailboxes.map((mailbox) => { const StatusIcon = STATUS_ICONS[mailbox.status] || AlertCircle return (

{mailbox.display_name || mailbox.email_address}

{MAILBOX_STATUS_LABELS[mailbox.status]} {mailbox.provider && ( {mailbox.provider} )}

{mailbox.email_address}

IMAP: {mailbox.imap_host}:{mailbox.imap_port} SMTP: {mailbox.smtp_host}:{mailbox.smtp_port} {mailbox.last_sync_at && ( Ultima sync: {formatDate(mailbox.last_sync_at)} )}
{mailbox.status === 'error' && mailbox.sync_error_msg && (

{mailbox.sync_error_msg}

)}
{/* Test connessione */} {/* Modifica */} {/* Elimina */}
) })}
)}
{/* Dialog crea/modifica casella */} { setShowCreateDialog(false) setEditingMailbox(null) }} editingMailbox={editingMailbox} onSaved={() => { queryClient.invalidateQueries({ queryKey: ['mailboxes'] }) setShowCreateDialog(false) setEditingMailbox(null) }} />
) } // ─── Dialog creazione/modifica casella ─────────────────────────────────────── interface MailboxFormDialogProps { open: boolean onClose: () => void editingMailbox: MailboxResponse | null onSaved: () => void } function MailboxFormDialog({ open, onClose, editingMailbox, onSaved }: MailboxFormDialogProps) { const { register, handleSubmit, reset, formState: { errors }, } = useForm({ defaultValues: editingMailbox ? { email_address: editingMailbox.email_address, display_name: editingMailbox.display_name || '', provider: editingMailbox.provider || '', imap_host: editingMailbox.imap_host, imap_port: editingMailbox.imap_port, imap_user: editingMailbox.email_address, imap_use_ssl: editingMailbox.imap_use_ssl, smtp_host: editingMailbox.smtp_host, smtp_port: editingMailbox.smtp_port, smtp_user: editingMailbox.email_address, smtp_use_tls: editingMailbox.smtp_use_tls, } : { imap_port: 993, smtp_port: 465, imap_use_ssl: true, smtp_use_tls: true, }, }) const createMutation = useMutation({ mutationFn: mailboxesApi.create, onSuccess: () => { toast.success('Casella creata con successo') onSaved() reset() }, onError: (e) => toast.error(getErrorMessage(e)), }) const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: string; data: MailboxCreateRequest }) => mailboxesApi.update(id, data), onSuccess: () => { toast.success('Casella aggiornata') onSaved() }, onError: (e) => toast.error(getErrorMessage(e)), }) const onSubmit = (data: MailboxCreateRequest) => { if (editingMailbox) { updateMutation.mutate({ id: editingMailbox.id, data }) } else { createMutation.mutate(data) } } const isLoading = createMutation.isPending || updateMutation.isPending return ( !o && onClose()}> {editingMailbox ? 'Modifica casella PEC' : 'Aggiungi casella PEC'}
{/* Info generali */}
{/* Separatore IMAP */}

Configurazione IMAP (ricezione)

{/* Separatore SMTP */}

Configurazione SMTP (invio)

) }