import { useForm } from 'react-hook-form'; import React, { useContext, useState } from 'react'; import { Turnstile } from '@marsidev/react-turnstile'; import { ThemeContext, Spinner, Button } from '@librechat/client'; import { useNavigate, useOutletContext, useLocation } from 'react-router-dom'; import { useRegisterUserMutation } from 'librechat-data-provider/react-query'; import type { TRegisterUser, TError } from 'librechat-data-provider'; import type { TLoginLayoutContext } from '~/common'; import { useLocalize, TranslationKeys } from '~/hooks'; import { ErrorMessage } from './ErrorMessage'; const Registration: React.FC = () => { const navigate = useNavigate(); const localize = useLocalize(); const { theme } = useContext(ThemeContext); const { startupConfig, startupConfigError, isFetching } = useOutletContext(); const { watch, register, handleSubmit, formState: { errors }, } = useForm({ mode: 'onChange' }); const password = watch('password'); const [errorMessage, setErrorMessage] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [countdown, setCountdown] = useState(3); const [turnstileToken, setTurnstileToken] = useState(null); const location = useLocation(); const queryParams = new URLSearchParams(location.search); const token = queryParams.get('token'); const validTheme = theme === 'dark' ? 'dark' : 'light'; // only require captcha if we have a siteKey const requireCaptcha = Boolean(startupConfig?.turnstile?.siteKey); const registerUser = useRegisterUserMutation({ onMutate: () => { setIsSubmitting(true); }, onSuccess: () => { setIsSubmitting(false); setCountdown(3); const timer = setInterval(() => { setCountdown((prevCountdown) => { if (prevCountdown <= 1) { clearInterval(timer); navigate('/c/new', { replace: true }); return 0; } else { return prevCountdown - 1; } }); }, 1000); }, onError: (error: unknown) => { setIsSubmitting(false); if ((error as TError).response?.data?.message) { setErrorMessage((error as TError).response?.data?.message ?? ''); } }, }); const renderInput = (id: string, label: TranslationKeys, type: string, validation: object) => (
{errors[id] && ( {String(errors[id]?.message) ?? ''} )}
); return ( <> {errorMessage && ( {localize('com_auth_error_create')} {errorMessage} )} {registerUser.isSuccess && countdown > 0 && (
{localize( startupConfig?.emailEnabled ? 'com_auth_registration_success_generic' : 'com_auth_registration_success_insecure', ) + ' ' + localize('com_auth_email_verification_redirecting', { 0: countdown.toString() })}
)} {!startupConfigError && !isFetching && ( <>
registerUser.mutate({ ...data, token: token ?? undefined }), )} > {renderInput('name', 'com_auth_full_name', 'text', { required: localize('com_auth_name_required'), minLength: { value: 3, message: localize('com_auth_name_min_length'), }, maxLength: { value: 80, message: localize('com_auth_name_max_length'), }, })} {renderInput('username', 'com_auth_username', 'text', { minLength: { value: 2, message: localize('com_auth_username_min_length'), }, maxLength: { value: 80, message: localize('com_auth_username_max_length'), }, })} {renderInput('email', 'com_auth_email', 'email', { required: localize('com_auth_email_required'), minLength: { value: 1, message: localize('com_auth_email_min_length'), }, maxLength: { value: 120, message: localize('com_auth_email_max_length'), }, pattern: { value: /\S+@\S+\.\S+/, message: localize('com_auth_email_pattern'), }, })} {renderInput('password', 'com_auth_password', 'password', { required: localize('com_auth_password_required'), minLength: { value: 8, message: localize('com_auth_password_min_length'), }, maxLength: { value: 128, message: localize('com_auth_password_max_length'), }, })} {renderInput('confirm_password', 'com_auth_password_confirm', 'password', { validate: (value: string) => value === password || localize('com_auth_password_not_match'), })} {startupConfig?.turnstile?.siteKey && (
setTurnstileToken(token)} onError={() => setTurnstileToken(null)} onExpire={() => setTurnstileToken(null)} />
)}

{localize('com_auth_already_have_account')}{' '} {localize('com_auth_login')}

)} ); }; export default Registration;