import axios from 'axios'; import AsyncStorage from '@react-native-async-storage/async-storage'; import * as SecureStore from 'expo-secure-store'; const API_BASE_URL = `http://10.0.2.2:32768/mobile`; export const KEY_TOKEN = 'auth_key'; // Crea un'istanza di axios const api = axios.create({ baseURL: API_BASE_URL, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, timeout: 10000, // 10 secondi timeout }); // Interceptor: Aggiunge il token a OGNI richiesta se esiste api.interceptors.request.use( async (config) => { const token = await SecureStore.getItemAsync(KEY_TOKEN); if (token) { config.headers.Authorization = `Bearer ${token}`; } console.log(`[API REQUEST] ${config.method?.toUpperCase()} ${config.url}`); return config; }, (error) => { return Promise.reject(error); } ); // Interceptor: Gestione errori globale (es. token scaduto) api.interceptors.response.use( (response) => response, async (error) => { const originalRequest = error.config; if (error.response) { console.error('[API ERROR]', error.response.status, error.response.data); // Se riceviamo 401 (Unauthorized), potremmo voler fare il logout forzato if (error.response.status === 401) { // TODO: Qui potresti emettere un evento per disconnettere l'utente await SecureStore.deleteItemAsync(KEY_TOKEN); } } else { console.error('[API NETWORK ERROR]', error.message); } return Promise.reject(error); } ); export default api;