Welcome, Unlock advanced authentication in your MERN app! Explore the process of retrieving user data from the database and seamlessly auto-fill contact fields.
In our main authentication store, we'll use the user route to fetch details of the currently logged-in user. (I've only included the relevant code in the video to keep things simple and easy to follow.)
// eslint-disable-next-line react/prop-types
export const AuthProvider = ({ children }) => {
const [token, setToken] = useState(localStorage.getItem("token"));
const [user, setUser] = useState("");
// function to check the user Authentication or not
const userAuthentication = async () => {
try {
const response = await fetch("http://localhost:5000/api/auth/user", {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
},
});
if (response.ok) {
const data = await response.json();
// our main goal is to get the user data π
setUser(data.userData);
} else {
console.error("Error fetching user data");
}
} catch (error) {
console.log(error);
}
};
useEffect(() => {
userAuthentication();
}, []);
return (
<AuthContext.Provider
value={{ isLoggedIn, storeTokenInLS, LogoutUser, user }}
>
{children}
</AuthContext.Provider>
);
};
On our main contact page, we'll grab the user data using useAuth. If the user data is available, we'll fill in the input fields; otherwise, we'll leave them empty.
import { useState } from "react";
import { useAuth } from "../store/auth";
const defaultContactFormData = {
username: "",
email: "",
message: "",
};
// type UserAuth = boolean;
export const Contact = () => {
const [data, setData] = useState(defaultContactFormData);
const { user } = useAuth();
console.log("frontend user ", user.email);
const [userData, setUserData] = useState(true);
if (userData && user) {
setData({
username: user.username,
email: user.email,
message: "",
});
setUserData(false);
}
const handleInput = (e) => {
// console.log(e);
const name = e.target.name;
const value = e.target.value;
setData((prev) => ({ ...prev, [name]: value }));
};
const handleContactForm = async (e) => {
e.preventDefault();
};
return (
<>
<section className="section-contact">
<div className="contact-content container">
<h1 className="main-heading">contact us</h1>
</div>
{/* <h1>Contact Page</h1> */}
<div className="container grid grid-half-cols">
<div className="contact-img">
<img src="/images/support.png" alt="always ready to help you" />
</div>
<section className="section-form">
<form onSubmit={handleContactForm}>
<div>
<label htmlFor="username">Username</label>
<input
type="text"
name="username"
id="username"
value={data.username}
onChange={handleInput}
autoCapitalize="off"
required
/>
</div>
<div>
<button type="submit"> Submit </button>
</div>
</form>
</section>
</div>
</section>
</>
);
};