import axios, { type AxiosError, type AxiosResponse } from "axios"; import { store } from "@/main.ts"; import { addNewMessage, color } from "@/services/popupDisplayer.ts"; import router from "@/router/router"; const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_BACKEND_URL, headers: { "Content-Type": "application/json", }, }); axiosInstance.interceptors.request.use( (config) => { const token = store.user?.token; // Récupérez le token depuis le store if (token) { config.headers["Authorization"] = `Bearer ${token}`; // Ajoutez le token dans l'en-tête } return config; }, (error) => { return Promise.reject(error); } ); axiosInstance.interceptors.response.use( (response) => response, // Directly return successful responses. async (error) => { const originalRequest = error.config; if ( ((error.response && error.response.status === 401) || error.code == "ERR_NETWORK") && !originalRequest._retry && store.authenticated ) { originalRequest._retry = true; try { await store.refreshUserToken(); axiosInstance.defaults.headers.common["Authorization"] = `Bearer ${store.user.token}`; return axiosInstance(originalRequest); } catch (refreshError) { console.error("Token refresh failed:", refreshError); localStorage.removeItem("accessToken"); localStorage.removeItem("refreshToken"); router.push("/login"); return Promise.reject(refreshError); } } return Promise.reject(error); // For all other errors, return the error as is. } ); // TODO: spawn a error modal function defaultApiErrorHandler(err: AxiosError) { const errorMessage = (err.response?.data as { message?: string })?.message ?? err.message; addNewMessage(errorMessage, color.Red); } function defaultApiSuccessHandler(response: AxiosResponse) { addNewMessage(response.data, color.Green); } function callApi( endpoint: string, onSuccessHandler?: (response: AxiosResponse) => void, onErrorHandler?: (error: AxiosError) => void ): void { axiosInstance .get(endpoint) .then( onSuccessHandler == null ? defaultApiSuccessHandler : onSuccessHandler ) .catch( onErrorHandler == null ? defaultApiErrorHandler : onErrorHandler ); } function postApi( endpoint: string, data: unknown, //to fix eslint issue, go back here if errors occurs later onSuccessHandler?: (response: AxiosResponse) => void, onErrorHandler?: (error: AxiosError) => void ): void { axiosInstance .post(endpoint, data) .then(onSuccessHandler ?? defaultApiSuccessHandler) .catch(onErrorHandler ?? defaultApiErrorHandler); } function deleteApi( endpoint: string, onSuccessHandler?: (response: AxiosResponse) => void, onErrorHandler?: (error: AxiosError) => void ): void { axiosInstance .delete(endpoint) .then(onSuccessHandler ?? defaultApiSuccessHandler) .catch(onErrorHandler ?? defaultApiErrorHandler); } //export { axiosInstance, callApi, postApi, deleteApi }; export { axiosInstance, defaultApiErrorHandler, defaultApiSuccessHandler, callApi, postApi, deleteApi, };