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

Utilisateurs

setQuery(e.target.value)}/> {error &&

{error}

} {busy?:
{record.users.map(user=>)}
UtilisateurIdentifiantE-mailEspace attribuéStatutActions
{[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 && <> }
{!record.users.length &&

Aucun utilisateur.

}
} {record.limited &&

200 résultats affichés. Précise la recherche.

}
{if(!open&&!accessBusy)setAccessUser(null)}}> Accès de @{accessUser?.username} Retirer l’accès à un espace partagé sans supprimer cet espace. {accessError &&

{accessError}

} {accessBusy && }
{accesses.map(access=>
{access.space_name}
{access.kind==='grant'?'Accès attribué':access.kind==='owner'?'Espace attribué':'Gestionnaire'}
)} {!accessBusy && !accesses.length &&

Aucun accès à un espace partagé.

}
{if(!open)close()}}> Supprimer l’utilisateur Le compte sera désactivé. Son espace privé et tous ses fichiers seront définitivement supprimés.
{deleteError &&

{deleteError}

}
}