rinogeek's picture
Initial commit: EduLab Frontend for Hugging Face Spaces
aa6ef1d
import axios from 'axios';
// Configuration de l'API
// Développé par Marino ATOHOUN pour Hypee
const API_URL = import.meta.env.VITE_API_URL || 'http://127.0.0.1:8000/api/';
const api = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Instance pour les requêtes publiques (sans token)
export const publicApi = axios.create({
baseURL: API_URL,
headers: {
'Content-Type': 'application/json',
},
});
// Intercepteur pour ajouter le token JWT à chaque requête
api.interceptors.request.use(
(config) => {
const token = localStorage.getItem('access_token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
// Intercepteur pour gérer les erreurs (ex: token expiré)
api.interceptors.response.use(
(response) => response,
async (error) => {
const originalRequest = error.config;
// Si erreur 401 (Non autorisé) et qu'on n'a pas déjà essayé de rafraîchir
if (error.response?.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
const refreshToken = localStorage.getItem('refresh_token');
if (refreshToken) {
const response = await axios.post(`${API_URL}token/refresh/`, {
refresh: refreshToken
});
const { access } = response.data;
localStorage.setItem('access_token', access);
// Réessayer la requête originale avec le nouveau token
originalRequest.headers['Authorization'] = `Bearer ${access}`;
return api(originalRequest);
}
} catch (refreshError) {
// Si le refresh échoue, on déconnecte l'utilisateur
localStorage.removeItem('access_token');
localStorage.removeItem('refresh_token');
// Ne pas rediriger automatiquement ici pour éviter les boucles sur les pages publiques
// window.location.href = '/login';
}
}
return Promise.reject(error);
}
);
export default api;