import { boot } from 'quasar/wrappers'; import axios from 'axios'; import { API_BASE_URL } from 'src/config/api-config'; // Create axios instance const api = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', }, }); // Request interceptor api.interceptors.request.use( (config) => { const token = localStorage.getItem('token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => { return Promise.reject(new Error(String(error))); } ); // Response interceptor api.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; // If error is 401 and we haven't tried to refresh token 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 available'); } // Call refresh token endpoint const response = await api.post('/api/v1/auth/refresh-token', { refresh_token: refreshToken, }); const { access_token } = response.data; localStorage.setItem('token', access_token); // Retry the original request with new token originalRequest.headers.Authorization = `Bearer ${access_token}`; return api(originalRequest); } catch (refreshError) { // If refresh token fails, clear storage and redirect to login localStorage.removeItem('token'); localStorage.removeItem('refreshToken'); window.location.href = '/login'; return Promise.reject(new Error(String(refreshError))); } } return Promise.reject(new Error(String(error))); } ); export default boot(({ app }) => { app.config.globalProperties.$axios = axios; app.config.globalProperties.$api = api; }); export { api };