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 (
);
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 */}
{info?.espacio_utilizado_gb?.toFixed(2)} GB
{info?.espacio_disponible_bytes ? (info.espacio_disponible_bytes / (1024 * 1024 * 1024)).toFixed(2) : 0} GB
{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... */}
);
}