-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAuthForm.js
More file actions
112 lines (100 loc) · 3.14 KB
/
AuthForm.js
File metadata and controls
112 lines (100 loc) · 3.14 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
import { useState, useRef, useContext } from "react";
import classes from "./AuthForm.module.css";
import AuthContext from "../../store/auth-context";
import { useHistory } from "react-router-dom";
const AuthForm = () => {
const history = useHistory();
const emailInputRef = useRef();
const passwordInputRef = useRef();
const authCtx = useContext(AuthContext);
const [isLogin, setIsLogin] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const switchAuthModeHandler = () => {
setIsLogin((prevState) => !prevState);
};
const submitHandler = (event) => {
event.preventDefault();
const enteredEmail = emailInputRef.current.value;
const enteredPassword = passwordInputRef.current.value;
// optional: Add validation
setIsLoading(true);
let url;
if (isLogin) {
url =
"https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=AIzaSyCVBuKSZk05KimdEmn1qpRiSCMAWp28kxM";
} else {
url =
"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyCVBuKSZk05KimdEmn1qpRiSCMAWp28kxM";
}
fetch(url, {
method: "POST",
body: JSON.stringify({
email: enteredEmail,
password: enteredPassword,
returnSecureToken: true,
}),
headers: {
"Content-Type": "application/json",
},
})
.then((res) => {
setIsLoading(false);
if (res.ok) {
return res.json();
} else {
return res.json().then((data) => {
let errorMessage = "Authentication failed!";
// if (data && data.error && data.error.message) {
// errorMessage = data.error.message;
// }
throw new Error(errorMessage);
});
}
})
.then((data) => {
const expirationTime = new Date(
new Date().getTime() + +data.expiresIn * 1000
);
console.log(data);
authCtx.login(data.idToken, expirationTime.toISOString());
history.replace("/");
})
.catch((err) => {
alert(err.message);
});
};
return (
<section className={classes.auth}>
<h1>{isLogin ? "Login" : "Sign Up"}</h1>
<form onSubmit={submitHandler}>
<div className={classes.control}>
<label htmlFor="email">Your Email</label>
<input type="email" id="email" required ref={emailInputRef} />
</div>
<div className={classes.control}>
<label htmlFor="password">Your Password</label>
<input
type="password"
id="password"
required
ref={passwordInputRef}
/>
</div>
<div className={classes.actions}>
{!isLoading && (
<button>{isLogin ? "Login" : "Create Account"}</button>
)}
{isLoading && <p>Sending request...</p>}
<button
type="button"
className={classes.toggle}
onClick={switchAuthModeHandler}
>
{isLogin ? "Create new account" : "Login with existing account"}
</button>
</div>
</form>
</section>
);
};
export default AuthForm;