import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, Pencil, Trash2, FileText, Search } 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 { RichTextEditor } from '@/components/RichTextEditor/RichTextEditor' import { templatesApi, type TemplateResponse, type TemplateCreate } from '@/api/templates.api' import { getErrorMessage } from '@/api/client' import { formatDate } from '@/lib/utils' import { useAuth } from '@/hooks/useAuth' export function TemplatesPage() { const queryClient = useQueryClient() const { isAdmin } = useAuth() const [q, setQ] = useState('') const [showForm, setShowForm] = useState(false) const [editing, setEditing] = useState(null) // Form state const [formName, setFormName] = useState('') const [formDescription, setFormDescription] = useState('') const [formSubject, setFormSubject] = useState('') const [formBody, setFormBody] = useState('') const { data, isLoading } = useQuery({ queryKey: ['templates', q], queryFn: () => templatesApi.list(q || undefined), }) const createMutation = useMutation({ mutationFn: (data: TemplateCreate) => templatesApi.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['templates'] }) toast.success('Template creato') closeForm() }, onError: (e) => toast.error(getErrorMessage(e)), }) const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: string; data: TemplateCreate }) => templatesApi.update(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['templates'] }) toast.success('Template aggiornato') closeForm() }, onError: (e) => toast.error(getErrorMessage(e)), }) const deleteMutation = useMutation({ mutationFn: (id: string) => templatesApi.delete(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['templates'] }) toast.success('Template eliminato') }, onError: (e) => toast.error(getErrorMessage(e)), }) const openCreate = () => { setEditing(null) setFormName('') setFormDescription('') setFormSubject('') setFormBody('') setShowForm(true) } const openEdit = (t: TemplateResponse) => { setEditing(t) setFormName(t.name) setFormDescription(t.description ?? '') setFormSubject(t.subject) setFormBody(t.body_html ?? t.body_text ?? '') setShowForm(true) } const closeForm = () => { setShowForm(false) setEditing(null) } const handleSubmit = () => { if (!formName.trim()) return toast.error('Il nome e\' obbligatorio') const payload: TemplateCreate = { name: formName.trim(), description: formDescription.trim() || null, subject: formSubject.trim(), body_html: formBody || null, body_text: null, } if (editing) { updateMutation.mutate({ id: editing.id, data: payload }) } else { createMutation.mutate(payload) } } const items = data?.items ?? [] return (

Template messaggi

Template riutilizzabili per la composizione PEC

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

Nessun template trovato

{isAdmin ? 'Crea il tuo primo template con il pulsante in alto.' : 'Nessun template disponibile.'}

) : (
{items.map((t) => (

{t.name}

{t.description && (

{t.description}

)}
{isAdmin && (
)}
{t.subject && (

Oggetto: {t.subject}

)}

Aggiornato: {formatDate(t.updated_at)}

))}
)}
{/* Dialog form */} !o && closeForm()}> {editing ? 'Modifica template' : 'Nuovo template'}
setFormName(e.target.value)} placeholder="Es. Risposta a ricorso" />
setFormDescription(e.target.value)} placeholder="Breve descrizione del template" />
setFormSubject(e.target.value)} placeholder="Oggetto del messaggio PEC" />
) }