/**
* @file Configuración de la API y función de fetch.
* @description Centraliza la URL base, los endpoints y una función `apiFetch` para realizar peticiones al backend.
*/
/**
* @constant {string} API_URL
* @description La URL base del backend, obtenida de las variables de entorno o un valor por defecto.
* Lee de la variable de entorno REACT_APP_API_URL.
* Fallback a http://localhost:4000 solo para desarrollo local.
* ⚠️ IMPORTANTE: En producción, REACT_APP_API_URL DEBE estar configurada en las variables de entorno.
*/
const API_URL = process.env.REACT_APP_API_URL || 'http://localhost:4000';
/**
* @namespace apiConfig
* @description Un objeto que contiene la configuración de la API.
* @property {string} baseURL - La URL base del backend.
* @property {object} endpoints - Un objeto con los endpoints específicos de la API.
*/
// Exportar la configuración
export const apiConfig = {
baseURL: API_URL,
endpoints: {
register: `${API_URL}/api/auth/register`,
login: `${API_URL}/api/auth/login`,
profile: `${API_URL}/api/auth/profile`,
registros: `${API_URL}/api/registros`,
}
};
/**
* @function apiFetch
* @description Una función de ayuda para realizar peticiones `fetch` a la API, añadiendo automáticamente el token de autenticación.
* @param {string} endpoint - El endpoint de la API al que se hará la petición.
* @param {object} [options={}] - Opciones adicionales para la petición `fetch`.
* @returns {Promise<Response>} La respuesta de la petición `fetch`.
* @async
*/
// Función helper para hacer fetch con configuración por defecto
export const apiFetch = async (endpoint, options = {}) => {
// Obtener el estado de autenticación desde el storage de Zustand
const authStorage = localStorage.getItem('auth-storage');
let token = null;
if (authStorage) {
try {
const parsed = JSON.parse(authStorage);
// Zustand persist guarda el estado dentro de una propiedad 'state'
const state = parsed.state || parsed;
if (state && state.token && state.token.trim() !== '') {
token = state.token;
console.log('✅ Token obtenido del localStorage:', token.substring(0, 20) + '...');
} else {
console.warn('⚠️ Token vacío o no válido en localStorage');
}
} catch (e) {
console.error("❌ Error parsing auth-storage from localStorage", e);
}
} else {
console.warn('⚠️ No se encontró auth-storage en localStorage');
}
const defaultHeaders = {
'Content-Type': 'application/json',
};
// Si existe un token, añadirlo a los headers de autorización
if (token && token.trim() !== '') {
defaultHeaders['Authorization'] = `Bearer ${token}`;
console.log('✅ Authorization header añadido');
} else {
console.warn('⚠️ No Authorization header será añadido (token vacío o no válido)');
}
const defaultOptions = {
headers: {
...defaultHeaders,
...(options.headers || {}),
},
mode: 'cors',
...options,
};
console.log('📤 Realizando fetch a:', endpoint);
console.log('📋 Headers:', defaultOptions.headers);
const response = await fetch(endpoint, defaultOptions);
return response;
};
export default apiConfig;