Files
cms-server/client/cms/src/lib/client.ts
Noa Virellia 6ea414bc88
Some checks failed
Backend Check Build (NixCN CMS) TeamCity build finished
Client CMS Check Build (NixCN CMS) TeamCity build failed
fix(client): logout
Signed-off-by: Noa Virellia <noa@requiem.garden>
2026-01-30 22:48:09 +08:00

64 lines
1.9 KiB
TypeScript

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