import axios from 'axios'; const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000'; export const apiClient = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', }, withCredentials: true, }); // Request interceptor to add auth token apiClient.interceptors.request.use( (config) => { const token = localStorage.getItem('accessToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { return Promise.reject(error); } ); // Response interceptor to handle token refresh apiClient.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; // If error is 401 and we haven't tried to refresh yet if (error.response?.status === 401 && !originalRequest._retry) { originalRequest._retry = true; try { const refreshToken = localStorage.getItem('refreshToken'); if (!refreshToken) { throw new Error('No refresh token'); } const response = await axios.post(`${API_BASE_URL}/api/v1/auth/refresh`, { refreshToken, }); const { accessToken } = response.data; localStorage.setItem('accessToken', accessToken); // Retry original request with new token originalRequest.headers.Authorization = `Bearer ${accessToken}`; return apiClient(originalRequest); } catch (refreshError) { // Refresh failed, clear tokens and redirect to login localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); window.location.href = '/login'; return Promise.reject(refreshError); } } return Promise.reject(error); } ); export default apiClient;