92 lines
2.5 KiB
TypeScript
92 lines
2.5 KiB
TypeScript
/**
|
|
* Hook para obtener estadísticas de contenido
|
|
*/
|
|
|
|
import { useState, useEffect } from 'react';
|
|
import axios from 'axios';
|
|
|
|
const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000';
|
|
|
|
const api = axios.create({
|
|
baseURL: `${API_URL}/api`,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
|
|
// Interceptor para añadir token
|
|
api.interceptors.request.use((config) => {
|
|
const token = localStorage.getItem('admin_token');
|
|
if (token) {
|
|
config.headers.Authorization = `Bearer ${token}`;
|
|
}
|
|
return config;
|
|
});
|
|
|
|
export function useContentStats() {
|
|
const [stats, setStats] = useState({
|
|
protocols: 0,
|
|
protocolsPublished: 0,
|
|
guides: 0,
|
|
guidesPublished: 0,
|
|
drugs: 0,
|
|
drugsPublished: 0,
|
|
checklists: 0,
|
|
checklistsPublished: 0,
|
|
});
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
async function fetchStats() {
|
|
try {
|
|
const response = await api.get('/stats/content');
|
|
const data = response.data;
|
|
|
|
console.log('📊 Estadísticas recibidas:', data);
|
|
|
|
// El backend ahora devuelve el formato esperado directamente
|
|
setStats({
|
|
protocols: data.protocols || 0,
|
|
protocolsPublished: data.protocolsPublished || 0,
|
|
guides: data.guides || 0,
|
|
guidesPublished: data.guidesPublished || 0,
|
|
drugs: data.drugs || 0,
|
|
drugsPublished: data.drugsPublished || 0,
|
|
checklists: data.checklists || 0,
|
|
checklistsPublished: data.checklistsPublished || 0,
|
|
});
|
|
|
|
console.log('✅ Estadísticas cargadas correctamente');
|
|
} catch (error: any) {
|
|
console.error('❌ Error cargando estadísticas:', error);
|
|
console.error('Detalles del error:', error.response?.data || error.message);
|
|
console.error('Status:', error.response?.status);
|
|
|
|
// Si es error 401, el token puede estar expirado
|
|
if (error.response?.status === 401) {
|
|
console.warn('⚠️ Token expirado o inválido. Por favor, inicia sesión nuevamente.');
|
|
}
|
|
|
|
// Mantener valores por defecto (0)
|
|
setStats({
|
|
protocols: 0,
|
|
protocolsPublished: 0,
|
|
guides: 0,
|
|
guidesPublished: 0,
|
|
drugs: 0,
|
|
drugsPublished: 0,
|
|
checklists: 0,
|
|
checklistsPublished: 0,
|
|
});
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
}
|
|
|
|
fetchStats();
|
|
}, []);
|
|
|
|
return { stats, isLoading };
|
|
}
|
|
|