import { zodResolver } from '@hookform/resolvers/zod'; import { LogIn } from 'iconoir-react'; import { useForm } from 'react-hook-form'; import { redirect, useNavigation, useSubmit } from 'react-router'; import { createAuthSession, getOptionalAuth, login } from '../auth.server'; import LoginForm from '../components/LoginForm'; import RegisterCallout from '../components/RegisterCallout'; import { useActionErrorToast } from '../hooks/useActionErrorToast'; import { loginSchema, type LoginSchema } from '../schemas'; import type { Route } from './+types/login'; export const meta = ({}: Route.MetaArgs) => { return [{ title: 'Login | The Biergarten App' }]; }; export const loader = async ({ request }: Route.LoaderArgs) => { const auth = await getOptionalAuth(request); if (auth) throw redirect('/dashboard'); return null; }; export const action = async ({ request }: Route.ActionArgs) => { const formData = await request.formData(); const result = loginSchema.safeParse({ username: formData.get('username'), password: formData.get('password'), }); if (!result.success) { return { error: result.error.issues[0].message }; } try { const payload = await login(result.data.username, result.data.password); return createAuthSession(payload, '/dashboard'); } catch (err) { return { error: err instanceof Error ? err.message : 'Login failed.' }; } }; const Login = ({ actionData }: Route.ComponentProps) => { const navigation = useNavigation(); const submit = useSubmit(); const isSubmitting = navigation.state === 'submitting'; const { register, handleSubmit, formState } = useForm({ resolver: zodResolver(loginSchema), }); const onSubmit = handleSubmit((data) => { submit(data, { method: 'post' }); }); useActionErrorToast(actionData?.error); return (

Sign in to your Biergarten account

{actionData?.error && (
{actionData.error}
)}
); }; export default Login;