2023-07-15 17:46:19 +03:00
import { useEffect , useState } from 'react' ;
2023-07-26 23:11:00 +03:00
import { useNavigate } from 'react-router-dom' ;
import { toast } from 'react-toastify' ;
2023-07-15 17:46:19 +03:00
2023-07-25 20:27:29 +03:00
import BackendError from '../components/BackendError' ;
2023-07-15 17:46:19 +03:00
import Form from '../components/Common/Form' ;
import SubmitButton from '../components/Common/SubmitButton' ;
2023-07-25 20:27:29 +03:00
import TextInput from '../components/Common/TextInput' ;
import InfoMessage from '../components/InfoMessage' ;
import { useAuth } from '../context/AuthContext' ;
import { type IUserSignupData } from '../utils/models' ;
2023-07-15 17:46:19 +03:00
function RegisterPage() {
2023-07-26 23:11:00 +03:00
const navigate = useNavigate ( ) ;
2023-07-31 23:47:18 +03:00
const { user , signup , loading , error , setError } = useAuth ( ) ;
2023-07-15 17:46:19 +03:00
const [ username , setUsername ] = useState ( '' ) ;
const [ email , setEmail ] = useState ( '' ) ;
const [ password , setPassword ] = useState ( '' ) ;
const [ password2 , setPassword2 ] = useState ( '' ) ;
const [ firstName , setFirstName ] = useState ( '' ) ;
const [ lastName , setLastName ] = useState ( '' ) ;
2023-07-25 20:27:29 +03:00
2023-07-15 17:46:19 +03:00
useEffect ( ( ) = > {
setError ( undefined ) ;
} , [ username , email , password , password2 , setError ] ) ;
2023-07-31 23:47:18 +03:00
function handleSubmit ( event : React.FormEvent < HTMLFormElement > ) {
2023-07-15 17:46:19 +03:00
event . preventDefault ( ) ;
if ( ! loading ) {
2023-07-25 20:27:29 +03:00
const data : IUserSignupData = {
username ,
email ,
password ,
password2 ,
first_name : firstName ,
last_name : lastName
2023-07-15 17:46:19 +03:00
} ;
2023-07-26 23:11:00 +03:00
signup ( data , createdUser = > {
navigate ( ` /login?username= ${ createdUser . username } ` ) ;
toast . success ( ` Пользователь успешно создан: ${ createdUser . username } ` ) ;
} ) ;
2023-07-15 17:46:19 +03:00
}
2023-07-31 23:47:18 +03:00
}
2023-07-15 17:46:19 +03:00
return (
2023-07-25 20:27:29 +03:00
< div className = 'w-full py-2' >
2023-07-26 23:11:00 +03:00
{ user &&
2023-07-15 17:46:19 +03:00
< InfoMessage message = { ` Вы вошли в систему как ${ user . username } . Если хотите зарегистрировать нового пользователя, выйдите из системы (меню в правом верхнем углу экрана) ` } / > }
2023-07-26 23:11:00 +03:00
{ ! user &&
2023-07-15 17:46:19 +03:00
< Form title = 'Регистрация пользователя' onSubmit = { handleSubmit } >
< TextInput id = 'username' label = 'Имя пользователя' type = 'text'
required
value = { username }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setUsername ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
2023-07-25 20:27:29 +03:00
< TextInput id = 'password' label = 'Пароль' type = 'password'
2023-07-15 17:46:19 +03:00
required
value = { password }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setPassword ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
< TextInput id = 'password2' label = 'Повторите пароль' type = 'password'
required
value = { password2 }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setPassword2 ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
< div className = 'text-sm' >
< p > - м и н и м у м 8 с и м в о л о в < / p >
< p > - б о л ь ш и е , м а л е н ь к и е б у к в ы , ц и ф р ы < / p >
< p > - м и н и м у м 1 с п е ц . с и м в о л < / p >
< / div >
< TextInput id = 'email' label = 'email' type = 'text'
required
value = { email }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setEmail ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
< TextInput id = 'first_name' label = 'Имя' type = 'text'
value = { firstName }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setFirstName ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
< TextInput id = 'last_name' label = 'Фамилия' type = 'text'
value = { lastName }
2023-07-25 20:27:29 +03:00
onChange = { event = > { setLastName ( event . target . value ) ; } }
2023-07-15 17:46:19 +03:00
/ >
< div className = 'flex items-center justify-between my-4' >
< SubmitButton text = 'Регистрировать' loading = { loading } / >
< / div >
{ error && < BackendError error = { error } / > }
< / Form >
}
2023-07-15 17:57:25 +03:00
< / div >
2023-07-15 17:46:19 +03:00
) ;
}
2023-07-25 20:27:29 +03:00
export default RegisterPage ;