I am trying to create a user profile from calling on axios, using reactjs. But I can only see an updated state when I have useEffect but nowhere else. In loginPage.js, I am trying to get the most updated states of entryfirstName, entryLastName, and role to post to the login function, which ties back into my userProvider.js. I am not sure how else to update the states so any feedback is better than what I got.
I am very new to react and I haven't been able to solve this so any help would be much appreciated!
Here is my code for loginPage.js
export default function SignIn() {
const { login } = useContext(UserContext);
const [email_input, setEmail] = useState('');
const [password_input, setPassword] = useState('');
const [entryfirstName, setFirstName] = useState('');
const [entrylastName, setlastName] = useState('');
const [role, setRole] = useState('');
const [entryuser, setEntryUser] = useState({});
const baseURL = 'http://samplesite.org/';
const handleEmailInputChange = event => {
setEmail(event.target.value);
};
const handlePasswordInputChange = event => {
setPassword(event.target.value);
};
const gatherData = async () => {
try {
const userlogins = await axios.get(`${baseURL}/user`);
setEntryUser(userlogins.data.users);
}
catch (error) {
console.log(error);
}
};
const updateData = (loggedin_id, userFirst, userLast) => {
setRole(loggedin_id);
setFirstName(userFirst);
setlastName(userLast);
}, [role, entryfirstName, entrylastName]);
const submit = () => {
if (email_input === null || password_input === null || email_input === "" || password_input === "") {
alert("Enter username and password");
}
else {
if (entryuser.map(x => x.email === email_input && x.password === password_input)) {
console.log("Email and Password exists");
const loggedin = entryuser.filter(obj => obj.email === email_input);
const loggedin_role = loggedin.map(({ role }) => `${role}`);
const loggedin_id = loggedin_role.toString();
const userNames_1 = loggedin.map(({ firstName }) => `${firstName}`);
const userNames_2 = loggedin.map(({ lastName }) => `${lastName}`);
const userFirst = userNames_1.toString();
const userLast = userNames_2.toString();
updateData(loggedin_id, userFirst, userLast);
}
else {
alert("User Does not Exist.");
}
}
}
useEffect(() => {
gatherData();
console.log('useEffect role: ', role);
console.log('useEffect firstname: ', entryfirstName);
console.log('useEffect lastname: ', entrylastName);
}, [role, entryfirstName, entrylastName]);
const handleClick = (event) => {
event.preventDefault();
submit();
console.log('role: ', role);
console.log('firstname: ', entryfirstName);
console.log('lastname: ', entrylastName);
login(entryfirstName, entrylastName, email_input, password_input, role);
}
Here is code for userProvider.js
import React from "react";
import UserContext from "./UserContext";
const UserProvider = ({ children }) => {
const [user, setUser] = React.useState({
firstName: '',
lastName: '',
email: '',
role: '',
auth: false
});
const login = (firstName, lastName, email, password, role) => {
setUser((user) => ({
firstName: firstName,
lastName: lastName,
email: email,
password: password,
role: role,
auth: true,
}));
};
const logout = () => {
setUser((user) => ({
firstName: '',
lastName: '',
email: '',
password: '',
role: '',
auth: false,
}));
};
return (
<UserContext.Provider
value={{
user,
login,
logout }}
>
{children}
</UserContext.Provider>
);
};
export default UserProvider;