Descripción
V1HomeVivo es el componente React que implementa la pantalla de inicio (home) para la vista mobile de CreaRack Pro. Es la variante V1 del HOME mobile y constituye el equivalente mobile de DesktopA. Tras el sprint s60, alcanza paridad funcional con DesktopA en las secciones principales.
Ruta: src/components/variants/mobile/V1HomeVivo.tsx
Arquitectura del componente
Hook principal: useMobileData
Centraliza todos los fetches de datos con Promise.all. Tras s60 consume 7 endpoints en paralelo:
| Endpoint | Tipo devuelto | Uso |
|---|---|---|
/api/tasks?assignee=...&status=pending&limit=10 | ApiTask[] | Mis tareas pendientes |
/api/alerts?active=1&limit=5 | ApiAlert[] | Alertas activas |
/api/team/presence | ApiMember[] | Presencia del equipo |
/api/biblioteca/stats | { total_wiki_pages: number } | Contador wiki |
/api/servers | { servers: { status: string }[] } | Conteo servidores |
/api/news?limit=3 | ApiNews[] | Nuevo en s60 — últimas 3 noticias |
/api/health | ApiHealthRow[] | Nuevo en s60 — sensores del sistema |
Dashboard-message dinámico
Un useEffect independiente llama a /api/dashboard-message solo en pantallas ≤ 768 px de ancho. Si la API devuelve { title }, el saludo estático (greeting(), <br/> {user}) se reemplaza por el headline recibido. Esto iguala el comportamiento de DesktopA.
Secciones del HOME (orden de renderizado)
- Header sticky con blur — avatar, nombre de usuario, contador de alertas
- Saludo / headline — dinámico vía
/api/dashboard-messageo fallbackgreeting() - Mis tareas — lista de tareas pendientes del usuario actual
- El equipo ahora — chips de presencia con
PersonChip - Noticias (nuevo en s60) — hasta 3 cards horizontales de
/api/news - Accesos rápidos — grid 2 columnas con
QUICKlinks estáticos - Salud del sistema (nuevo en s60) — card de estado global + máx. 4 sensores
- FAB — botón flotante con rotación 45°, abre submenú de acciones rápidas
Sección Noticias (s60)
- Consume
ApiNews[]del hookuseMobileData. - Renderiza hasta 3 cards navegables a
/news. - Cada card muestra: ★ si
pinned, chip decategory, fecha relativa (newsRelativeDate), título en1.036rem / 600. - Estados: loading (borde dashed + “Cargando noticias…”), empty (borde dashed + “Sin noticias recientes”).
- CTA “Ver todas” →
/newsvisible cuando hay al menos 1 noticia.
Helper newsRelativeDate(iso: string): string
Convierte un timestamp ISO/SQL a texto relativo en español:
| Rango | Salida |
|---|---|
| < 1 h | hace N min |
| < 24 h | hace N h |
| < 48 h | ayer |
| < 7 días | hace N días |
| ≥ 7 días | fecha corta (dd mmm) |
Sección Salud del sistema (s60)
- Consume
ApiHealthRow[]del hookuseMobileData. - Muestra un card único con:
- Indicador global calculado por
healthOverall()— punto coloreado + label. - Hasta 4 sensores individuales con dot de color, label, valor monospace.
- CTAs: “Ayuda” →
/wiki/crearack-tech--guides--biblioteca-staff-guidey “Pulse” →/biblioteca/pulse.
- Indicador global calculado por
Helper healthOverall(health: ApiHealthRow[])
// Prioridad: rojo > ámbar > verde
if (hasRed) → { status: 'fail', color: c.danger, label: 'Atención' }
if (hasAmber) → { status: 'warn', color: c.warn, label: 'Avisos' }
else → { status: 'ok', color: c.ok, label: 'Todo OK' }
Detecta #ef4444 como rojo y #f59e0b como ámbar (comparación lowercase).
FAB — acciones rápidas
Tras s60 el FAB tiene 4 opciones (antes 3):
| Icono | Label | Ruta |
|---|---|---|
| ✓ | Nueva tarea | /tasks?new=1 |
| ✎ | Nota rápida | /notes?new=1 |
| 📓 | Nota Cuaderno | /tools/notebook?new=1 (nuevo s60) |
| ⚠ | Publicar alerta | /alerts?new=1 |
Historial de cambios relevantes
| Sprint | Cambio |
|---|---|
| ≤ s49 | HOME mobile básico (tareas, equipo, accesos) |
| s50–s56 | Refresh visual workspace en desktop — sin propagación al HOME mobile |
| s60 | Paridad con DesktopA: dashboard-message dinámico, sección Noticias, sección Salud del sistema, FAB con Cuaderno |
Tipos de datos principales
interface ApiNews {
id: number;
title: string;
category: string | null;
author: string | null;
created_at: string;
pinned: number; // 1 = pinned
}
interface ApiHealthRow {
label: string;
value: string;
detail: string;
color: string; // hex, ej: '#ef4444'
insight: string;
}
Véase también
- [[entity—mobile—component—bottomnav]]
- [[feature—mobile—s60-paridad-desktop]]
- [[entity—monitoring—endpoint—health]]
- [[entity—news—endpoint—news]]
- [[entity—dashboard—endpoint—dashboard-message]]