-
Notifications
You must be signed in to change notification settings - Fork 372
Expand file tree
/
Copy pathSignUp.tsx
More file actions
138 lines (132 loc) · 3.89 KB
/
SignUp.tsx
File metadata and controls
138 lines (132 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import React, { FC, useState } from 'react';
import { Paper, Grid, TextField, Button } from '@material-ui/core';
import { makeStyles } from '@material-ui/core/styles';
import { Face, Fingerprint } from '@material-ui/icons';
import { Alert } from '@material-ui/lab';
import { Redirect } from 'react-router-dom';
import { useHistory } from 'react-router';
import { signUp, isAuthenticated } from '../utils/auth';
const useStyles = makeStyles((theme) => ({
margin: {
margin: theme.spacing(2),
},
padding: {
padding: theme.spacing(1),
},
button: {
textTransform: 'none',
},
marginTop: {
marginTop: 10,
},
}));
export const SignUp: FC = () => {
const classes = useStyles();
const history = useHistory();
const [email, setEmail] = useState<string>('');
const [password, setPassword] = useState<string>('');
const [passwordConfirmation, setPasswordConfirmation] = useState<string>('');
const [error, setError] = useState<string>('');
const handleSubmit = async (_: React.MouseEvent) => {
// Password confirmation validation
if (password !== passwordConfirmation) setError('Passwords do not match');
else {
setError('');
try {
const data = await signUp(email, password, passwordConfirmation);
if (data) {
history.push('/');
}
} catch (err) {
if (err instanceof Error) {
// handle errors thrown from frontend
setError(err.message);
} else {
// handle errors thrown from backend
setError(String(err));
}
}
}
};
return isAuthenticated() ? (
<Redirect to="/" />
) : (
<Paper className={classes.padding}>
<div className={classes.margin}>
<Grid container spacing={8} alignItems="flex-end">
<Grid item>
<Face />
</Grid>
<Grid item md={true} sm={true} xs={true}>
<TextField
id="email"
label="Email"
type="email"
value={email}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setEmail(e.currentTarget.value)
}
fullWidth
autoFocus
required
/>
</Grid>
</Grid>
<Grid container spacing={8} alignItems="flex-end">
<Grid item>
<Fingerprint />
</Grid>
<Grid item md={true} sm={true} xs={true}>
<TextField
id="password"
label="Password"
type="password"
value={password}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setPassword(e.currentTarget.value)
}
fullWidth
required
/>
</Grid>
</Grid>
<Grid container spacing={8} alignItems="flex-end">
<Grid item>
<Fingerprint />
</Grid>
<Grid item md={true} sm={true} xs={true}>
<TextField
id="passwordConfirmation"
label="Confirm password"
type="password"
value={passwordConfirmation}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setPasswordConfirmation(e.currentTarget.value)
}
fullWidth
required
/>
</Grid>
</Grid>
<br />
<Grid container alignItems="center">
{error && (
<Grid item>
<Alert severity="error">{error}</Alert>
</Grid>
)}
</Grid>
<Grid container justifyContent="center" className={classes.marginTop}>
<Button
variant="outlined"
color="primary"
className={classes.button}
onClick={handleSubmit}
>
Sign Up
</Button>
</Grid>
</div>
</Paper>
);
};