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;