Files
MyINPulse/front/MyINPulse-front/src/services/api.ts
root 7d41da97de
Some checks failed
Format / formatting (push) Successful in 5s
Build / build (push) Successful in 1m43s
CI / build (push) Failing after 12s
Format / formatting (pull_request) Successful in 6s
prettier api.ts
2025-05-01 16:11:07 +02:00

115 lines
3.5 KiB
TypeScript

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,
};