Newer
Older
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
import styles from './SignupForm.module.scss';
import { useState, FormEvent } from 'react';
import axios from 'axios';
enum Status {
NotSent = 1,
Sending,
Sent,
ServerError,
InvalidEmail,
}
export default function SignupForm() {
let [ status, setStatus ] = useState(Status.NotSent);
let [ email, setEmail ] = useState('');
function submit(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
if (email === '') {
setStatus(Status.InvalidEmail);
return;
}
setStatus(Status.Sending);
axios.post('/api/send', { email }).then((response) => {
if (response.status === 200) {
setStatus(Status.Sent);
} else if (response.status === 400) setStatus(Status.InvalidEmail);
else setStatus(Status.ServerError);
}).catch(() => setStatus(Status.ServerError));
}
if (status === Status.Sending || status === Status.Sent) {
if (status === Status.Sending) return <div className={styles.form}><h4>Loading</h4></div>;
else return (
<div className={styles.form}>
<h4>Thanks! We'll keep you up to date.</h4>
</div>
);
} else return (
<div className={styles.form}>
<form className={styles.signup} onSubmit={submit}>
<input
type="email"
placeholder="Please enter your email."
value={email}
onChange={e => setEmail(e.currentTarget.value)}
/>
<button>Join waiting list.</button>
</form>
{ status === Status.ServerError && <h4>An error has occured, please try again later.</h4> }
{ status === Status.InvalidEmail && <h4>Please provide a valid email</h4> }
</div>
);
}