|
import axios from 'axios'; |
|
import cookieService from '../services/cookieService'; |
|
|
|
|
|
const API_BASE_URL = import.meta.env.VITE_API_URL || 'http://localhost:5000'; |
|
const apiClient = axios.create({ |
|
baseURL: API_BASE_URL, |
|
timeout: 30000, |
|
headers: { |
|
'Content-Type': 'application/json', |
|
}, |
|
withCredentials: true, |
|
}); |
|
|
|
|
|
apiClient.interceptors.request.use( |
|
async (config) => { |
|
|
|
const tokens = await cookieService.getAuthTokens(); |
|
if (tokens?.accessToken) { |
|
config.headers.Authorization = `Bearer ${tokens.accessToken}`; |
|
} |
|
return config; |
|
}, |
|
(error) => { |
|
return Promise.reject(error); |
|
} |
|
); |
|
|
|
|
|
apiClient.interceptors.response.use( |
|
(response) => { |
|
return response; |
|
}, |
|
async (error) => { |
|
const originalRequest = error.config; |
|
|
|
|
|
if (error.response?.status === 401 && !originalRequest._retry) { |
|
originalRequest._retry = true; |
|
|
|
try { |
|
|
|
|
|
|
|
await cookieService.clearAuthTokens(); |
|
localStorage.removeItem('token'); |
|
window.location.href = '/login'; |
|
} catch (refreshError) { |
|
|
|
await cookieService.clearAuthTokens(); |
|
localStorage.removeItem('token'); |
|
window.location.href = '/login'; |
|
return Promise.reject(refreshError); |
|
} |
|
} |
|
|
|
return Promise.reject(error); |
|
} |
|
); |
|
|
|
export default apiClient; |