import { useState, useRef } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, Search, Star, Trash2, Pencil, Upload, BookUser, Building2 } from 'lucide-react' import toast from 'react-hot-toast' 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 { contactsApi, type PecContactResponse, type PecContactCreate, type PecContactUpdate } from '@/api/contacts.api' import { getErrorMessage } from '@/api/client' import { formatDate } from '@/lib/utils' export function ContactsPage() { const queryClient = useQueryClient() const [q, setQ] = useState('') const [page] = useState(1) const [showForm, setShowForm] = useState(false) const [editing, setEditing] = useState(null) const fileInputRef = useRef(null) // Form state const [formEmail, setFormEmail] = useState('') const [formName, setFormName] = useState('') const [formOrg, setFormOrg] = useState('') const [formNotes, setFormNotes] = useState('') const [formFavorite, setFormFavorite] = useState(false) const { data, isLoading } = useQuery({ queryKey: ['contacts', q, page], queryFn: () => contactsApi.list({ q: q || undefined, page, page_size: 50 }), }) const createMutation = useMutation({ mutationFn: (d: PecContactCreate) => contactsApi.create(d), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['contacts'] }) toast.success('Contatto aggiunto') closeForm() }, onError: (e) => toast.error(getErrorMessage(e)), }) const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: string; data: PecContactUpdate }) => contactsApi.update(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['contacts'] }) toast.success('Contatto aggiornato') closeForm() }, onError: (e) => toast.error(getErrorMessage(e)), }) const deleteMutation = useMutation({ mutationFn: (id: string) => contactsApi.delete(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['contacts'] }) toast.success('Contatto eliminato') }, onError: (e) => toast.error(getErrorMessage(e)), }) const importMutation = useMutation({ mutationFn: (file: File) => contactsApi.importCsv(file), onSuccess: (res) => { queryClient.invalidateQueries({ queryKey: ['contacts'] }) toast.success(`Importati: ${res.created} nuovi, ${res.updated} aggiornati, ${res.skipped} saltati`) }, onError: (e) => toast.error(getErrorMessage(e)), }) const toggleFavMutation = useMutation({ mutationFn: ({ id, fav }: { id: string; fav: boolean }) => contactsApi.update(id, { is_favorite: fav }), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['contacts'] }), onError: (e) => toast.error(getErrorMessage(e)), }) const openCreate = () => { setEditing(null) setFormEmail('') setFormName('') setFormOrg('') setFormNotes('') setFormFavorite(false) setShowForm(true) } const openEdit = (c: PecContactResponse) => { setEditing(c) setFormEmail(c.email) setFormName(c.name ?? '') setFormOrg(c.organization ?? '') setFormNotes(c.notes ?? '') setFormFavorite(c.is_favorite) setShowForm(true) } const closeForm = () => { setShowForm(false) setEditing(null) } const handleSubmit = () => { if (!formEmail.trim()) return toast.error('L\'email e\' obbligatoria') const payload = { email: formEmail.trim(), name: formName.trim() || null, organization: formOrg.trim() || null, notes: formNotes.trim() || null, is_favorite: formFavorite, } if (editing) { updateMutation.mutate({ id: editing.id, data: payload }) } else { createMutation.mutate(payload) } } const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { importMutation.mutate(file) e.target.value = '' } } const items = data?.items ?? [] const total = data?.total ?? 0 return (

Rubrica PEC

{total} contatti nella rubrica

setQ(e.target.value)} className="pl-9" />
{isLoading ? (
) : items.length === 0 ? (

Nessun contatto trovato

Aggiungi contatti manualmente o importa un CSV con colonne: email, name, organization

) : (
{items.map((c) => ( ))}
Email PEC Nome Organizzazione Tipo Aggiornato
{c.email} {c.name ?? '-'} {c.organization ? ( {c.organization} ) : '-'} {c.auto_saved ? 'Automatico' : 'Manuale'} {formatDate(c.updated_at)}
)}
!o && closeForm()}> {editing ? 'Modifica contatto' : 'Nuovo contatto'}
setFormEmail(e.target.value)} placeholder="indirizzo@pec.it" disabled={!!editing} type="email" />
setFormName(e.target.value)} placeholder="Mario Rossi" />
setFormOrg(e.target.value)} placeholder="Comune di Roma" />
setFormNotes(e.target.value)} placeholder="Note aggiuntive..." />
) }