"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { LoginResponse } from "@server/routers/auth"; import { useRouter } from "next/navigation"; import { AxiosResponse } from "axios"; import { formatAxiosError } from "@app/lib/utils"; import { LockIcon } from "lucide-react"; import { createApiClient } from "@app/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from "./ui/input-otp"; import Link from "next/link"; type LoginFormProps = { redirect?: string; onLogin?: () => void; }; const formSchema = z.object({ email: z.string().email({ message: "Invalid email address" }), password: z .string() .min(8, { message: "Password must be at least 8 characters" }) }); const mfaSchema = z.object({ code: z.string().length(6, { message: "Invalid code" }) }); export default function LoginForm({ redirect, onLogin }: LoginFormProps) { const router = useRouter(); const api = createApiClient(useEnvContext()); const [error, setError] = useState(null); const [loading, setLoading] = useState(false); const [mfaRequested, setMfaRequested] = useState(false); const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { email: "", password: "" } }); const mfaForm = useForm>({ resolver: zodResolver(mfaSchema), defaultValues: { code: "" } }); async function onSubmit(values: any) { const { email, password } = form.getValues(); const { code } = mfaForm.getValues(); setLoading(true); const res = await api .post>("/auth/login", { email, password, code }) .catch((e) => { console.error(e); setError( formatAxiosError(e, "An error occurred while logging in") ); }); if (res) { setError(null); const data = res.data.data; console.log(data); if (data?.codeRequested) { setMfaRequested(true); setLoading(false); mfaForm.reset(); return; } if (data?.emailVerificationRequired) { if (redirect) { router.push(`/auth/verify-email?redirect=${redirect}`); } else { router.push("/auth/verify-email"); } return; } if (onLogin) { await onLogin(); } } setLoading(false); } return (
{!mfaRequested && (
( Email )} />
( Password )} />
Forgot password? Click here
{error && ( {error} )} )} {mfaRequested && (
( Authenticator Code
)} /> {error && ( {error} )}
)}
); }