/** * ©AngelaMos | 2025 * Axios instance with request/response interceptors */ import axios, { type AxiosError, type AxiosResponse } from 'axios' import { API_BASE_URL, STORAGE_KEYS } from '@/config/constants' /** * Axios Base Config */ const axiosInstance = axios.create({ baseURL: API_BASE_URL, timeout: 180000, headers: { 'Content-Type': 'application/json', }, }) /** * Request interceptor */ axiosInstance.interceptors.request.use( (config) => { const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) if (token) { config.headers.Authorization = `Bearer ${token}` } return config }, (error: AxiosError) => { return Promise.reject(error) } ) /** * Response interceptor */ axiosInstance.interceptors.response.use( (response: AxiosResponse) => { return response }, (error: AxiosError) => { if (error.response?.status === 401) { const requestUrl = error.config?.url ?? '' const isAuthEndpoint = requestUrl.includes('/auth/login') || requestUrl.includes('/auth/register') if (!isAuthEndpoint) { localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN) localStorage.removeItem(STORAGE_KEYS.USER) window.location.href = '/login' } } return Promise.reject(error) } ) /** * API wrapper */ export const api = { get: async (url: string): Promise => { const response = await axiosInstance.get(url) return response.data }, post: async (url: string, data?: unknown): Promise => { const response = await axiosInstance.post(url, data) return response.data }, put: async (url: string, data?: unknown): Promise => { const response = await axiosInstance.put(url, data) return response.data }, delete: async (url: string): Promise => { const response = await axiosInstance.delete(url) return response.data }, }