import { useCallback, useEffect, useState } from 'react' import { Users, LoaderCircle, Trash2, KeyRound } from 'lucide-react' import { Input } from '@/components/ui/input' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { drive, message } from '@/api/client' export default function AdminUsersPage(){ const [query,setQuery] = useState('') const [record,setRecord] = useState({users:[]}) const [busy,setBusy] = useState(true) const [error,setError] = useState('') const [selected,setSelected] = useState(null) const [accessUser,setAccessUser] = useState(null) const [accesses,setAccesses] = useState([]) const [accessBusy,setAccessBusy] = useState(false) const [accessError,setAccessError] = useState('') const [confirmation,setConfirmation] = useState('') const [deleting,setDeleting] = useState(false) const [deleteError,setDeleteError] = useState('') const [revision,setRevision] = useState(0) const refresh=useCallback(()=>setRevision(n=>n+1),[]) useEffect(()=>{ let active=true const timer=setTimeout(async()=>{ setBusy(true) try {const data=await drive.adminUsers(query);if(active){setRecord(data);setError('')}} catch(e){if(active)setError(message(e))} finally{if(active)setBusy(false)} },query?300:0) return ()=>{active=false;clearTimeout(timer)} },[query,revision]) const close=()=>{if(!deleting){setSelected(null);setConfirmation('');setDeleteError('')}} const openAccesses=async user=>{ setAccessUser(user);setAccesses([]);setAccessError('');setAccessBusy(true) try {setAccesses(await drive.adminUserAccess(user.id))} catch(e){setAccessError(message(e))} finally{setAccessBusy(false)} } const revokeAccess=async access=>{ if(!accessUser || !window.confirm(`Retirer l’accès à « ${access.space_name} » pour @${accessUser.username} ?`))return setAccessBusy(true);setAccessError('') try{ await drive.revokeUserAccess(accessUser.id,access.kind,access.space_id) setAccesses(await drive.adminUserAccess(accessUser.id));refresh() }catch(e){setAccessError(message(e))} finally{setAccessBusy(false)} } const remove=async(event)=>{ event.preventDefault() if(!selected||deleting||confirmation!==selected.username)return setDeleting(true);setDeleteError('') try{await drive.adminDeleteUser(selected.id,confirmation);setSelected(null);setConfirmation('');refresh()} catch(e){setDeleteError(message(e))} finally{setDeleting(false)} } return
{error}
} {busy?| Utilisateur | Identifiant | Espace attribué | Statut | Actions | |
|---|---|---|---|---|---|
| {[user.first_name,user.last_name].filter(Boolean).join(' ') || '—'} | @{user.username} | {user.email||'—'} | {user.space_name||'—'} | {user.is_active?'Actif':'Désactivé'}{user.is_admin?' · Admin':''} | {!user.is_admin && <>
>} |
Aucun utilisateur.
}200 résultats affichés. Précise la recherche.
}