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 { useShallow } from "zustand/react/shallow"; import { PasswordInput } from "~/components/custom-ui/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 "~/stores/token-store"; import { useUsersStore } from "~/stores/users-store"; 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() { const navigate = useNavigate(); const setToken = useTokenStore((state) => state.setToken); const { setCurrentUserId, addUser } = useUsersStore( useShallow((state) => { return { setCurrentUserId: state.setCurrentUserId, addUser: state.addUser, }; }), ); const form = useForm>({ resolver: zodResolver(schema), }); async function onSubmit(values: z.infer) { const response = await auth.login(values); setToken(response.token); setCurrentUserId(response.user.id); addUser(response.user); navigate("/app"); } return ( Welcome back! Please sign in to continue.
( Username )} /> ( Password )} />
Don't have an account? Register
); }