import { arktypeResolver } from "@hookform/resolvers/arktype"; import { useMutation } from "@tanstack/react-query"; import { type } from "arktype"; import { useForm } from "react-hook-form"; import { useNavigate } from "react-router"; import { toast } from "sonner"; import { AuthLayout } from "~/client/components/auth-layout"; import { Button } from "~/client/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "~/client/components/ui/form"; import { Input } from "~/client/components/ui/input"; import { authMiddleware } from "~/middleware/auth"; import type { Route } from "./+types/login"; import { loginMutation } from "~/client/api-client/@tanstack/react-query.gen"; export const clientMiddleware = [authMiddleware]; export function meta(_: Route.MetaArgs) { return [ { title: "Zerobyte - Login" }, { name: "description", content: "Sign in to your Zerobyte account.", }, ]; } const loginSchema = type({ username: "2<=string<=50", password: "string>=1", }); type LoginFormValues = typeof loginSchema.inferIn; export default function LoginPage() { const navigate = useNavigate(); const form = useForm({ resolver: arktypeResolver(loginSchema), defaultValues: { username: "", password: "", }, }); const login = useMutation({ ...loginMutation(), onSuccess: async (data) => { if (data.user && !data.user.hasDownloadedResticPassword) { navigate("/download-recovery-key"); } else { navigate("/volumes"); } }, onError: (error) => { console.error(error); toast.error("Login failed", { description: error.message }); }, }); const onSubmit = (values: LoginFormValues) => { login.mutate({ body: { username: values.username.trim(), password: values.password.trim(), }, }); }; return (
( Username )} /> (
Password
)} />
); }