import React, { useState, useEffect } from 'react'; import { fetchOrganizationUsage } from '../api/organization'; import { useNotification } from '../context/NotificationContext'; import '../assets/organization-animations.css'; export default function Organization() { const [info, setInfo] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const { showMessage } = useNotification(); // Estado para animar el progress bar const [animatedPercent, setAnimatedPercent] = useState(0); useEffect(() => { const token = localStorage.getItem('access'); if (!token) { setError('No se encontró el token de acceso.'); setLoading(false); return; } fetchOrganizationUsage(token) .then(data => { setInfo(data); setLoading(false); }) .catch(err => { if (err.message === 'SESSION_EXPIRED') { localStorage.removeItem('access'); localStorage.removeItem('refresh'); showMessage('Tu sesión ha expirado, por favor inicia sesión de nuevo.', 'error'); setTimeout(() => { window.location.href = '/login'; }, 2000); } else { setError(err.message); } setLoading(false); }); }, [showMessage]); // Animación del progress bar useEffect(() => { if (!info) return; const used = info.espacio_utilizado_gb || 0; const limit = info.limite_almacenamiento_gb || 1; const percent = Math.min(100, (100 * used / limit)); let start = 0; // Si ya está en el valor correcto, no animar if (animatedPercent === percent) return; // Animar de 0 a percent const step = () => { setAnimatedPercent(prev => { if (prev < percent) { const next = Math.min(prev + 2, percent); // velocidad de animación if (next < percent) { setTimeout(step, 10); } return next; } else { return percent; } }); }; setAnimatedPercent(0); setTimeout(step, 200); // pequeño delay para que se note la animación // eslint-disable-next-line }, [info]); if (loading) return (

Cargando información

Obteniendo datos de la organización...

); if (error) return (

Error al cargar

{error}

); return (
{/* Header mejorado y decorativo */}

Mi Organización {info && ( {info.total_usuarios} usuarios )}

Información y métricas de uso de tu organización

{/* Efectos decorativos de fondo modernos */}
{/* Partículas flotantes */}
{/* Animación personalizada para el icono y contador */}
{/* Barra de almacenamiento con color y progress bar */}

Uso de Almacenamiento

{/* Estadísticas rápidas */}
Usado
{info?.espacio_utilizado_gb?.toFixed(2)} GB
Disponible
{info?.espacio_disponible_bytes ? (info.espacio_disponible_bytes / (1024 * 1024 * 1024)).toFixed(2) : 0} GB
Límite
{info?.limite_almacenamiento_gb} GB
{/* Barra de progreso mejorada */}
{/* Progress bar de color dinámico según porcentaje */} {(() => { const used = info?.espacio_utilizado_gb || 0; const limit = info?.limite_almacenamiento_gb || 1; const percent = Math.min(100, (100 * used / limit)); let barColor = 'linear-gradient(90deg, #22c55e 0%, #16a34a 100%)'; // verde if (animatedPercent >= 80) { barColor = 'linear-gradient(90deg, #ef4444 0%, #b91c1c 100%)'; // rojo } else if (animatedPercent >= 50) { barColor = 'linear-gradient(90deg, #f59e42 0%, #d97706 100%)'; // naranja } return (
{animatedPercent > 20 && ( {animatedPercent.toFixed(1)}% )}
); })()} {/* Indicador de porcentaje fuera de la barra si es muy pequeña */} {animatedPercent <= 20 && (
{animatedPercent.toFixed(1)}%
)}
{/* Tarjeta Organización */}
Organización {info?.organizacion}
{/* Tarjeta Usuarios */}
Usuarios {info?.total_usuarios}
{/* Tarjeta Pedimentos */}
Pedimentos {info?.total_pedimentos}
{/* Tarjeta Documentos */}
Documentos {info?.total_documentos}
{/* Tarjeta Límite de Almacenamiento */}
Límite de Almacenamiento {info?.limite_almacenamiento_gb} GB
{/* Tarjeta Espacio Utilizado */}
Espacio Utilizado {info?.espacio_utilizado_gb?.toFixed(2)} GB
{/* Tarjeta Espacio Disponible */}
Espacio Disponible {info?.espacio_disponible_bytes ? (info.espacio_disponible_bytes / (1024 * 1024 * 1024)).toFixed(2) : 0} GB
{/* Tarjeta Porcentaje Utilizado */}
Porcentaje Utilizado {info?.porcentaje_utilizado}%
{/* ...existing code... */}
); }