115 lines
2.7 KiB
TypeScript
115 lines
2.7 KiB
TypeScript
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 } 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<Tokens> {
|
|
const response = await base.post<Tokens>('/auth', auth);
|
|
return response.data;
|
|
},
|
|
|
|
async refreshToken(): Promise<Tokens> {
|
|
const token = localStorage.getItem('refreshToken');
|
|
const response = await base.post<Tokens>(
|
|
'/auth/refresh',
|
|
{},
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${token}`,
|
|
},
|
|
}
|
|
);
|
|
return response.data;
|
|
},
|
|
|
|
// user
|
|
async getProfile(): Promise<User> {
|
|
const response = await base.get<User>('/profile');
|
|
return response.data;
|
|
},
|
|
|
|
async getUsers(page: number, limit: number): Promise<any> {
|
|
const response = await base.get<User[]>(
|
|
`/account?page=${page}&limit=${limit}`
|
|
);
|
|
return response.data;
|
|
},
|
|
};
|
|
|
|
export default api;
|