import type { AxiosError } from "axios"; import axios from "axios"; import { z } from "zod"; import { storageManager } from "@/libs/storage-manager"; const fcdscpSchema = z.object({ value: z.string(), }); export function CreateInterceptor( baseUrl: string, token: string | undefined, responseType: "blob" | "json", withCredentials: boolean = true, withTokenApi: boolean = false, onLogout?: () => void, isFcdscpSetter?: boolean, ) { const instance = axios.create({}); if (withTokenApi) { instance.defaults.baseURL = baseUrl; return instance; } instance.defaults.baseURL = baseUrl; instance.defaults.responseType = responseType; instance.defaults.withCredentials = withCredentials; // instance.defaults.headers["Content-type"] = "application/json"; if (token) instance.defaults.headers.common.Authorization = `Bearer ${token}`; else delete instance.defaults.headers.common.Authorization; const fcdscp = storageManager.get("fcdscp"); if (fcdscp) { const parsedFcdscp = fcdscpSchema.safeParse(fcdscp); if (parsedFcdscp.success) { instance.defaults.headers.fcdscp = `${fcdscp.value}`; } else { storageManager.delete("fcdscp"); } } // TODO: Culture Code // instance.defaults.headers.common["Accept-Language"] = cultureCode; // Add a response interceptor to handle authentication errors instance.interceptors.response.use( function success(response) { if (response.headers?.fcdscp && isFcdscpSetter) { storageManager.set("fcdscp", { value: response.headers.fcdscp }); } // Any status code that lie within the range of 2xx cause this function to trigger // Do something with response data return response; }, async function failed(error) { const e = error as AxiosError; // Any status codes that falls outside the range of 2xx cause this function to trigger // Do something with response error const status = error.response?.status ?? 500; if (!e.response?.status && e.message === "Network Error") { onLogout?.(); } if (status === 500) { // TODO: EVENT 500 Service } return Promise.reject(error); }, ); return instance; }