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();