import { zodResolver } from "@hookform/resolvers/zod"; import { HomeSimpleDoor, LogIn, UserPlus } from "iconoir-react"; 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, login } from "../lib/auth.server"; import { loginSchema, type LoginSchema } from "../lib/schemas"; import type { Route } from "./+types/login"; export function meta({}: Route.MetaArgs) { return [{ title: "Login | 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 = 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." }; } } export default function Login({ actionData }: Route.ComponentProps) { const navigation = useNavigation(); const submit = useSubmit(); const isSubmitting = navigation.state === "submitting"; const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema) }); const onSubmit = handleSubmit((data) => { submit(data, { method: "post" }); }); useEffect(() => { if (actionData?.error) { showErrorToast(actionData.error); } }, [actionData?.error]); return (

Sign in to your Biergarten account

{actionData?.error && (
{actionData.error}
)}
New here?
); }