import { useEffect, useState } from "react"; import { useAuth } from "../context/AuthContext"; import { fetchUsers, type UserListItem } from "../api"; import { useDocumentTitle } from "../hooks/useDocumentTitle"; import ConfirmModal from "../components/ConfirmModal"; import styles from "./AdminUsers.module.css"; export default function AdminUsers() { useDocumentTitle("Users — Admin"); const { token, startImpersonation, user: currentUser } = useAuth(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [impersonating, setImpersonating] = useState(null); const [editTarget, setEditTarget] = useState(null); useEffect(() => { if (!token) return; setLoading(true); fetchUsers(token) .then(setUsers) .catch((e) => setError(e.message || "Failed to load users")) .finally(() => setLoading(false)); }, [token]); async function handleViewAs(userId: string) { setImpersonating(userId); try { await startImpersonation(userId); } catch (e: any) { setError(e.message || "Failed to start impersonation"); setImpersonating(null); } } async function handleEditAsConfirm() { if (!editTarget) return; setEditTarget(null); setImpersonating(editTarget.id); try { await startImpersonation(editTarget.id, true); } catch (e: any) { setError(e.message || "Failed to start write-mode impersonation"); setImpersonating(null); } } if (loading) { return (

Users

Loading users…

); } if (error) { return (

Users

{error}

); } return (

Users

{users.length === 0 ? (

No users found.

) : ( {users.map((u) => ( ))}
Name Email Role Actions
{u.display_name} {u.email} {u.role} {u.role === "creator" && u.id !== currentUser?.id && (
)}
)} setEditTarget(null)} />
); }