import { FormEvent, useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { api } from "../api/client"; import { describeApiError, type ApiErrorInfo } from "../api/errorMessages"; import type { Role, UserRecord } from "../api/types"; import { useAuth } from "../context/AuthContext"; import { ApiErrorNotice, LoadingState, PageHeader } from "../components/PageChrome"; export function Users() { const { t } = useTranslation(["operations", "errors"]); const { user: currentUser } = useAuth(); const [users, setUsers] = useState(null); const [displayName, setDisplayName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [role, setRole] = useState("rental_employee"); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const load = useCallback(() => { api.get("/api/v1/users").then(setUsers).catch((err) => setError(describeApiError(t, err))); }, [t]); useEffect(load, [load]); async function create(event: FormEvent) { event.preventDefault(); setSaving(true); setError(null); try { await api.post("/api/v1/users", { email, display_name: displayName, password, role }); setDisplayName(""); setEmail(""); setPassword(""); setRole("rental_employee"); load(); } catch (err) { setError(describeApiError(t, err, "operations:users.createFailed")); } finally { setSaving(false); } } async function toggleActive(record: UserRecord) { setError(null); try { await api.patch(`/api/v1/users/${record.public_ref}`, { active: !record.active }); load(); } catch (err) { setError(describeApiError(t, err, "operations:users.updateFailed")); } } return

{t("users.addTitle")}

{!users && } {users &&
{users.map((record) => )}
{t("users.title")}
{t("users.name")}{t("users.email")}{t("users.role")}{t("users.status")}{t("users.action")}
{record.display_name}{record.public_ref}{record.email ?? "—"}{t(`roles.${record.role}`)}{t(record.active ? "users.active" : "users.inactive")}
}
; }