import React, { useState, useEffect } from 'react'; import { userApi } from '../api/users'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { Checkbox } from '@/components/ui/checkbox'; import ConfirmDialog from '@/components/ConfirmDialog'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { useAuth } from '../context/useAuth'; const AdminUsersPage = () => { const { currentUser, logout } = useAuth(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [inviteLink, setInviteLink] = useState(''); const [isCopied, setIsCopied] = useState(false); const [editingUser, setEditingUser] = useState(null); const [editForm, setEditForm] = useState({ first_name: '', last_name: '', email: '', color: '#0000ff', is_active: true, is_staff: false, is_superuser: false, }); const generateInviteLink = async () => { try { setError(''); const invitation = await userApi.createInvitation(); const newInviteLink = `${window.location.origin}/register?invite=${invitation.token}`; setInviteLink(newInviteLink); setIsCopied(false); } catch (error) { setError('Erreur lors de la génération du lien d\'invitation'); console.error(error); } }; const copyToClipboard = () => { if (inviteLink) { navigator.clipboard.writeText(inviteLink).then(() => { setIsCopied(true); setTimeout(() => setIsCopied(false), 2000); }).catch((error) => { setError('Impossible de copier le lien.'); console.error(error); }); } }; useEffect(() => { const loadUsers = async () => { try { setLoading(true); const users = await userApi.getUsers(); setUsers(users); } catch (requestError) { setError('Erreur lors du chargement des utilisateurs'); console.error(requestError); } finally { setLoading(false); } }; loadUsers(); }, []); const handleDeleteUser = async (userId) => { try { await userApi.deleteUser(userId); setUsers(users.filter(user => user.id !== userId)); if(userId===currentUser.id){ logout(); } } catch (err) { setError('Erreur lors de la suppression de l\'utilisateur'); console.error(err); } }; const handleMakeAdmin = async (userId) => { // Remplacer window.confirm par le composant ConfirmDialog const confirmed = await new Promise((resolve) => { resolve(true); // On résout directement pour l'exemple }); if (!confirmed) { return; } try { await userApi.promoteUser(userId); setUsers(users.map(user => user.id === userId ? { ...user, is_admin: true } : user )); } catch (err) { setError('Erreur lors de la promotion de l\'utilisateur'); console.error(err); } }; const handleEditUser = async (userId) => { if (!/^#[0-9A-Fa-f]{6}$/.test(editForm.color)) { setError('La couleur doit être au format hexadécimal, par exemple #2563eb.'); return; } try { const updatedUser = await userApi.updateUser(userId, editForm); const updatedUsers = users.map(user => user.id === userId ? updatedUser : user ); setUsers(updatedUsers); setEditingUser(null); setEditForm({ first_name: '', last_name: '', email: '', color: '#0000ff', is_active: true, is_staff: false, is_superuser: false, }); } catch (err) { setError('Erreur lors de la mise à jour de l\'utilisateur'); console.error(err); } }; if (loading) { return ( Gestion des comptes Chargement des utilisateurs... ); } return ( Gestion des comptes {error && ( {error} )} Nom Couleur Rôle Inscrit le Actions {users.map((user) => ( {user.first_name} {user.last_name} {user.color || 'Bleu'} {user.is_admin ? 'Administrateur' : 'Utilisateur'} {new Date(user.date_joined).toLocaleDateString('fr-FR')} { if (!open) { setEditingUser(null); } else { setEditingUser(user.id); setEditForm({ first_name: user.first_name || '', last_name: user.last_name || '', email: user.email || '', color: user.color || '#0000ff', is_active: user.is_active, is_staff: user.is_staff || user.is_admin, is_superuser: user.is_superuser, }); } }}> setEditingUser(user.id)}> Éditer Modifier l'utilisateur Prénom setEditForm({ ...editForm, first_name: event.target.value })} /> Nom setEditForm({ ...editForm, last_name: event.target.value })} /> E-mail setEditForm({ ...editForm, email: event.target.value })} /> Couleur setEditForm({ ...editForm, color: event.target.value })} className="h-10 w-14 cursor-pointer p-1" /> setEditForm({ ...editForm, color: event.target.value })} className="max-w-36 font-mono uppercase" /> setEditForm({ ...editForm, is_active: checked })} /> Compte actif setEditForm({ ...editForm, is_staff: checked, is_superuser: checked ? editForm.is_superuser : false, })} /> Administrateur Le mot de passe ne peut pas être modifié ici. handleEditUser(user.id)}> Sauvegarder {!user.is_admin && ( handleMakeAdmin(user.id)} > Promouvoir )} handleDeleteUser(user.id)} > Supprimer ))} {inviteLink ? ( Inviter un utilisateur {isCopied ? 'Copié!' : 'Copier'} ) : ( Inviter un utilisateur )} ); }; export default AdminUsersPage;
Chargement des utilisateurs...
Le mot de passe ne peut pas être modifié ici.