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); } } } });