import axios from 'axios'; import { API_URL } from '../../constants'; // Create axios instance const apiClient = axios.create({ baseURL: API_URL, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, }); // Request interceptor - Add auth token apiClient.interceptors.request.use( (config) => { const tokenData = window.localStorage.getItem('token'); if (tokenData) { try { const user = JSON.parse(tokenData); if (user?.token) { config.headers.Authorization = `Bearer ${user.token}`; } } catch (error) { console.error('Error parsing token:', error); } } return config; }, (error) => { return Promise.reject(error); } ); // Response interceptor - Handle errors globally apiClient.interceptors.response.use( (response) => { // Handle different response structures from the API // Some endpoints return { data: [...] }, some return plain arrays return response; }, (error) => { if (error.response) { // The request was made and the server responded with a status code // that falls out of the range of 2xx const { status, data } = error.response; if (status === 401) { // Unauthorized - redirect to login window.localStorage.removeItem('token'); window.location.href = '/login'; return Promise.reject(new Error('You are not authorized to access this page.')); } if (status === 403) { return Promise.reject(new Error('You do not have permission to perform this action.')); } if (status === 404) { return Promise.reject(new Error('The requested resource was not found.')); } if (status === 500) { return Promise.reject(new Error('A server error occurred. Please try again later.')); } // Extract error message from response const message = data?.message || data?.Message || data?.error || 'An error occurred'; return Promise.reject(new Error(message)); } else if (error.request) { // The request was made but no response was received return Promise.reject(new Error('No response from server. Please check your connection.')); } else { // Something happened in setting up the request that triggered an Error return Promise.reject(error); } } ); export default apiClient;