import { cn } from '@/lib/utils'; import { Eye, EyeOff } from 'lucide-react'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { ClientError } from '@chainlit/react-client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import Translator, { useTranslation } from 'components/i18n/Translator'; import Alert from './Alert'; import { ProviderButton } from './ProviderButton'; interface Props { error?: string; providers: string[]; callbackUrl: string; onPasswordSignIn?: ( email: string, password: string, callbackUrl: string ) => Promise; onOAuthSignIn?: (provider: string, callbackUrl: string) => Promise; } interface FormValues { email: string; password: string; } export function LoginForm({ providers, onPasswordSignIn, onOAuthSignIn, callbackUrl, error }: Props) { const [loading, setLoading] = useState(false); const [errorState, setErrorState] = useState(error); const [showPassword, setShowPassword] = useState(false); const { t } = useTranslation(); const { register, handleSubmit, formState: { errors, touchedFields } } = useForm({ defaultValues: { email: '', password: '' } }); useEffect(() => { setErrorState(error); }, [error]); const onSubmit = async (data: FormValues) => { if (!onPasswordSignIn) return; setLoading(true); try { await onPasswordSignIn(data.email, data.password, callbackUrl); } catch (err) { if (err instanceof ClientError && err.detail) { setErrorState(err.detail); } else if (err instanceof Error) { setErrorState(err.message); } } finally { setLoading(false); } }; const oAuthReady = onOAuthSignIn && providers.length; return (

{errorState && ( {t([ `auth.login.errors.${errorState.toLowerCase()}`, `auth.login.errors.default` ])} )}
{onPasswordSignIn && ( <>
{touchedFields.email && errors.email && (

{errors.email.message}

)}
{touchedFields.password && errors.password && (

{errors.password.message}

)}
)} {onPasswordSignIn && oAuthReady ? (
) : null} {oAuthReady ? (
{providers.map((provider, index) => ( onOAuthSignIn?.(provider, callbackUrl)} /> ))}
) : null}
); }