50 lines
1.1 KiB
TypeScript
50 lines
1.1 KiB
TypeScript
import axios, { AxiosRequestConfig, isAxiosError } from "axios";
|
|
import { User } from "@/contexts/auth-context";
|
|
import { toast } from "sonner";
|
|
|
|
export const Api = axios.create({
|
|
baseURL: process.env.NEXT_PUBLIC_API_BASE_URL,
|
|
responseType: "json",
|
|
});
|
|
|
|
interface ErrorResponseDTO {
|
|
timestamp: string;
|
|
message: string;
|
|
}
|
|
|
|
Api.interceptors.request.use(async (config) => {
|
|
const jsonString = localStorage.getItem("userData");
|
|
if (jsonString) {
|
|
const userData: User = JSON.parse(jsonString);
|
|
config.headers.Authorization = `Bearer ${userData.token}`;
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
Api.interceptors.response.use(
|
|
(response) => response,
|
|
(error) => {
|
|
if (!isAxiosError(error)) {
|
|
console.log(error);
|
|
return;
|
|
}
|
|
|
|
const errorDTO = error.response?.data as ErrorResponseDTO;
|
|
toast.error(errorDTO.message);
|
|
},
|
|
);
|
|
|
|
export const customInstance = <T>(
|
|
config: AxiosRequestConfig,
|
|
options?: AxiosRequestConfig,
|
|
): Promise<T> => {
|
|
const source = axios.CancelToken.source();
|
|
return Api({
|
|
...config,
|
|
...options,
|
|
cancelToken: source.token,
|
|
paramsSerializer: { indexes: null },
|
|
}).then(({ data }) => data);
|
|
};
|