When I logout on the Profile Page, the website briefly shows this. But the website is working perfectly fine, this compiled with problems only shows When I logout on the Profile Page. When I logout anywhere else this doesn’t happen. I’ve been trying to find the error since last night, please help me find the error because I’m losing my mind.
code of ProfileScreen.js
import React, { useEffect } from 'react';
import Header from '../components/Header';
import ProfileTabs from '../components/profileComponents/ProfileTabs';
import Orders from './../components/profileComponents/Orders';
import moment from 'moment';
import { useDispatch, useSelector } from 'react-redux';
import { getUserDetails } from '../Redux/Actions/userActions';
const ProfileScreen = () => {
window.scrollTo(0, 0);
const dispatch = useDispatch();
const userLogin = useSelector((state) => state.userLogin);
const { userInfo } = userLogin;
useEffect(() => {
dispatch(getUserDetails('profile'));
}, [dispatch]);
return (
<>
<Header />
<div className="container mt-lg-5 mt-3">
<div className="row align-items-start">
<div className="col-lg-4 p-0 shadow ">
<div className="author-card pb-0 pb-md-3">
<div className="author-card-cover"></div>
<div className="author-card-profile row">
<div className="author-card-avatar col-md-5">
<img src="./images/user.png" alt="userprofileimage" />
</div>
<div className="author-card-details col-md-7">
<h5 className="author-card-name mb-2">
<strong>{userInfo.name}</strong>
</h5>
<span className="author-card-position">
<>Joined {moment(userInfo.createdAt).format('LL')}</>
</span>
</div>
</div>
</div>
<div className="wizard pt-3 ">
<div class="d-flex align-items-start">
<div
class="nav align-items-start flex-column col-12 nav-pills me-3 "
id="v-pills-tab"
role="tablist"
aria-orientation="vertical"
>
<button
class="nav-link active"
id="v-pills-home-tab"
data-bs-toggle="pill"
data-bs-target="#v-pills-home"
type="button"
role="tab"
aria-controls="v-pills-home"
aria-selected="true"
>
Profile Settings
</button>
<button
class="nav-link d-flex justify-content-between"
id="v-pills-profile-tab"
data-bs-toggle="pill"
data-bs-target="#v-pills-profile"
type="button"
role="tab"
aria-controls="v-pills-profile"
aria-selected="false"
>
Orders List
<span className="badge2">3</span>
</button>
</div>
</div>
</div>
</div>
{/* panels */}
<div
class="tab-content col-lg-8 pb-5 pt-lg-0 pt-3"
id="v-pills-tabContent"
>
<div
class="tab-pane fade show active"
id="v-pills-home"
role="tabpanel"
aria-labelledby="v-pills-home-tab"
>
<ProfileTabs />
</div>
<div
class="tab-pane fade"
id="v-pills-profile"
role="tabpanel"
aria-labelledby="v-pills-profile-tab"
>
<Orders />
</div>
</div>
</div>
</div>
</>
);
};
export default ProfileScreen;
code of ProfileTabs.js
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import Toast from './../LoadingError/Toast';
import Message from './../LoadingError/Error';
import Loading from './../LoadingError/Loading';
import { toast } from 'react-toastify';
import { updateUserProfile } from '../../Redux/Actions/userActions';
const ProfileTabs = () => {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const toastId = React.useRef(null);
const Toastobjects = {
pauseOnFocusLoss: false,
draggable: false,
pauseOnHover: false,
autoClose: 2000,
};
const dispatch = useDispatch();
const userDetails = useSelector((state) => state.userDetails);
const { loading, error, user } = userDetails;
const userUpdateProfile = useSelector((state) => state.userUpdateProfile);
const { loading: updateLoading } = userUpdateProfile;
useEffect(() => {
if (user) {
setName(user.name);
setEmail(user.email);
}
}, [dispatch, user]);
const submitHandler = (e) => {
e.preventDefault();
if (password !== confirmPassword) {
if (!toast.isActive(toastId.current)) {
toastId.current = toast.error('Passwords Do Not Match', Toastobjects);
}
} else {
dispatch(updateUserProfile({ id: user._id, name, email, password }));
if (!toast.isActive(toastId.current)) {
toastId.current = toast.success('Profile Updated', Toastobjects);
}
}
};
return (
<>
<Toast />
{error && <Message variant="alert-danger">{error}</Message>}
{loading && <Loading />}
{updateLoading && <Loading />}
<form className="row form-container" onSubmit={submitHandler}>
<div className="col-md-6">
<div className="form">
<label for="account-fn">UserName</label>
<input
className="form-control"
type="text"
required
value={name}
onChange={(e) => setName(e.target.value)}
/>
</div>
</div>
<div className="col-md-6">
<div className="form">
<label for="account-email">Email Address</label>
<input
className="form-control"
type="email"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
</div>
</div>
<div className="col-md-6">
<div className="form">
<label for="account-pass">New Password</label>
<input
className="form-control"
type="password"
required
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
</div>
</div>
<div className="col-md-6">
<div className="form">
<label for="account-confirm-pass">Confirm Password</label>
<input
className="form-control"
type="password"
required
value={confirmPassword}
onChange={(e) => setConfirmPassword(e.target.value)}
/>
</div>
</div>
<button type="submit">Update Profile</button>
</form>
</>
);
};
export default ProfileTabs;
2
Answers
I can’t quite figure out where the logout functionality is. But I’m assuming when a user logs out, you set the user/userInfo to undefined.
So then either here:
user is undefined, so then you try and set name to undefined.name which is gonna throw the error
OR
it’s happening here:
for the same reason.
When a user logs out, instead of setting the user to null or undefined, instead just set it to an empty object ie: {} . Or a hackier approach might be doing the following, but then you have to make sure you’re doing this everywhere where you call a property of user:
and
and that should solve it in the short term.
Make sure you’re getting the desired object for userInfo . If yes, then for a quickfix you can do something like this