/* global React */
// Home (hub principal). Rediseño: saludo breve, "Requiere tu atención" con
// 3 tarjetas accionables y accesos rápidos compactos.
// ---------------- Pendientes por rol ----------------
function getFocusItems(roleId) {
if (roleId === 'institucion') {
return [
{ icon: 'AlertCircle', num: '1', label: 'Reporte devuelto para ajuste', tone: 'warn', go: 'mis_compromisos' },
{ icon: 'Clock', num: '3', label: 'Plazos vencen esta semana', tone: 'danger', go: 'alertas' },
{ icon: 'MessageSquare', num: '2', label: 'Mensajes sin leer', tone: 'info', go: 'mensajeria' },
];
}
if (roleId === 'cancilleria') {
return [
{ icon: 'FileText', num: '3', label: 'Reportes aprobados nuevos', tone: 'ok', go: 'reportes_aprobados' },
{ icon: 'Calendar', num: 'V', label: 'Ronda MESICIC en curso', tone: 'info', go: 'reportes_aprobados' },
{ icon: 'MessageSquare', num: '1', label: 'Mensaje sin leer', tone: 'info', go: 'mensajeria' },
];
}
return [
{ icon: 'Inbox', num: '7', label: 'Reportes por revisar', tone: 'warn', go: 'compromisos' },
{ icon: 'Clock', num: '5', label: 'Plazos vencen esta semana', tone: 'danger', go: 'alertas' },
{ icon: 'MessageSquare', num: '3', label: 'Mensajes sin leer', tone: 'info', go: 'mensajeria' },
];
}
// Orden de los accesos rápidos (por frecuencia de uso)
const HOME_ORDER = {
admin: ['compromisos', 'alertas', 'mensajeria', 'reportes', 'instituciones', 'usuarios'],
superadmin: ['compromisos', 'alertas', 'mensajeria', 'reportes', 'instituciones', 'usuarios', 'catalogos'],
institucion: ['mis_compromisos', 'cargar_avance', 'alertas', 'mensajeria'],
cancilleria: ['reportes_aprobados', 'mensajeria'],
};
function formatToday() {
try {
const s = new Date().toLocaleDateString('es-PY', { weekday: 'long', day: 'numeric', month: 'long' });
return s.charAt(0).toUpperCase() + s.slice(1);
} catch (e) { return ''; }
}
// "D-3" -> 3 días restantes · "D" -> 0 · "D+2" -> -2 (vencido)
function daysFromCode(code) {
if (code === 'D') return 0;
const m = /^D([+-])(\d+)$/.exec(code || '');
if (!m) return 99;
return m[1] === '-' ? Number(m[2]) : -Number(m[2]);
}
function deadlineLabel(d) {
if (d < 0) return `Vencido · ${-d} ${-d === 1 ? 'día' : 'días'}`;
if (d === 0) return 'Hoy';
if (d === 1) return 'Mañana';
return `En ${d} días`;
}
function deadlineTone(d) {
if (d < 0) return 'overdue';
if (d <= 1) return 'now';
if (d <= 3) return 'soon';
return 'normal';
}
// ---------------- Hero ----------------
function HomeHero({ user, roleId, onNavigate }) {
const I = window.Icons;
const first = user.name.split(' ')[0];
return (
{window.getGreeting()}, {first}.
Este módulo está fuera del alcance de esta primera entrega. El foco de este prototipo es la pantalla Home (hub principal). La navegación queda preparada para conectarse con las pantallas detalladas en próximas iteraciones.