diff --git a/frontend/src/app/(app)/tickets/[id]/page.tsx b/frontend/src/app/(app)/tickets/[id]/page.tsx index a52beb9..9c5899d 100644 --- a/frontend/src/app/(app)/tickets/[id]/page.tsx +++ b/frontend/src/app/(app)/tickets/[id]/page.tsx @@ -225,6 +225,13 @@ export default function TicketDetailPage() { const [mergeTarget, setMergeTarget] = useState(""); const [mergeError, setMergeError] = useState(""); const [merging, setMerging] = useState(false); + const [sendMenuOpen, setSendMenuOpen] = useState(false); + + const handleAddComment = (e: React.FormEvent) => { + e.preventDefault(); + setSendMenuOpen(false); + void submitComment(); + }; useEffect(() => { Promise.all([ @@ -267,8 +274,8 @@ export default function TicketDetailPage() { const MAX_FILE_BYTES = 10 * 1024 * 1024; - const handleAddComment = async (e: React.FormEvent) => { - e.preventDefault(); + // Envía el comentario y, opcionalmente, resuelve o cierra el ticket. + const submitComment = async (after?: "resolved" | "closed") => { if (!comment.trim()) return; // Solo se envía/guarda el mensaje escrito, sin historial pegado o // citado (se usa para revisar casos en el futuro). @@ -308,6 +315,15 @@ export default function TicketDetailPage() { setCc(""); setFiles([]); setPendingIds([]); + if (after) { + try { + await updateTicketStatus(id, after); + await refreshTicket(); + notify.success(after === "resolved" ? "Ticket resuelto" : "Ticket cerrado"); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : "El mensaje se envió, pero no se pudo cambiar el estado"); + } + } } catch (err: unknown) { // Si la subida salió pero el comentario falló, los ids quedan // pendientes y se vinculan en el próximo envío. @@ -829,6 +845,74 @@ export default function TicketDetailPage() { )} + {isTeam && ( +
+ + {sendMenuOpen && ( + <> +
setSendMenuOpen(false)} + /> + + + )} +
+ )}