implemented

This commit is contained in:
counterweight 2025-12-20 23:06:05 +01:00
parent a31bd8246c
commit d3638e2e69
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
18 changed files with 1643 additions and 120 deletions

View file

@ -5,19 +5,15 @@ import { api } from "../api";
import { sharedStyles } from "../styles/shared";
import { Header } from "../components/Header";
import { useRequireAuth } from "../hooks/useRequireAuth";
import { components } from "../generated/api";
import constants from "../../../shared/constants.json";
interface Invite {
id: number;
identifier: string;
status: string;
used_by_email: string | null;
created_at: string;
spent_at: string | null;
}
// Use generated type from OpenAPI schema
type Invite = components["schemas"]["UserInviteResponse"];
export default function InvitesPage() {
const { user, isLoading, isAuthorized } = useRequireAuth({
requiredRole: "regular",
requiredRole: constants.roles.REGULAR,
fallbackRedirect: "/audit",
});
const [invites, setInvites] = useState<Invite[]>([]);
@ -71,9 +67,10 @@ export default function InvitesPage() {
return null;
}
const readyInvites = invites.filter((i) => i.status === "ready");
const spentInvites = invites.filter((i) => i.status === "spent");
const revokedInvites = invites.filter((i) => i.status === "revoked");
const { READY, SPENT, REVOKED } = constants.inviteStatuses;
const readyInvites = invites.filter((i) => i.status === READY);
const spentInvites = invites.filter((i) => i.status === SPENT);
const revokedInvites = invites.filter((i) => i.status === REVOKED);
return (
<main style={styles.main}>