diff --git a/src/utils/axiosClient.jsx b/src/utils/axiosClient.jsx index 93e96bc5..e2766d4c 100644 --- a/src/utils/axiosClient.jsx +++ b/src/utils/axiosClient.jsx @@ -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); } );