import React, { useEffect, useState } from 'react'; import { fetchWithAuth } from '../fetchWithAuth'; // Animación fade-in/slide-up para cards const fadeInSlideUp = `@keyframes fadein-slideup { 0% { opacity: 0; transform: translateY(40px); } 100% { opacity: 1; transform: translateY(0); } }`; // Inyectar animación global si no existe if (typeof document !== 'undefined' && !document.getElementById('fadein-slideup-admin')) { const style = document.createElement('style'); style.id = 'fadein-slideup-admin'; style.innerHTML = fadeInSlideUp; document.head.appendChild(style); } import TestTailwind from '../components/TestTailwind'; import { colors } from '../theme'; const API_URL = import.meta.env.VITE_EFC_API_URL; export default function Admin() { // Leer grupos del usuario desde localStorage let userGroups = []; if (typeof window !== 'undefined') { try { userGroups = JSON.parse(localStorage.getItem('user_groups') || '[]'); } catch { userGroups = []; } } // Si los grupos son exactamente [3,5] const isGroup35 = Array.isArray(userGroups) && userGroups.length === 2 && userGroups.includes(3) && userGroups.includes(5); // Estado de servicios const [services, setServices] = useState(null); // Estado de descargas const [downloads, setDownloads] = useState(null); // Últimos documentos const [latestDocs, setLatestDocs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); // Estado para análisis de actividad de usuario const [userActivity, setUserActivity] = useState(null); useEffect(() => { async function fetchData() { setLoading(true); setError(''); try { // Servicios const resServices = await fetchWithAuth(`${API_URL}/cards/services-util-information/`); if (!resServices.ok) throw new Error('Error al obtener estados de servicios'); const dataServices = await resServices.json(); setServices(dataServices); // Descargas const resDownloads = await fetchWithAuth(`${API_URL}/cards/document-util-information/`); if (!resDownloads.ok) throw new Error('Error al obtener información de descargas'); const dataDownloads = await resDownloads.json(); setDownloads(dataDownloads); // Últimos documentos const resDocs = await fetchWithAuth(`${API_URL}/cards/downloaded-documents/`); if (!resDocs.ok) throw new Error('Error al obtener últimos documentos'); const dataDocs = await resDocs.json(); setLatestDocs(dataDocs.documentos); // Análisis de actividad de usuario const resUserActivity = await fetchWithAuth(`${API_URL}/cards/user-activity-analysis/`); if (!resUserActivity.ok) throw new Error('Error al obtener análisis de actividad de usuario'); const dataUserActivity = await resUserActivity.json(); setUserActivity(dataUserActivity); } catch (err) { console.error('Error fetching admin data:', err); setError(err instanceof Error ? err.message : String(err)); } finally { setLoading(false); } } fetchData(); }, []); // Helper para nombre de archivo // Helper para nombre de archivo function getFileName(path) { return path.split('/').pop() || path; } return (
{/* Header + Estado del Sistema alineados horizontalmente */}
{/* Header principal mejorado */}

Panel de Administración {services && ( {services.en_espera} en espera )}

{typeof window !== 'undefined' && localStorage.getItem('user_is_importador') === 'true' ? 'Dashboard principal para gestión de Expediente electrónico' : 'Dashboard principal para gestión de agencia aduanal'}

{/* Efectos decorativos de fondo modernos */}
{/* Partículas flotantes */}
{/* Animación personalizada para el icono y contador */}
{/* Estado del Sistema card a la derecha */}

Estado del Sistema

API Backend Conectado
API Servicios Conectado
Última Actualización Hace 2 min
{/* Efecto decorativo de fondo modernizado */}
{/* Animación personalizada para el icono */}
{/* Stats Cards con datos de endpoints */}
{/* Estados de servicios */}

Procesos en Espera

{services ? services.en_espera : '-'}

Total: {services ? services.procesos_filtrados : '-'}

En Proceso

{services ? services.en_proceso : '-'}

Finalizados: {services ? services.finalizados : '-'}

Con Error

{services ? services.con_error : '-'}

Finalizados: {services ? services.finalizados : '-'}

{/* Descargas */}

Descargados 1 día

{downloads ? downloads.archivos_ultimas_1_dia : '-'}

7 días: {downloads ? downloads.archivos_ultimos_7_dias : '-'} | 30 días: {downloads ? downloads.archivos_ultimos_30_dias : '-'}
{/* Tabla de últimos documentos */}

Últimos documentos agregados

{loading ? (
Cargando...
) : error ? (
{error}
) : ( <> {/* Vista de tabla para pantallas grandes */}
{latestDocs.map((doc, index) => ( ))}
Archivo Pedimento Organización Fecha
{getFileName(doc.archivo)}
{doc.pedimento} {doc.organizacion} {new Date(doc.created_at).toLocaleString('es-MX', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
{/* Vista de tarjetas para pantallas pequeñas y medianas */}
{latestDocs.map((doc, index) => (
{getFileName(doc.archivo)}
Pedimento: {doc.pedimento}
Organización: {doc.organizacion}
Fecha: {new Date(doc.created_at).toLocaleString('es-MX', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
))}
)}
); }