import React, { useState, useEffect, useContext } from 'react'; import { useForm } from 'react-hook-form'; import { Turnstile } from '@marsidev/react-turnstile'; import { ThemeContext, Spinner, Button, isDark } from '@librechat/client'; import type { TLoginUser, TStartupConfig } from 'librechat-data-provider'; import type { TAuthContext } from '~/common'; import { useResendVerificationEmail, useGetStartupConfig } from '~/data-provider'; import { useLocalize } from '~/hooks'; type TLoginFormProps = { onSubmit: (data: TLoginUser) => void; startupConfig: TStartupConfig; error: Pick['error']; setError: Pick['setError']; }; const LoginForm: React.FC = ({ onSubmit, startupConfig, error, setError }) => { const localize = useLocalize(); const { theme } = useContext(ThemeContext); const { register, getValues, handleSubmit, formState: { errors, isSubmitting }, } = useForm(); const [showResendLink, setShowResendLink] = useState(false); const [turnstileToken, setTurnstileToken] = useState(null); const { data: config } = useGetStartupConfig(); const useUsernameLogin = config?.ldap?.username; const validTheme = isDark(theme) ? 'dark' : 'light'; const requireCaptcha = Boolean(startupConfig.turnstile?.siteKey); useEffect(() => { if (error && error.includes('422') && !showResendLink) { setShowResendLink(true); } }, [error, showResendLink]); const resendLinkMutation = useResendVerificationEmail({ onMutate: () => { setError(undefined); setShowResendLink(false); }, }); if (!startupConfig) { return null; } const renderError = (fieldName: string) => { const errorMessage = errors[fieldName]?.message; return errorMessage ? ( {String(errorMessage)} ) : null; }; const handleResendEmail = () => { const email = getValues('email'); if (!email) { return setShowResendLink(false); } resendLinkMutation.mutate({ email }); }; return ( <> {showResendLink && (
{localize('com_auth_email_verification_resend_prompt')}
)}
onSubmit(data))} >
{renderError('email')}
{renderError('password')}
{startupConfig.passwordResetEnabled && ( {localize('com_auth_password_forgot')} )} {requireCaptcha && (
setTurnstileToken(null)} onExpire={() => setTurnstileToken(null)} />
)}
); }; export default LoginForm;