import React, { useState, useRef, FormEvent, useMemo } from 'react'; import { useHistory } from 'react-router-dom'; import { makeStyles } from '@material-ui/core/styles'; import { TextField, Button, InputAdornment, IconButton } from '@material-ui/core'; import { Visibility, VisibilityOff } from '@material-ui/icons'; import { post } from '../../requests'; import { useAuth } from '../../hooks/useAuth'; const useStyles = makeStyles(theme => ({ root: { '& > *': { margin: theme.spacing(1), width: theme.spacing(35) }, display: 'flex', flexDirection: 'column', alignItems: 'center', textAlign: 'center' }, formHeader: { textAlign: 'center', fontSize: 25 }, formTransfer: { display: 'flex', justifyContent: 'center' }, transferButton: { marginLeft: 10, color: 'green', cursor: 'pointer' } })); interface ErrorStates { username: boolean | undefined; email: boolean | undefined; password: boolean | undefined; } const Registration: React.FC = () => { const [errors, setErrors] = useState({ username: undefined, email: undefined, password: undefined }); const [showPassword, setShowPassword] = useState(false); const classes = useStyles(); const usernameRef = useRef(); const emailRef = useRef(); const passwordRef = useRef(); const { login } = useAuth(); const history = useHistory(); const isValid = useMemo(() => { return !errors.username && !errors.email && !errors.password; }, [errors]); const handleSubmit = (event: FormEvent) => { event.preventDefault(); const username = usernameRef.current?.value?.toLowerCase(); const password = passwordRef.current?.value; const email = emailRef.current?.value; if (username && password && isValid) { post('/users', { username, password, email }) .then(() => login(username, password)) .then(() => history.push(`/profile/${username}`)); } }; const handleLogin = () => { history.push('/login'); }; const handleClickShowPassword = () => { setShowPassword(prevState => !prevState); }; const handleMouseDownPassword = (event: React.MouseEvent) => { event.preventDefault(); }; const handleUsernameChange = (event: React.FocusEvent) => { setErrors({ ...errors, username: event.currentTarget.value.length === 0 }); }; const handleEmailChange = (event: React.FocusEvent) => { setErrors({ ...errors, email: !/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(event.currentTarget.value) }); }; const handlePasswordChange = (event: React.FocusEvent) => { setErrors({ ...errors, password: event.currentTarget.value.length < 6 }); }; const handleToLowerCase = (e: React.ChangeEvent) => { e.target.value = e.target.value.toString().toLowerCase(); }; const handleFocus = (value: string) => () => { setErrors({ ...errors, [value]: undefined }); }; return ( <>
Sign Up
{showPassword ? : } ) }} />
Already have an account?
Log in
); }; export default Registration;