'use client'; import { useState, useEffect } from 'react'; import useSWR from 'swr'; import AlertModal from './AlertModal'; interface User { id: string; email: string; name: string | null; } interface NewConversationModalProps { onClose: () => void; onConversationCreated: (conversationId: string) => void; } const fetcher = (url: string) => fetch(url).then((res) => res.json()); export default function NewConversationModal({ onClose, onConversationCreated, }: NewConversationModalProps) { const [search, setSearch] = useState(''); const [selectedUsers, setSelectedUsers] = useState([]); const [conversationType, setConversationType] = useState<'direct' | 'group'>('direct'); const [groupName, setGroupName] = useState(''); const [isCreating, setIsCreating] = useState(false); const [alertModal, setAlertModal] = useState<{ show: boolean; type: 'success' | 'error' | 'info' | 'warning'; title: string; message: string; } | null>(null); // Récupérer l'utilisateur actuel const { data: currentUser } = useSWR('/api/auth/me', fetcher); const { data: users, error } = useSWR( search ? `/api/users?search=${encodeURIComponent(search)}` : '/api/users', fetcher ); // Filtrer l'utilisateur actuel de la liste des utilisateurs const availableUsers = users?.filter((user) => user.id !== currentUser?.id) || []; const handleUserToggle = (userId: string) => { if (selectedUsers.includes(userId)) { setSelectedUsers(selectedUsers.filter((id) => id !== userId)); } else { setSelectedUsers([...selectedUsers, userId]); } }; const handleCreate = async () => { if (selectedUsers.length === 0) { setAlertModal({ show: true, type: 'warning', title: 'Sélection requise', message: 'Veuillez sélectionner au moins un utilisateur', }); return; } if (conversationType === 'group' && !groupName.trim()) { setAlertModal({ show: true, type: 'warning', title: 'Nom requis', message: 'Veuillez entrer un nom pour le groupe', }); return; } setIsCreating(true); try { const response = await fetch('/api/conversations', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ participantIds: selectedUsers, type: conversationType, name: conversationType === 'group' ? groupName : null, }), }); if (response.ok) { const conversation = await response.json(); onConversationCreated(conversation.id); } else { const error = await response.json(); setAlertModal({ show: true, type: 'error', title: 'Erreur', message: error.error || 'Erreur lors de la création de la conversation', }); } } catch (error) { console.error('Erreur:', error); setAlertModal({ show: true, type: 'error', title: 'Erreur', message: 'Erreur lors de la création de la conversation', }); } finally { setIsCreating(false); } }; return (

Nouvelle conversation

{/* Type de conversation */}
{/* Nom du groupe */} {conversationType === 'group' && (
setGroupName(e.target.value)} placeholder="Entrez le nom du groupe" className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-lblue focus:border-transparent" />
)} {/* Recherche d'utilisateurs */}
setSearch(e.target.value)} placeholder="Rechercher par nom ou email..." className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-lblue focus:border-transparent" />
{/* Liste des utilisateurs */}
{error && (
Erreur lors du chargement des utilisateurs
)} {!users && !error && (
Chargement...
)} {availableUsers.length === 0 && users && (
Aucun utilisateur trouvé
)} {availableUsers.length > 0 && (
{availableUsers.map((user) => ( ))}
)}
{/* Utilisateurs sélectionnés */} {selectedUsers.length > 0 && (
{selectedUsers.length} utilisateur{selectedUsers.length > 1 ? 's' : ''} sélectionné{selectedUsers.length > 1 ? 's' : ''}
)}
{/* Modal d'alerte */} {alertModal && ( setAlertModal(null)} /> )}
); }