travelmarine-frontend/src/hooks/useApiClient.ts

58 lines
1.7 KiB
TypeScript

import axios from "axios";
import useAuthStore from "@/stores/useAuthStore";
import useAuthPopup from "@/stores/useAuthPopup";
const useApiClient = () => {
const { getToken } = useAuthStore();
const authPopup = useAuthPopup();
const apiClient = axios.create({
baseURL: "https://api.travelmarine.ru",
headers: {
"Content-Type": "application/json",
},
});
apiClient.interceptors.request.use(
(config) => {
const token = getToken();
if (token) {
config.headers.Authorization = `Token ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
console.error("Authentication error:", error);
authPopup.open();
}
if (error.response?.status === 400 || error.response?.status === 429) {
const data = error.response?.data;
const message =
typeof data === "object" && data !== null
? (data.message ?? data.error ?? data.detail ?? data.msg)
: typeof data === "string"
? data
: undefined;
if (message && typeof message === "string") {
return Promise.reject(new Error(message));
}
}
return Promise.reject(error);
}
);
return apiClient;
};
export default useApiClient;