g1t/apps/web/app/routes/settings/invites.tsx

34 lines1,273 bytesCodeBlame
1import type { Route } from "./+types/invites";
2import { page } from "../../lib/meta";
3import { assertSameOrigin, requireUser } from "../../lib/session.server";
4import { InvitesSection } from "../../components/invites-section";
5import { inviteAction, loadInvites } from "../../lib/invites.server";
6
7export function meta(args: Route.MetaArgs) {
8 return page(args, { title: "Invites · Settings · g1t" });
9}
10
11export async function loader({ request, context }: Route.LoaderArgs) {
12 const user = requireUser(context, request);
13 return { invites: await loadInvites(user), origin: new URL(request.url).origin };
14}
15
16export async function action({ request, context }: Route.ActionArgs) {
17 assertSameOrigin(request);
18 const user = requireUser(context, request);
19 const form = await request.formData();
20 // Making and revoking invites (lib/invites.server.ts).
21 const done = await inviteAction(user, form);
22 return { inviteCreated: done?.inviteCreated, inviteError: done?.inviteError };
23}
24
25export default function InviteSettings({ loaderData, actionData }: Route.ComponentProps) {
26 return (
27 <InvitesSection
28 overview={loaderData.invites}
29 origin={loaderData.origin}
30 created={actionData?.inviteCreated}
31 error={actionData?.inviteError}
32 />
33 );
34}