Spaces:
Running
Running
| 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; | |