import axios from "axios" import { getTokens, setTokens, clearTokens } from "./auth" import type { AuthResponse } from "./types" const api = axios.create({ baseURL: "/api/v1", }) api.interceptors.request.use((config) => { const { access } = getTokens() if (access) { config.headers.Authorization = `Bearer ${access}` } return config }) let refreshPromise: Promise | null = null api.interceptors.response.use( (res) => res, async (error) => { const original = error.config if (error.response?.status !== 401 || original._retry) { return Promise.reject(error) } original._retry = true const { refresh } = getTokens() if (!refresh) { clearTokens() window.location.href = "/login" return Promise.reject(error) } if (!refreshPromise) { refreshPromise = axios .post("/api/v1/auth/refresh", { refresh_token: refresh, }) .then((res) => { setTokens(res.data.token, res.data.refresh_token) return res.data.token }) .catch(() => { clearTokens() window.location.href = "/login" return "" }) .finally(() => { refreshPromise = null }) } const newToken = await refreshPromise if (!newToken) return Promise.reject(error) original.headers.Authorization = `Bearer ${newToken}` return api(original) }, ) export default api