import { zodResolver } from "@hookform/resolvers/zod"; import { AxiosError } from "axios"; import { useForm } from "react-hook-form"; import { Link, redirect, useNavigate } from "react-router"; import { z } from "zod"; import { PasswordInput } from "~/components/password-input"; import { ThemeToggle } from "~/components/theme/theme-toggle"; import { Button, buttonVariants } from "~/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "~/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "~/components/ui/form"; import { Input } from "~/components/ui/input"; import auth from "~/lib/api/client/auth"; import { useTokenStore } from "~/store/token"; import { useUserStore } from "~/store/user"; const schema = z.object({ username: z.string(), password: z.string().min(8), }); export async function clientLoader() { const { token, setToken } = useTokenStore.getState() if (token) { try { await import("~/lib/api/client/user").then(m => m.default.me()) return redirect("/app/@me") } catch (error) { const axiosError = error as AxiosError if (axiosError.status === 401) { setToken(undefined) } } } } export default function Login() { let navigate = useNavigate() let setToken = useTokenStore(state => state.setToken) let setUser = useUserStore(state => state.setUser) const form = useForm>({ resolver: zodResolver(schema), }) async function onSubmit(values: z.infer) { const response = await auth.login(values) setToken(response.token) setUser(response.user) navigate("/app") } return ( Welcome back! Please sign in to continue.
( Username )} /> ( Password )} />
Don't have an account? Register
); }