prevent looping for refresh token calling

This commit is contained in:
Pramod Mahajan 2025-06-11 17:52:18 +05:30
parent 4bb4f8fc17
commit 38960e9132

View File

@ -38,102 +38,64 @@ axiosClient.interceptors.response.use(
async (error) => {
const originalRequest = error.config;
if (!originalRequest) {
// Prevent infinite loop
if (!originalRequest || originalRequest._retry) {
return Promise.reject(error);
}
// Prevent multiple toasts for the same request
// Only show one toast per request
if (!originalRequest._toastShown) {
originalRequest._toastShown = true;
if (error.code === "ERR_CONNECTION_REFUSED") {
console.error(
"Connection refused. Please ensure the server is running."
);
if (error.config.url.indexOf("refresh-token") != -1) {
//showToast("Server is unreachable. Try again later!", "error");
} else {
showToast(
"Unable to connect to the server. Please try again later.",
"error"
);
}
showToast("Unable to connect to the server. Please try again later.", "error");
} else if (error.code === "ERR_NETWORK") {
console.error("Network error: Unable to reach the server.");
if (error.config.url.indexOf("refresh-token") != -1) {
//showToast("Server is unreachable. Try again later!", "error");
}
showToast("Network error. Please check your connection.", "error");
redirectToLogin();
} else if (error.code === "ECONNABORTED") {
console.error("Request timed out.");
if (error.config.url.indexOf("refresh-token") != -1) {
//showToast("Server is unreachable. Try again later!", "error");
} else {
showToast(
"The request took too long. Please try again later.",
"error"
);
}
showToast("Request timed out. Please try again.", "error");
} else if (error.response) {
if (error.config.url.indexOf("refresh-token") != -1) {
//showToast("Server is unreachable. Try again later!", "error");
}
// else {
// // showToast(error.response.data.message, "error"); // repeted toast
// }
if (error.response.status === 401) {
const status = error.response.status;
const isRefreshRequest = error.config.url.includes("refresh-token");
if (status === 401 && !isRefreshRequest) {
// Mark as retried to avoid loops
originalRequest._retry = true;
const refreshToken = localStorage.getItem("refreshToken");
if (!refreshToken || error.response.data?.errors === "Invalid or expired refresh token.") {
redirectToLogin();
return Promise.reject(error);
}
try {
// Get the refresh token from secure storage
const refreshToken = localStorage.getItem("refreshToken");
// Refresh token
const res = await axiosClient.post("/api/Auth/refresh-token", {
token: localStorage.getItem("jwtToken"),
refreshToken,
});
if (!refreshToken || error.response.data.errors === "Invalid or expired refresh token.") {
// Redirect to login if refresh token is not available
redirectToLogin();
return Promise.reject(error);
}
// Make a request to refresh the access token
const response = await axiosClient
.post("/api/Auth/refresh-token", {
token: localStorage.getItem("jwtToken"),
refreshToken,
})
.catch((error) => {
// console.log("7 - error fetching refresh token :", error);
});
const { token, refreshToken: newRefreshToken } = res.data.data;
const { token, refreshToken: newRefreshToken } = response.data.data;
// Save new tokens
localStorage.setItem("jwtToken", token);
localStorage.setItem("refreshToken", newRefreshToken);
localStorage.setItem("refreshToken", newRefreshToken);
// Retry the original request with the new token
// Set Authorization header
originalRequest.headers["Authorization"] = `Bearer ${token}`;
// Retry the original request
return axiosClient(originalRequest);
} catch (err) {
// Redirect to login if token refresh fails
// Optional: Instead of retrying, you may choose to reload app or go to home
return axiosClient(originalRequest); // <== only retry once
} catch (refreshError) {
redirectToLogin();
return Promise.reject(err);
return Promise.reject(refreshError);
}
} else {
if (error.config.url.indexOf("refresh-token") != -1) {
//showToast("Server is unreachable. Try again later!", "error");
// console.log("6 - error fetching refresh token :", error);
}
// showToast(
// error.response.data?.message ||
// "An error occurred. Please try again.",
// "error"
// );
}
} else {
console.error("An unknown error occurred:", error.message);
showToast("An unknown error occurred.", "error");
}
}
return Promise.reject(error);
}
);