fix: !logout on hard refresh

This commit is contained in:
amhsirak
2024-11-11 19:59:51 +05:30
parent 2ecd82d3c9
commit d0fa3ff081

View File

@@ -51,53 +51,50 @@ const AuthProvider = ({ children }: AuthProviderProps) => {
const navigate = useNavigate(); const navigate = useNavigate();
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
// Function to handle logout
const logoutUser = () => { const logoutUser = () => {
dispatch({ type: 'LOGOUT' }); dispatch({ type: 'LOGOUT' });
window.localStorage.removeItem('user'); window.localStorage.removeItem('user');
navigate('/login'); navigate('/login');
}; };
// Function to check token expiration
const checkTokenExpiration = (token: string) => { const checkTokenExpiration = (token: string) => {
if (!token || typeof token !== 'string') { if (!token) return;
console.warn("Invalid token provided for decoding");
logoutUser();
return;
}
try { try {
const decodedToken: any = jwtDecode(token); const decodedToken: any = jwtDecode(token);
const currentTime = Date.now(); const currentTime = Date.now();
const tokenExpiryTime = decodedToken.exp * 1000; // Convert to milliseconds const tokenExpiryTime = decodedToken.exp * 1000;
if (tokenExpiryTime > currentTime) { if (tokenExpiryTime > currentTime) {
setTimeout(logoutUser, tokenExpiryTime - currentTime); // Auto-logout when token expires // Set a timeout for auto-logout when the token expires
setTimeout(logoutUser, tokenExpiryTime - currentTime);
} else { } else {
logoutUser(); // Immediately logout if token is expired logoutUser(); // Immediately logout if token is expired
} }
} catch (error) { } catch (error) {
console.error("Error decoding token:", error); console.error("Error decoding token:", error);
logoutUser(); // Logout on error logoutUser();
} }
}; };
useEffect(() => { useEffect(() => {
const storedUser = window.localStorage.getItem('user'); const storedUser = window.localStorage.getItem('user');
if (storedUser) { if (storedUser) {
const userData = JSON.parse(storedUser); const userData = JSON.parse(storedUser);
dispatch({ type: 'LOGIN', payload: userData }); dispatch({ type: 'LOGIN', payload: userData });
checkTokenExpiration(userData.token); // Check if token is still valid
// Run expiration check only if a token exists
if (userData.token) {
checkTokenExpiration(userData.token);
}
} }
}, []); }, []); // Only run this effect once on mount
axios.interceptors.response.use( axios.interceptors.response.use(
function (response) { (response) => response,
return response; (error) => {
},
function (error) {
const res = error.response; const res = error.response;
if (res.status === 401 && res.config && !res.config.__isRetryRequest) { if (res?.status === 401 && !res.config.__isRetryRequest) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios axios
.get(`${apiUrl}/auth/logout`) .get(`${apiUrl}/auth/logout`)
@@ -122,4 +119,4 @@ const AuthProvider = ({ children }: AuthProviderProps) => {
); );
}; };
export { AuthContext, AuthProvider }; export { AuthContext, AuthProvider };