import { useCallback, useState } from 'react' import { useNavigate } from 'react-router-dom' import { Loading, ErrorState } from '../../../components/PageState.jsx' import { useAsync } from '../../../lib/useAsync.js' import { dateTime } from '../../../lib/format.js' import { api } from '../../../api/client.js' import UserEditor from './UserEditor.jsx' const ROLE_BADGE = { admin: 'badge-admin', editor: 'badge-editor', moderator: 'badge-moderator', player: 'badge-player', } export default function UsersAdmin() { const navigate = useNavigate() const [tick, setTick] = useState(0) const reload = useCallback(() => setTick((t) => t + 1), []) const { loading, error, data } = useAsync(() => api.admin.listUsers(), [tick]) const [editing, setEditing] = useState(null) // null | 'new' | user const users = data || [] return (

Manage admin, editor, moderator, and player accounts

{loading && } {error && } {!loading && !error && (
{users.map((u) => ( ))}
Username Role Status Last login
{u.username} {u.role} {u.status || 'active'} {u.last_login_at ? dateTime(u.last_login_at) : 'never'} navigate(`/admin/users/${u.id}`)}> View setEditing(u)}> Edit
)} {editing && ( setEditing(null)} onSaved={() => { setEditing(null) reload() }} /> )}
) }