import { isEmpty, isNil } from 'lodash-es'; import { client } from '@/client/client.gen'; import { doRefreshToken, getAccessToken, getRefreshToken, logout, setAccessToken, setRefreshToken, } from './token'; export function configInternalApiClient() { client.setConfig({ baseUrl: '/api/v1/', headers: { 'X-Api-Version': 'latest', }, }); client.interceptors.request.use((request) => { const token = getAccessToken(); if (!isNil(token) && !isEmpty(token)) { request.headers.set('Authorization', `Bearer ${token}`); } return request; }); client.interceptors.response.use(async (response, request, options) => { if (response.status === 401) { // Avoid infinite loop if the refresh token request itself fails if (request.url.includes('/auth/refresh')) { // Refresh token failed, clear tokens and redirect to login page logout('Session expired'); } else { const refreshToken = getRefreshToken(); if (isNil(refreshToken) || isEmpty(refreshToken)) { logout('You are not logged in'); } else { const refreshResponse = await doRefreshToken(refreshToken); if (!isEmpty(refreshResponse)) { const { access_token, refresh_token } = refreshResponse; setAccessToken(access_token!); setRefreshToken(refresh_token!); const fetchFn = options.fetch ?? globalThis.fetch; const headers = new Headers(request.headers); headers.set('Authorization', `Bearer ${access_token}`); return fetchFn(request.url, { method: request.method, headers, body: (options.serializedBody ?? options.body) as BodyInit | null | undefined, signal: request.signal, }); } } } } return response; }); }