Spaces:
Sleeping
Sleeping
| import axios from "axios"; | |
| const BASE_URL = import.meta.env.VITE_NODE_BASE_URL || "http://localhost:3000/api"; | |
| const api = axios.create({ | |
| baseURL: BASE_URL, | |
| withCredentials: true, | |
| headers: { | |
| "Content-Type": "application/json", | |
| }, | |
| }); | |
| // Optional: Add response interceptor for global error handling | |
| let isRefreshing = false; | |
| let failedQueue: any[] = []; | |
| const processQueue = (error: any, token: string | null = null) => { | |
| failedQueue.forEach((prom) => { | |
| if (error) { | |
| prom.reject(error); | |
| } else { | |
| prom.resolve(token); | |
| } | |
| }); | |
| failedQueue = []; | |
| }; | |
| api.interceptors.response.use( | |
| (response) => response, | |
| async (error) => { | |
| const originalRequest = error.config; | |
| console.log("Interceptor caught error:", { | |
| status: error.response?.status, | |
| data: error.response?.data, | |
| message: error.response?.data?.message | |
| }); | |
| if ( | |
| (error.response?.status === 401 || | |
| (error.response?.status === 500 && error.response?.data?.message === 'jwt expired')) && | |
| !originalRequest._retry | |
| ) { | |
| if (isRefreshing) { | |
| return new Promise(function (resolve, reject) { | |
| failedQueue.push({ resolve, reject }); | |
| }) | |
| .then(() => { | |
| return api(originalRequest); | |
| }) | |
| .catch((err) => { | |
| return Promise.reject(err); | |
| }); | |
| } | |
| originalRequest._retry = true; | |
| isRefreshing = true; | |
| try { | |
| await axios.get(`${BASE_URL}/user/refresh-token`, { withCredentials: true }); | |
| processQueue(null, "refreshed"); | |
| isRefreshing = false; | |
| return api(originalRequest); | |
| } catch (refreshError) { | |
| processQueue(refreshError, null); | |
| isRefreshing = false; | |
| localStorage.removeItem("user"); | |
| window.location.href = "/login"; | |
| return Promise.reject(refreshError); | |
| } | |
| } | |
| console.error("API Error:", error.response?.data?.message || error.message); | |
| return Promise.reject(error); | |
| } | |
| ); | |
| export default api; | |