eli02's picture
feat: Implement MainLayout component for consistent layout structure
3299552
raw
history blame contribute delete
1.86 kB
import axios from 'axios';
// Replace with your actual HF Space backend URL
const API_BASE_URL = process.env.REACT_APP_API_URL || 'https://humblebeeai-al-ghazali-rag-retrieval-api.hf.space';
const api = axios.create({
baseURL: API_BASE_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Helper to get tokens from localStorage
function getAuthTokens() {
const tokens = localStorage.getItem('authTokens');
return tokens ? JSON.parse(tokens) : null;
}
// Request interceptor to add auth token
api.interceptors.request.use(
(config) => {
const tokens = getAuthTokens();
if (tokens?.access) {
config.headers['Authorization'] = `Bearer ${tokens.access}`;
}
return config;
},
(error) => Promise.reject(error)
);
// Response interceptor to handle token refresh
api.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
if (error.response && error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
const tokens = getAuthTokens();
if (!tokens?.refresh) throw new Error('No refresh token');
const response = await axios.post(`${API_BASE_URL}/refresh`, {
refresh_token: tokens.refresh
});
const newTokens = {
access: response.data.access_token,
refresh: response.data.refresh_token
};
localStorage.setItem('authTokens', JSON.stringify(newTokens));
originalRequest.headers['Authorization'] = `Bearer ${newTokens.access}`;
return api(originalRequest);
} catch (refreshError) {
localStorage.removeItem('authTokens');
window.location.href = '/';
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
export default api;