remix-demo
react router (remix) demo
git clone https://9o.is/git/remix-demo.git
index.tsx
(1481B)
1 import type { ActionArgs, LoaderArgs, MetaFunction } from "@remix-run/server-runtime";
2 import { json, redirect } from "@remix-run/server-runtime";
3 import Form from "~/components/forms/Form";
4 import Input from "~/components/forms/Input";
5 import PrimaryButton from "~/components/forms/PrimaryButton";
6 import Heading from "~/components/Heading";
7 import CenteredLayout from "~/components/layouts/CenteredLayout";
8 import { inviteUser } from "~/controllers/userInvite.server";
9 import { userInviteValidator } from "~/schemas/userInvite";
10 import { requireUserId } from "~/session.server";
11
12 export const meta: MetaFunction = () => ({
13 title: "User Invite | Calories Counter",
14 });
15
16 export async function action({ request }: ActionArgs) {
17 const response = await inviteUser(request);
18 if (response.ok) return redirect("/invite/success");
19 else return response;
20 }
21
22 export async function loader({ request }: LoaderArgs) {
23 await requireUserId(request);
24 return json({});
25 }
26
27 export default function InviteIndex() {
28 return (
29 <section>
30 <CenteredLayout>
31 <Heading>Invite User</Heading>
32 <Form method="post" validator={userInviteValidator} autoComplete="off">
33 <Input required name="name" label="Name" type="text" />
34 <Input required name="email" label="Email" type="email" />
35 <PrimaryButton type="submit" className="w-full">
36 Invite User
37 </PrimaryButton>
38 </Form>
39 </CenteredLayout>
40 </section>
41 );
42 }