aboutsummaryrefslogtreecommitdiff
path: root/src/containers/Login/Login.tsx
diff options
context:
space:
mode:
authorilyayudovin <46264063+ilyayudovin@users.noreply.github.com>2020-08-29 23:39:15 +0300
committerGitHub <noreply@github.com>2020-08-29 23:39:15 +0300
commit96f1c8f86fc973ca66c8725a86b6cf277adb9c72 (patch)
tree866380704610aa2807777c21b3971dd71a020617 /src/containers/Login/Login.tsx
parent890141100a2e9b942a6ef2de15620fa5a01ba581 (diff)
parent3c4f51295ec4ccbed37d2faf8fd751608fc48843 (diff)
downloadwhich-ui-96f1c8f86fc973ca66c8725a86b6cf277adb9c72.tar.gz
Merge pull request #97 from which-ecosystem/validSignUp
fix input validation errors
Diffstat (limited to 'src/containers/Login/Login.tsx')
-rw-r--r--src/containers/Login/Login.tsx99
1 files changed, 63 insertions, 36 deletions
diff --git a/src/containers/Login/Login.tsx b/src/containers/Login/Login.tsx
index bec0db5..3d58c63 100644
--- a/src/containers/Login/Login.tsx
+++ b/src/containers/Login/Login.tsx
@@ -1,14 +1,24 @@
-import React, { useState, useRef } from 'react';
+import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
+import { Formik, Form, Field } from 'formik';
import { makeStyles } from '@material-ui/core/styles';
import {
TextField,
Button,
FormControlLabel,
- Switch
+ Switch,
+ InputAdornment,
+ IconButton
} from '@material-ui/core';
+import { Visibility, VisibilityOff } from '@material-ui/icons';
import { useAuth } from '../../hooks/useAuth';
+interface Fields {
+ username: string;
+ password: string;
+ remember: boolean;
+}
+
const useStyles = makeStyles(theme => ({
root: {
'& > *': {
@@ -37,54 +47,71 @@ const useStyles = makeStyles(theme => ({
const Login: React.FC = () => {
const [error, setError] = useState<boolean>(false);
- const [remember, setRemember] = useState<boolean>(true);
+ const [showPassword, setShowPassword] = useState<boolean>(false);
const classes = useStyles();
- const nameRef = useRef<HTMLInputElement>();
- const passwordRef = useRef<HTMLInputElement>();
const { login } = useAuth();
const history = useHistory();
- const handleCheck = () => {
- setRemember(!remember);
- };
-
- const handleSubmit = async () => {
- const name = nameRef.current?.value?.toLowerCase();
- const password = passwordRef.current?.value;
- if (name && password) {
- login(name, password, remember).then(success => {
- if (success) history.push(`/profile/${name}`);
+ const handleSubmit = async ({ username, password, remember }: Fields) => {
+ if (username && password) {
+ login(username, password, remember).then(success => {
+ if (success) history.push(`/profile/${username}`);
else setError(true);
});
- }
+ } else setError(true);
};
-
const handleRegistration = () => {
history.push('/registration');
};
+ const toggleShowPassword = () => {
+ setShowPassword(prevState => !prevState);
+ };
+
return (
<>
<div className={classes.formHeader}>Sign In</div>
- <form className={classes.root} noValidate autoComplete="off">
- <TextField
- inputRef={nameRef}
- error={error}
- label="Login"
- />
- <TextField
- inputRef={passwordRef}
- error={error}
- helperText={error && 'Invalid credentials'}
- label="Password"
- type="password"
- />
- <FormControlLabel
- control={<Switch color="primary" onClick={handleCheck} checked={remember} size="small" />}
- label="Remember me"
- />
- <Button variant="contained" onClick={handleSubmit}>submit</Button>
- </form>
+ <Formik
+ initialValues={{ username: '', password: '', remember: true }}
+ onSubmit={handleSubmit}
+ >
+ {({ values, isSubmitting }) => (
+ <Form className={classes.root} autoComplete="off">
+ <Field
+ name="username"
+ label="Login"
+ value={values.username}
+ error={error}
+ as={TextField}
+ />
+ <Field
+ name="password"
+ label="Password"
+ as={TextField}
+ value={values.password}
+ error={error}
+ helperText={error && 'Invalid credentials'}
+ type={showPassword ? 'text' : 'password'}
+ InputProps={{
+ endAdornment: (
+ <InputAdornment position="end">
+ <IconButton size="small" onClick={toggleShowPassword}>
+ {showPassword ? <Visibility /> : <VisibilityOff />}
+ </IconButton>
+ </InputAdornment>
+ )
+ }}
+ />
+ <Field
+ name="remember"
+ label="Remember me"
+ as={FormControlLabel}
+ control={<Switch color="primary" checked={values.remember} size="small" />}
+ />
+ <Button variant="contained" type="submit" disabled={isSubmitting}>submit</Button>
+ </Form>
+ )}
+ </Formik>
<div className={classes.formTransfer}>
<div>{'Don\'t have an account?'}</div>
<span