const factory = createHttpClientFactory();
factory.addRequestInterceptor(async (data, next) => {
data.request = new Request(data.request, {
headers: new Headers({
...Object.fromEntries(data.request.headers.entries()),
'Authorization': `Bearer ${JSON.parse(localStorage.getItem('user'))?.token}`
}),
});
console.log('Request interceptor 1', data.request);
next();
});
factory.addResponseInterceptor(
async (data, next) => {
console.log('Response interceptor 1', data.request, data.response);
next();
},
async (data, next) => {
console.log('Response interceptor for auth', data.request, data.response);
if (data.response.status === 401) {
let refresh = JSON.parse(localStorage.getItem("user"))?.refresh;
if (refresh !== undefined && refresh !== null) {
try {
const refreshResponse = await fetch(
import.meta.env.VITE_BACKEND_URL + "/user/refresh",
{
method: 'GET',
headers: {
'Authorization': 'Bearer ' + refresh
}
}
);
if (refreshResponse.status === 200) {
const responseData = await refreshResponse.json();
const userStr = localStorage.getItem("user");
let user = userStr ? JSON.parse(userStr) : {};
localStorage.setItem("user", JSON.stringify({...user, ...responseData}));
const newHeaders = new Headers(data.request.headers);
newHeaders.set('Authorization', 'Bearer ' + responseData.token);
const newRequest = new Request(data.request, {
headers: newHeaders
});
console.log('New request', newRequest);
console.log('Original request', data.request);
data.response = await fetch(newRequest);
return next();
} else {
localStorage.removeItem('user');
const { navigate } = await import('wouter/use-browser-location');
navigate("/login", {replace: true});
return next();
}
} catch (error) {
console.error("Error in refresh token flow:", error);
localStorage.removeItem('user');
const { navigate } = await import('wouter/use-browser-location');
navigate("/login", {replace: true});
return next(error);
}
} else {
localStorage.removeItem('user');
const { navigate } = await import('wouter/use-browser-location');
navigate("/login", {replace: true});
return next();
}
}
return next();
}
);
const httpClient = factory.create(import.meta.env.VITE_BACKEND_URL);
let response = await httpClient.send(`/action-logs/search?page=${page}&page_size=${pageSize}`);
if (!response.ok) {
throw new Error('Failed to fetch action logs');
}
const data = await response.json();