import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { Link, redirect, useNavigation, useSubmit } from "react-router"; import { createAuthSession, getOptionalAuth, register, } from "../lib/auth.server"; import { registerSchema, type RegisterSchema } from "../lib/schemas"; import type { Route } from "./+types/register"; export function meta({}: Route.MetaArgs) { return [{ title: "Register | The Biergarten App" }]; } export async function loader({ request }: Route.LoaderArgs) { const auth = await getOptionalAuth(request); if (auth) throw redirect("/dashboard"); return null; } export async function action({ request }: Route.ActionArgs) { const formData = await request.formData(); const result = registerSchema.safeParse({ username: formData.get("username"), firstName: formData.get("firstName"), lastName: formData.get("lastName"), email: formData.get("email"), dateOfBirth: formData.get("dateOfBirth"), password: formData.get("password"), confirmPassword: formData.get("confirmPassword"), }); if (!result.success) { const fieldErrors = result.error.flatten().fieldErrors; return { error: null, fieldErrors }; } try { const { confirmPassword: _, ...body } = result.data; const payload = await register(body); return createAuthSession(payload, "/dashboard"); } catch (err) { return { error: err instanceof Error ? err.message : "Registration failed.", fieldErrors: null, }; } } export default function Register({ actionData }: Route.ComponentProps) { const navigation = useNavigation(); const submit = useSubmit(); const isSubmitting = navigation.state === "submitting"; const { register: field, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(registerSchema) }); const onSubmit = handleSubmit((data) => { submit(data, { method: "post" }); }); return (

Register

Create your Biergarten account

{actionData?.error && (
{actionData.error}
)}
Username {errors.username ? (

{errors.username.message}

) : (

3-64 characters, alphanumeric and . _ -

)}
First Name {errors.firstName && (

{errors.firstName.message}

)}
Last Name {errors.lastName && (

{errors.lastName.message}

)}
Email {errors.email && (

{errors.email.message}

)}
Date of Birth {errors.dateOfBirth ? (

{errors.dateOfBirth.message}

) : (

Must be 19 years or older

)}
Password {errors.password ? (

{errors.password.message}

) : (

8+ chars: uppercase, lowercase, digit, special character

)}
Confirm Password {errors.confirmPassword && (

{errors.confirmPassword.message}

)}
Already have an account?
Sign in ← Back to home
); }