import axios from "axios"; import type { AxiosRequestConfig, InternalAxiosRequestConfig } from "axios"; type UnauthorizedHandler = () => Promise; let unauthorizedHandler: UnauthorizedHandler | null = null; export const setUnauthorizedHandler = (handler: UnauthorizedHandler | null) => { unauthorizedHandler = handler; }; const instance = axios.create({ baseURL: "http://127.0.0.1:8080", }); instance.interceptors.request.use((config: InternalAxiosRequestConfig) => { const sessionID = sessionStorage.getItem("session_id"); if (sessionID) { config.headers["X-Session-Id"] = sessionID; } return config; }); instance.interceptors.response.use( (response) => response.data, async (error) => { const config = error.config as | (AxiosRequestConfig & { _retry?: boolean }) | undefined; const status = error.response?.status; const url = config?.url ?? ""; if ( status === 401 && config && !config._retry && unauthorizedHandler && !url.includes("/api/login") ) { config._retry = true; const ok = await unauthorizedHandler(); if (ok) { return instance.request(config); } } return Promise.reject(error); }, ); const http = { get(url: string, config?: AxiosRequestConfig) { return instance.get(url, config); }, post(url: string, data?: unknown, config?: AxiosRequestConfig) { return instance.post(url, data, config); }, put(url: string, data?: unknown, config?: AxiosRequestConfig) { return instance.put(url, data, config); }, delete(url: string, config?: AxiosRequestConfig) { return instance.delete(url, config); }, }; export default http;