"use client"; import { useState } from "react"; import { signIn } from "next-auth/react"; import { useRouter, useSearchParams } from "next/navigation"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Eye, EyeOff, LogIn } from "lucide-react"; const loginSchema = z.object({ email: z.string().email("Invalid email address"), password: z.string().min(1, "Password is required"), }); type LoginFormValues = z.infer; export default function LoginPage() { const router = useRouter(); const searchParams = useSearchParams(); const callbackUrl = searchParams.get("callbackUrl") ?? "/dashboard"; const [showPassword, setShowPassword] = useState(false); const [authError, setAuthError] = useState(null); const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(loginSchema), }); const onSubmit = async (data: LoginFormValues) => { setAuthError(null); const result = await signIn("credentials", { email: data.email, password: data.password, redirect: false, }); if (result?.error) { setAuthError("Invalid email or password"); return; } router.push(callbackUrl); router.refresh(); }; return ( Sign in
{errors.email && (

{errors.email.message}

)}
{errors.password && (

{errors.password.message}

)}
{authError && (

{authError}

)}
); }