import axios from 'axios'; // Use Vite proxy in development, or env variable in production const API_BASE_URL = import.meta.env.VITE_API_URL || '/api'; export const apiClient = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', }, }); // Add token from localStorage on initialization const token = localStorage.getItem('access_token'); if (token) { apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`; } // Add response interceptor for token refresh on 401 apiClient.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; // Handle 401 errors with token refresh if (error.response?.status === 401 && !originalRequest._retry) { originalRequest._retry = true; try { const refreshToken = localStorage.getItem('refresh_token'); if (!refreshToken) { throw new Error('No refresh token'); } const response = await axios.post(`${API_BASE_URL}/auth/refresh/`, { refresh: refreshToken }); const { access } = response.data; localStorage.setItem('access_token', access); apiClient.defaults.headers.common['Authorization'] = `Bearer ${access}`; originalRequest.headers['Authorization'] = `Bearer ${access}`; return apiClient(originalRequest); } catch (refreshError) { // Refresh failed - clear tokens and redirect to login localStorage.removeItem('access_token'); localStorage.removeItem('refresh_token'); window.location.href = '/login'; return Promise.reject(refreshError); } } return Promise.reject(error); } ); export default apiClient;