import React, { useState, useEffect } from 'react'; import { userApi } from '../api/users'; import LoadingCard from '@/components/LoadingCard'; import MainCard from '@/components/MainCard'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Input } from '@/components/ui/input'; import { CardContent } 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 } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { useAuth } from '../context/useAuth'; import { Users} from 'lucide-react'; const AdminUsersPage = () => { const { user: currentUser } = 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 => String(user.id) !== String(userId))); } catch (err) { setError(err.message); console.error(err); } }; const handleMakeAdmin = async (userId) => { try { await userApi.promoteUser(userId); window.location.reload(); } catch (err) { setError(err.message); 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 payload = { ...editForm }; if (!currentUser.is_superuser) delete payload.is_superuser; await userApi.updateUser(userId, payload); window.location.reload(); } catch (err) { setError(err.message); console.error(err); } }; if (loading) { return ( ); } return ( {error && ( {error} )}
{inviteLink && ( <>
)}
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, }); } }} > Modifier l'utilisateur {error && {error}}
setEditForm({ ...editForm, first_name: event.target.value, }) } />
setEditForm({ ...editForm, last_name: event.target.value, }) } />
setEditForm({ ...editForm, email: event.target.value, }) } />
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" />

Le mot de passe ne peut pas être modifié ici.

{!user.is_admin && ( handleMakeAdmin(user.id)} > )} handleDeleteUser(user.id)} >
))}
); }; export default AdminUsersPage;