import axios from 'axios'; // import { Auth, Tokens } from '../types/auth'; import axiosRetry from 'axios-retry'; import { Auth, Tokens } from '@/types/auth'; import { useAuthStore } from '@/store/authStore'; import { AuthService } from '@/services/authService'; import { User, UserUpdate } from '@/types/user'; const baseURL = `${import.meta.env.VITE_APP_HTTP_PROTOCOL}://${ import.meta.env.VITE_APP_API_URL }/api/v1`; const base = axios.create({ baseURL, withCredentials: true, headers: { accepts: 'application/json', }, }); base.interceptors.request.use((config) => { if (config.url === '/auth/refresh') { return config; } const token = useAuthStore.getState().accessToken; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); axiosRetry(base, { retries: 3, retryDelay: (retryCount: number) => { console.log(`retry attempt: ${retryCount}`); return retryCount * 2000; }, retryCondition: async (error: any) => { if (error.code === 'ERR_CANCELED') { return true; } return false; }, }); base.interceptors.response.use( (response) => { return response; }, async function (error) { if (!error.response) { return Promise.reject(error); } console.log('error', error); const originalRequest = error.response.config; const urlTokens = error?.request?.responseURL.split('/'); const url = urlTokens[urlTokens.length - 1]; console.log('url', url); if ( error.response.status === 401 && !(originalRequest?._retry != null) && url !== 'login' && url !== 'refresh' && url !== 'logout' ) { originalRequest._retry = true; try { await AuthService.refresh(); return base(originalRequest); } catch (error) { await AuthService.logout(); return new Promise(() => {}); } } return await Promise.reject(error); } ); const api = { // auth async login(auth: Auth): Promise { const response = await base.post('/auth', auth); return response.data; }, async refreshToken(): Promise { const token = localStorage.getItem('refreshToken'); const response = await base.post( '/auth/refresh', {}, { headers: { Authorization: `Bearer ${token}`, }, } ); return response.data; }, // user async getProfile(): Promise { const response = await base.get('/profile'); return response.data; }, async getUsers(page: number, limit: number): Promise { const response = await base.get( `/account?page=${page}&limit=${limit}` ); return response.data; }, async getUserById(userId: number): Promise { const response = await base.get(`/account/${userId}`); return response.data; }, async createUser(user: UserUpdate): Promise { const response = await base.post('/account', user); return response.data; }, }; export default api;