45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
import type { AxiosRequestConfig } from 'axios';
|
|
import axios, { AxiosError } from 'axios';
|
|
import { router } from '@/lib/router';
|
|
import { doRefreshToken, getRefreshToken, getToken, setRefreshToken, setToken } from './token';
|
|
|
|
export const axiosClient = axios.create({
|
|
baseURL: '/api/v1/',
|
|
});
|
|
|
|
axiosClient.interceptors.request.use((config) => {
|
|
const token = getToken();
|
|
if (token !== null) {
|
|
config.headers = config.headers ?? {};
|
|
config.headers.Authorization = `Bearer ${token}`;
|
|
}
|
|
return config;
|
|
});
|
|
|
|
type RetryConfig = AxiosRequestConfig & { _retry?: boolean };
|
|
|
|
axiosClient.interceptors.response.use(undefined, async (error: AxiosError) => {
|
|
const originalRequest = error.config as RetryConfig | undefined;
|
|
if (!error.response || error.response.status !== 401 || !originalRequest) {
|
|
return Promise.reject(error);
|
|
}
|
|
|
|
if (error.response.status === 401 && getRefreshToken() !== null) {
|
|
try {
|
|
const maybeRefreshTokenValue = await doRefreshToken();
|
|
const { access_token, refresh_token } = maybeRefreshTokenValue.data;
|
|
originalRequest.headers = originalRequest.headers ?? {};
|
|
originalRequest.headers.Authorization = `Bearer ${access_token}`;
|
|
setToken(access_token);
|
|
setRefreshToken(refresh_token);
|
|
return await axiosClient(originalRequest);
|
|
}
|
|
catch (e) {
|
|
if (e instanceof AxiosError && e.status === 401) {
|
|
await router.navigate({ to: '/login' });
|
|
return Promise.reject(error);
|
|
}
|
|
}
|
|
}
|
|
});
|