'use client' import * as React from 'react' import type { FieldErrors } from 'react-hook-form' import { authClient } from '@admin/auth/client' import { Button } from '@admin/components/ui/button' import { Card, CardContent } from '@admin/components/ui/card' import { Field, FieldGroup, FieldLabel } from '@admin/components/ui/field' import { Form } from '@admin/components/ui/form' import { Input } from '@admin/components/ui/input' import { Spinner } from '@admin/components/ui/spinner' import { getAdminPostLoginPath } from '@admin/utils/auth/get-admin-post-login-path' import { cn } from '@admin/utils/shared/cn' import { standardSchemaResolver } from '@hookform/resolvers/standard-schema' import Image from 'next/image' import Link from 'next/link' import { useRouter } from 'next/navigation' import { parseAsStringLiteral, useQueryState } from 'nuqs' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { z } from 'zod/v3' const loginSchema = z.object({ email: z.string().trim().min(1, 'Email is required').email('Enter a valid email address'), password: z.string().min(1, 'Password is required') }) type LoginFormValues = z.infer export function LoginForm({ className, ...props }: React.ComponentProps<'div'>) { const router = useRouter() const [reset] = useQueryState('reset', parseAsStringLiteral(['success'])) const [isPending, startTransition] = React.useTransition() const form = useForm({ resolver: standardSchemaResolver(loginSchema), defaultValues: { email: '', password: '' }, mode: 'onChange', reValidateMode: 'onChange' }) React.useEffect(() => { if (reset === 'success') { toast.success('Password reset. Sign in with your new password.', { id: 'admin-login-password-reset-success' }) } }, [reset]) const handleSubmit = (values: LoginFormValues) => { startTransition(async () => { try { const result = await authClient.signIn.email({ email: values.email, password: values.password }) if (result.error) { toast.error(result.error.message || 'Invalid email or password') return } const user = result.data?.user const role = user && typeof user === 'object' && 'role' in user ? user.role : undefined router.replace(getAdminPostLoginPath(role)) router.refresh() } catch { toast.error('Failed to sign you in. Try again.') } }) } const handleInvalid = (errors: FieldErrors) => { const message = errors.email?.message ?? errors.password?.message toast.error(typeof message === 'string' ? message : 'Please check your sign-in details.') } return (

Sign In

Email
Password Forgot password?
) }