import React, { useState, useEffect, useCallback } from 'react'; import { useTranslation } from 'next-i18next'; import { useRouter } from 'next/router'; import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client'; import { UserActivationErrorCode } from '~/interfaces/errors/user-activation'; import { RegistrationMode } from '~/interfaces/registration-mode'; import { toastError } from '../client/util/toastr'; import { CompleteUserRegistration } from './CompleteUserRegistration'; interface Props { email: string, token: string, errorCode?: UserActivationErrorCode, registrationMode: RegistrationMode, isEmailAuthenticationEnabled: boolean, } const CompleteUserRegistrationForm: React.FC = (props: Props) => { const { t } = useTranslation(); const { email, token, errorCode, registrationMode, isEmailAuthenticationEnabled, } = props; const forceDisableForm = errorCode != null || !isEmailAuthenticationEnabled; const [usernameAvailable, setUsernameAvailable] = useState(true); const [username, setUsername] = useState(''); const [name, setName] = useState(''); const [password, setPassword] = useState(''); const [disableForm, setDisableForm] = useState(forceDisableForm); const [isSuccessToRagistration, setIsSuccessToRagistration] = useState(false); const router = useRouter(); useEffect(() => { const delayDebounceFn = setTimeout(async() => { try { const { data } = await apiv3Get('/check-username', { username }); if (data.ok) { setUsernameAvailable(data.valid); } } catch (error) { toastError(error); } }, 500); return () => clearTimeout(delayDebounceFn); }, [username]); const handleSubmitRegistration = useCallback(async(e) => { e.preventDefault(); setDisableForm(true); try { const res = await apiv3Post('/complete-registration', { username, name, password, token, }); setIsSuccessToRagistration(true); const { redirectTo } = res.data; if (redirectTo != null) { router.push(redirectTo); } } catch (err) { toastError(err); setDisableForm(false); setIsSuccessToRagistration(false); } }, [username, name, password, token, router]); if (isSuccessToRagistration && registrationMode === RegistrationMode.RESTRICTED) { return ; } return ( <>
{ (errorCode != null && errorCode === UserActivationErrorCode.TOKEN_NOT_FOUND) && (

Token not found

)} { (errorCode != null && errorCode === UserActivationErrorCode.USER_REGISTRATION_ORDER_IS_NOT_APPROPRIATE) && (

{t('message.incorrect_token_or_expired_url')}

)} { !isEmailAuthenticationEnabled && (

{t('message.email_authentication_is_not_enabled')}

)}
setUsername(e.target.value)} required disabled={forceDisableForm || disableForm} />
{!usernameAvailable && (

{t('installer.unavaliable_user_id')}

)}
setName(e.target.value)} required disabled={forceDisableForm || disableForm} />
setPassword(e.target.value)} required disabled={forceDisableForm || disableForm} />
); }; export default CompleteUserRegistrationForm;