import axios from 'axios' import { useToast } from 'vue-toastification' import router from '@/router' // Configuration de l'URL de base selon l'environnement const getBaseURL = () => { // Récupérer l'environnement depuis les variables Vite const environment = import.meta.env.VITE_ENVIRONMENT || 'local' // Log de debug pour l'environnement console.log(`🌍 Frontend - Environnement détecté: ${environment}`) console.log(`🔗 API URL: ${import.meta.env.VITE_API_URL}`) console.log(`🔧 VITE_ENVIRONMENT: ${import.meta.env.VITE_ENVIRONMENT}`) console.log(`🔧 NODE_ENV: ${import.meta.env.NODE_ENV}`) // Utiliser directement la variable d'environnement VITE_API_URL // qui est déjà configurée correctement pour chaque environnement const apiUrl = import.meta.env.VITE_API_URL if (!apiUrl) { console.warn('⚠️ VITE_API_URL non définie, utilisation de la valeur par défaut') // Valeurs par défaut selon l'environnement switch (environment) { case 'production': return 'https://api.lediscord.com' case 'development': return 'https://api-dev.lediscord.com' // API externe HTTPS en développement case 'local': default: return 'http://localhost:8000' } } console.log(`🎯 URL finale utilisée: ${apiUrl}`) return apiUrl } // Configuration de l'instance axios const instance = axios.create({ baseURL: getBaseURL(), timeout: 30000, headers: { 'Content-Type': 'application/json' } }) // Log de la configuration console.log(`🚀 Axios configuré avec l'URL de base: ${getBaseURL()}`) // Request interceptor instance.interceptors.request.use( config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = `Bearer ${token}` } // Log des requêtes en développement if (import.meta.env.DEV) { console.log(`📤 Requête ${config.method?.toUpperCase()} vers: ${config.url}`) } return config }, error => { console.error('❌ Erreur dans l\'intercepteur de requête:', error) return Promise.reject(error) } ) // Response interceptor instance.interceptors.response.use( response => { // Log des réponses en développement if (import.meta.env.DEV) { console.log(`📥 Réponse ${response.status} de: ${response.config.url}`) } return response }, error => { const toast = useToast() // Log détaillé des erreurs console.error('❌ Erreur API:', { status: error.response?.status, statusText: error.response?.statusText, url: error.config?.url, method: error.config?.method, data: error.response?.data }) if (error.response?.status === 401) { // Ne pas rediriger si on est déjà sur une page d'auth const currentRoute = router.currentRoute.value if (!currentRoute.path.includes('/login') && !currentRoute.path.includes('/register')) { localStorage.removeItem('token') router.push('/login') toast.error('Session expirée, veuillez vous reconnecter') } } else if (error.response?.status === 403) { toast.error('Accès non autorisé') } else if (error.response?.status === 500) { toast.error('Erreur serveur, veuillez réessayer plus tard') } else if (error.code === 'ECONNABORTED') { toast.error('Délai d\'attente dépassé, veuillez réessayer') } else if (!error.response) { toast.error('Erreur de connexion, vérifiez votre connexion internet') } return Promise.reject(error) } ) export default instance // Fonction utilitaire pour construire les URLs des médias export function getMediaUrl(path) { if (!path) return null if (typeof path !== 'string') return path if (path.startsWith('http')) return path const baseUrl = getBaseURL() // Déjà un chemin uploads complet if (path.startsWith('/uploads/')) { return `${baseUrl}${path}` } // Chemins relatifs issus de l'API (ex: /avatars/..., /vlogs/..., /albums/...) if (path.startsWith('/')) { return `${baseUrl}/uploads${path}` } // Fallback return `${baseUrl}/uploads/${path}` } // Fonction utilitaire pour obtenir l'environnement actuel export function getCurrentEnvironment() { return import.meta.env.VITE_ENVIRONMENT || 'local' } // Fonction utilitaire pour vérifier si on est en production export function isProduction() { return getCurrentEnvironment() === 'production' } // Fonction utilitaire pour vérifier si on est en développement export function isDevelopment() { return getCurrentEnvironment() === 'development' } // Fonction utilitaire pour vérifier si on est en local export function isLocal() { return getCurrentEnvironment() === 'local' } // Fonction utilitaire pour obtenir l'URL de l'API export function getApiUrl() { return import.meta.env.VITE_API_URL || getBaseURL() } // Fonction utilitaire pour obtenir l'URL de l'application export function getAppUrl() { return import.meta.env.VITE_APP_URL || window.location.origin }