import { zodResolver } from '@hookform/resolvers/zod'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { Link, redirect, useNavigation, useSubmit } from 'react-router'; import FormField from '../components/forms/FormField'; import SubmitButton from '../components/forms/SubmitButton'; import { showErrorToast } from '../components/toast/toast'; 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 body = { username: result.data.username, firstName: result.data.firstName, lastName: result.data.lastName, email: result.data.email, dateOfBirth: result.data.dateOfBirth, password: result.data.password, }; 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' }); }); useEffect(() => { if (actionData?.error) { showErrorToast(actionData.error); } }, [actionData?.error]); return (

Register

Create your Biergarten account

{actionData?.error && (
{actionData.error}
)}
Already have an account?
Sign in ← Back to home
); }