"use client" import { useState, useEffect } from "react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { MessageSquare, Search, Plus, Send, Paperclip, Smile, Phone, Video, MoreHorizontal, Users, Circle, CheckCheck, Clock, File, Download, Brain, Shield, TrendingUp, CheckCircle, FileText, BarChart3, Zap, } from "lucide-react" import { useSearchParams } from "next/navigation" export default function ChatPage() { const [selectedConversation, setSelectedConversation] = useState("1") const [newMessage, setNewMessage] = useState("") const [searchTerm, setSearchTerm] = useState("") const searchParams = useSearchParams() const userId = searchParams.get("user") const messageType = searchParams.get("message") const groupType = searchParams.get("type") useEffect(() => { // Gérer les nouveaux messages depuis les autres pages if (messageType === "new") { if (userId) { // Message individuel const messageData = sessionStorage.getItem("newMessage") if (messageData) { const data = JSON.parse(messageData) console.log("Nouveau message individuel:", data) // Créer ou ouvrir la conversation avec cet utilisateur setSelectedConversation(userId) // Ajouter le message pré-rempli setNewMessage(`${data.subject ? `[${data.subject}] ` : ""}${data.content}`) // Nettoyer le sessionStorage sessionStorage.removeItem("newMessage") // Notification showNotification("info", `Conversation ouverte avec ${data.userName}`) } } else if (groupType === "group") { // Message de groupe const groupData = sessionStorage.getItem("newGroupMessage") if (groupData) { const data = JSON.parse(groupData) console.log("Nouveau message de groupe:", data) // Créer une nouvelle conversation de groupe const groupName = `Groupe (${data.users.length} membres)` setSelectedConversation("group-new") // Ajouter le message pré-rempli setNewMessage(`${data.subject ? `[${data.subject}] ` : ""}${data.content}`) // Nettoyer le sessionStorage sessionStorage.removeItem("newGroupMessage") // Notification showNotification("info", `Conversation de groupe créée avec ${data.users.length} utilisateur(s)`) } } } }, [userId, messageType, groupType]) const showNotification = (type: "success" | "error" | "info", message: string) => { // Implémenter la notification (peut utiliser toast ou état local) console.log(`${type.toUpperCase()}: ${message}`) } const conversations = [ { id: "1", name: "Marie Dubois", type: "direct", avatar: "MD", lastMessage: "Parfait, merci pour la validation !", lastMessageTime: "14:32", unreadCount: 0, isOnline: true, isTyping: false, }, { id: "2", name: "Équipe Juridique", type: "group", avatar: "EJ", lastMessage: "IA DocV: Analyse terminée pour Contrat_Client_ABC.pdf", lastMessageTime: "13:45", unreadCount: 1, isOnline: false, isTyping: false, members: 5, }, { id: "3", name: "Sophie Laurent", type: "direct", avatar: "SL", lastMessage: "Pouvez-vous m'envoyer le rapport ?", lastMessageTime: "12:20", unreadCount: 1, isOnline: false, isTyping: false, }, { id: "4", name: "Direction", type: "group", avatar: "DIR", lastMessage: "Réunion reportée à demain 10h", lastMessageTime: "11:15", unreadCount: 0, isOnline: false, isTyping: false, members: 3, }, { id: "5", name: "Thomas Rousseau", type: "direct", avatar: "TR", lastMessage: "Merci pour l'info !", lastMessageTime: "Hier", unreadCount: 0, isOnline: true, isTyping: true, }, ] const messages = [ { id: "1", senderId: "marie", senderName: "Marie Dubois", content: "Bonjour ! J'ai besoin de votre avis sur le nouveau contrat client.", timestamp: "14:20", type: "text", status: "read", }, { id: "2", senderId: "me", senderName: "Moi", content: "Bien sûr, pouvez-vous me l'envoyer ?", timestamp: "14:22", type: "text", status: "read", }, { id: "3", senderId: "marie", senderName: "Marie Dubois", content: "", timestamp: "14:25", type: "file", fileName: "Contrat_Client_ABC.pdf", fileSize: "2.3 MB", status: "read", }, { id: "4", senderId: "me", senderName: "Moi", content: "J'ai relu le contrat, tout me semble correct. Les clauses de confidentialité sont bien définies.", timestamp: "14:30", type: "text", status: "read", }, { id: "5", senderId: "marie", senderName: "Marie Dubois", content: "Parfait, merci pour la validation !", timestamp: "14:32", type: "text", status: "delivered", }, { id: "6", senderId: "ai", senderName: "IA DocV", content: `📄 **Analyse IA du document "Contrat_Client_ABC.pdf"** **Type de document :** PDF (2.3 MB) **Statut :** ✅ Validé **Dernière modification :** Il y a 2 heures **📊 Analyse du contenu :** • Document juridique détecté avec haute précision • 3 tag(s) identifié(s) : contrat, client, juridique • Résumé automatique disponible • 47 pages analysées • 12 clauses contractuelles détectées **🎯 Métriques de qualité :** • Lisibilité : 92% • Conformité juridique : 100% • Sécurité documentaire : Maximale • Complétude des informations : 95% **🔍 Points clés identifiés :** • Durée du contrat : 12 mois • Montant total : 150 000€ HT • Clauses de confidentialité : ✅ Présentes et conformes • Propriété intellectuelle : ✅ Bien définie • Conditions de résiliation : ✅ Équilibrées **🛡️ Analyse de conformité RGPD :** • Données personnelles : ⚠️ Détectées (coordonnées client) • Durée de conservation : Conforme (7 ans) • Droit à l'oubli : Applicable après expiration • Consentement : ✅ Explicite **⚡ Recommandations :** • ✅ Document prêt pour signature • 📋 Archivage permanent recommandé • 🔄 Révision suggérée dans 11 mois • 📧 Notification client automatique activée **📈 Score global : 94/100** *Analyse générée automatiquement par l'IA DocV - Fiabilité : 98%*`, timestamp: "14:35", type: "ai_analysis", status: "delivered", analysisType: "document", documentName: "Contrat_Client_ABC.pdf", confidence: 98, processingTime: "2.3s", }, { id: "7", senderId: "ai", senderName: "IA DocV", content: `🔍 **Analyse comparative - Dossier Contrats** **📊 Analyse de 8 documents similaires :** • Contrats clients : 5 documents • Avenants : 2 documents • Conditions générales : 1 document **📈 Tendances identifiées :** • Montant moyen des contrats : +15% vs trimestre précédent • Durée moyenne : 14 mois (stable) • Taux de renouvellement : 87% (↗️ +5%) **⚠️ Points d'attention :** • 2 contrats expirent dans les 30 jours • 1 clause de révision tarifaire à activer • Mise à jour RGPD requise sur 3 documents **🎯 Actions recommandées :** 1. Planifier renouvellement contrats Q1 2024 2. Standardiser les clauses de confidentialité 3. Créer un modèle basé sur ce contrat (performance optimale) *Analyse prédictive activée - Prochaine révision : 15 février 2024*`, timestamp: "14:37", type: "ai_analysis", status: "delivered", analysisType: "comparative", confidence: 95, processingTime: "4.1s", }, ] const filteredConversations = conversations.filter((conv) => conv.name.toLowerCase().includes(searchTerm.toLowerCase()), ) const currentConversation = conversations.find((conv) => conv.id === selectedConversation) const handleSendMessage = () => { if (newMessage.trim()) { // Ici on ajouterait la logique pour envoyer le message console.log("Sending message:", newMessage) setNewMessage("") } } const getStatusIcon = (status: string) => { switch (status) { case "sent": return case "delivered": return case "read": return default: return null } } const getAnalysisIcon = (analysisType: string) => { switch (analysisType) { case "document": return case "comparative": return case "security": return case "performance": return default: return } } const renderAIMessage = (message: any) => { return (
{/* AI Header */}
IA DocV {getAnalysisIcon(message.analysisType)} {message.analysisType === "document" ? "Analyse Document" : message.analysisType === "comparative" ? "Analyse Comparative" : "Analyse IA"} {message.confidence && ( {message.confidence}% fiable )}
{/* AI Message Content */}
{message.content}
{/* AI Message Footer */}
Traité en {message.processingTime}
{message.documentName && (
{message.documentName}
)}
{message.timestamp}
{getStatusIcon(message.status)}
) } return (
{/* Sidebar - Conversations */}
{/* Header */}

Messages

setSearchTerm(e.target.value)} className="pl-10" />
{/* Conversations List */}
{filteredConversations.map((conversation) => (
setSelectedConversation(conversation.id)} className={`p-4 border-b cursor-pointer hover:bg-gray-50 ${ selectedConversation === conversation.id ? "bg-blue-50 border-r-2 border-blue-500" : "" }`} >
{conversation.type === "group" ? ( ) : ( {conversation.avatar} )}
{conversation.isOnline && conversation.type === "direct" && ( )}

{conversation.name}

{conversation.lastMessageTime}

{conversation.isTyping ? ( En train d'écrire... ) : ( {conversation.lastMessage} )}

{conversation.unreadCount > 0 && ( {conversation.unreadCount} )}
{conversation.type === "group" && (

{conversation.members} membres

)}
))}
{/* Main Chat Area */}
{currentConversation ? ( <> {/* Chat Header */}
{currentConversation.type === "group" ? ( ) : ( {currentConversation.avatar} )}
{currentConversation.isOnline && currentConversation.type === "direct" && ( )}

{currentConversation.name}

{currentConversation.type === "group" ? `${currentConversation.members} membres` : currentConversation.isOnline ? "En ligne" : "Hors ligne"}

{/* Messages */}
{messages.map((message) => (
{message.type === "ai_analysis" ? ( renderAIMessage(message) ) : (
{message.type === "text" ? (

{message.content}

) : message.type === "file" ? (

{message.fileName}

{message.fileSize}

) : null}
{message.timestamp} {message.senderId === "me" &&
{getStatusIcon(message.status)}
}
)}
))}
{/* Message Input */}