sarlink-portal/utils/AxiosClient.ts

56 lines
1.3 KiB
TypeScript

import axios, { type AxiosError } from "axios";
import type { Session } from "next-auth";
import { getSession } from "next-auth/react";
import { redirect } from "next/navigation";
axios.defaults.xsrfCookieName = "csrftoken";
axios.defaults.xsrfHeaderName = "X-CSRFToken";
const ApiClient = () => {
const instance = axios.create({
baseURL: process.env.SARLINK_API_BASE_URL,
headers: {
Accept: "application/json",
},
});
let lastSession: Session | null = null;
instance.interceptors.request.use(
async (request) => {
if (lastSession == null || Date.now() > Date.parse(lastSession.expires)) {
const session = await getSession();
lastSession = session;
}
if (lastSession) {
request.headers.Authorization = `Token ${lastSession.apiToken}`;
} else {
request.headers.Authorization = undefined;
return redirect("/auth/signin");
}
return request;
},
(error) => {
console.error("API Error: ", error);
throw error;
},
);
instance.interceptors.response.use(
async (response) => {
return response;
},
async (error: AxiosError) => {
if (error?.response?.status === 401) {
return redirect("/auth/signin");
}
return Promise.reject(error);
},
);
return instance;
};
export const AxiosClient = ApiClient();