import React, { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { Textarea } from "@/components/ui/textarea"; import { useToast } from "@/hooks/use-toast"; import { apiRequest } from "@/lib/queryClient"; import { safeFormat } from "@/lib/dateUtils"; import { MessageSquare, Plus, Edit2, Trash2, Save, X } from "lucide-react"; interface ReconciliationCommentsProps { deliveryId: number; className?: string; } interface ReconciliationComment { id: number; content: string; deliveryId: number; authorId: string; groupId: number; createdAt: Date; updatedAt: Date; author: { id: string; email: string; role: string; }; } export default function ReconciliationComments({ deliveryId, className = "" }: ReconciliationCommentsProps) { const { toast } = useToast(); const queryClient = useQueryClient(); const [isAdding, setIsAdding] = useState(false); const [editingId, setEditingId] = useState(null); const [newComment, setNewComment] = useState(""); const [editComment, setEditComment] = useState(""); // Récupérer les commentaires const { data: comments = [], isLoading } = useQuery({ queryKey: [`/api/deliveries/${deliveryId}/reconciliation-comments`], queryFn: () => apiRequest(`/api/deliveries/${deliveryId}/reconciliation-comments`), enabled: !!deliveryId, }); // Créer un commentaire const createCommentMutation = useMutation({ mutationFn: async (content: string) => { return apiRequest(`/api/deliveries/${deliveryId}/reconciliation-comments`, "POST", { content }); }, onSuccess: () => { toast({ title: "Succès", description: "Commentaire ajouté avec succès", }); queryClient.invalidateQueries({ queryKey: [`/api/deliveries/${deliveryId}/reconciliation-comments`] }); setIsAdding(false); setNewComment(""); }, onError: (error: any) => { toast({ title: "Erreur", description: error?.message || "Impossible d'ajouter le commentaire", variant: "destructive", }); }, }); // Modifier un commentaire const updateCommentMutation = useMutation({ mutationFn: async ({ id, content }: { id: number; content: string }) => { return apiRequest(`/api/reconciliation-comments/${id}`, "PUT", { content }); }, onSuccess: () => { toast({ title: "Succès", description: "Commentaire modifié avec succès", }); queryClient.invalidateQueries({ queryKey: [`/api/deliveries/${deliveryId}/reconciliation-comments`] }); setEditingId(null); }, onError: (error: any) => { toast({ title: "Erreur", description: error?.message || "Impossible de modifier le commentaire", variant: "destructive", }); }, }); // Supprimer un commentaire const deleteCommentMutation = useMutation({ mutationFn: async (id: number) => { return apiRequest(`/api/reconciliation-comments/${id}`, "DELETE"); }, onSuccess: () => { toast({ title: "Succès", description: "Commentaire supprimé avec succès", }); queryClient.invalidateQueries({ queryKey: [`/api/deliveries/${deliveryId}/reconciliation-comments`] }); }, onError: (error: any) => { toast({ title: "Erreur", description: error?.message || "Impossible de supprimer le commentaire", variant: "destructive", }); }, }); const handleAddComment = (e: React.FormEvent) => { e.preventDefault(); if (!newComment.trim()) return; createCommentMutation.mutate(newComment); }; const handleEditComment = (comment: ReconciliationComment) => { setEditingId(comment.id); setEditComment(comment.content); }; const handleSaveEdit = () => { if (!editComment.trim() || !editingId) return; updateCommentMutation.mutate({ id: editingId, content: editComment, }); }; const handleCancelEdit = () => { setEditingId(null); setEditComment(""); }; const handleDeleteComment = (id: number) => { if (confirm("Êtes-vous sûr de vouloir supprimer ce commentaire ?")) { deleteCommentMutation.mutate(id); } }; if (isLoading) { return (
); } return (

Commentaires {comments.length > 0 && ( {comments.length} )}

{/* Formulaire d'ajout */} {isAdding && (