import React, { useState, useEffect } from 'react'; import { pb } from '../../config/pocketbase'; interface Ticket { id: string; subject: string; description: string; category: string; status: 'Ouvert' | 'En analyse' | 'Résolu'; created: string; } interface Message { id: string; content: string; created: string; expand?: { author?: { name?: string; email?: string; avatar?: string; }; }; } interface TicketDetailProps { ticketId: string; onBack: () => void; } export default function TicketDetail({ ticketId, onBack }: TicketDetailProps) { const [ticket, setTicket] = useState(null); const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(''); const [isLoading, setIsLoading] = useState(true); const [isSending, setIsSending] = useState(false); const currentUser = pb.authStore.record; // Récupération du ticket et de ses messages associés const fetchTicketData = async () => { try { const ticketData = await pb.collection('aegis_tickets').getOne(ticketId); setTicket(ticketData); const messageRecords = await pb.collection('aegis_ticket_messages').getFullList({ filter: `ticket = "${ticketId}"`, expand: 'author', sort: 'created', }); setMessages(messageRecords); } catch (error) { console.error("Erreur lors du chargement de la discussion :", error); } finally { setIsLoading(false); } }; useEffect(() => { fetchTicketData(); }, [ticketId]); // Envoi d'un nouveau message dans la discussion const handleSendMessage = async (e: React.SubmitEvent) => { e.preventDefault(); if (!newMessage.trim() || !currentUser) return; setIsSending(true); try { await pb.collection('aegis_ticket_messages').create({ ticket: ticketId, author: currentUser.id, content: newMessage.trim(), }); setNewMessage(''); await fetchTicketData(); // Recharger les messages } catch (error) { console.error("Erreur lors de l'envoi du message :", error); alert("Impossible d'envoyer le message."); } finally { setIsSending(false); } }; if (isLoading) { return (
); } if (!ticket) { return (

Ticket introuvable ou accès non autorisé.

); } return (
{/* Barre de navigation / Retour */}
{ticket.category} {ticket.status}
{/* En-tête du ticket & Description initiale */}

{ticket.subject}

Description initiale :

{ticket.description}

Créé le {new Date(ticket.created).toLocaleString('fr-FR')}

{/* Fil de discussion / Messages */}

Échanges avec l'équipe GISE

{/* Liste des messages */}
{messages.length === 0 ? (
Aucun message pour l'instant. Démarrez la conversation ci-dessous.
) : ( messages.map((msg) => { const isMyMessage = msg.author === currentUser?.id; const authorName = msg.expand?.author?.name || msg.expand?.author?.email || 'Expert GISE'; return (
{authorName} {new Date(msg.created).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
{msg.content}
); }) )}
{/* Formulaire de réponse */}
setNewMessage(e.target.value)} placeholder="Écrivez votre message ou complément d'information..." className="flex-1 rounded-lg border border-slate-300 px-4 py-2.5 text-sm focus:border-blue-900 focus:outline-none focus:ring-1 focus:ring-blue-900" />
); }