import { Cpu, Settings, BarChart3, Bell } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, CartesianGrid, } from "recharts"; import { fetchMeters, type Meter } from "../api/meters"; import type { Page } from "../App"; import grhWatermark from "../assets/images/grhWatermark.png"; /* ================= TYPES ================= */ type OrganismStatus = "ACTIVO" | "INACTIVO"; type Organism = { name: string; region: string; projects: number; meters: number; activeAlerts: number; lastSync: string; contact: string; status: OrganismStatus; }; type AlertItem = { company: string; type: string; time: string }; type HistoryItem = { user: string; action: string; target: string; time: string; }; /* ================= COMPONENT ================= */ export default function Home({ setPage, navigateToMetersWithProject, }: { setPage: (page: Page) => void; navigateToMetersWithProject: (projectName: string) => void; }) { /* ================= ORGANISMS (MOCK) ================= */ const organismsData: Organism[] = [ { name: "CESPT TIJUANA", region: "Tijuana, BC", projects: 6, meters: 128, activeAlerts: 0, lastSync: "Hace 12 min", contact: "Operaciones CESPT", status: "ACTIVO", }, { name: "CESPT TECATE", region: "Tecate, BC", projects: 3, meters: 54, activeAlerts: 1, lastSync: "Hace 40 min", contact: "Mantenimiento", status: "ACTIVO", }, { name: "CESPT MEXICALI", region: "Mexicali, BC", projects: 4, meters: 92, activeAlerts: 0, lastSync: "Hace 1 h", contact: "Supervisión", status: "ACTIVO", }, ]; const [selectedOrganism, setSelectedOrganism] = useState( organismsData[0]?.name ?? "CESPT TIJUANA" ); const [showOrganisms, setShowOrganisms] = useState(false); const [organismQuery, setOrganismQuery] = useState(""); /* ================= METERS ================= */ const [meters, setMeters] = useState([]); const loadMeters = async () => { try { const data = await fetchMeters(); setMeters(data); } catch (err) { console.error("Error loading meters:", err); setMeters([]); } }; useEffect(() => { loadMeters(); }, []); // TODO: Reemplazar cuando el backend mande el organismo real (ej: meter.organismName) // eslint-disable-next-line @typescript-eslint/no-unused-vars const getOrganismFromMeter = (_m: Meter): string => { return "CESPT TIJUANA"; }; const filteredMeters = useMemo( () => meters.filter((m) => getOrganismFromMeter(m) === selectedOrganism), [meters, selectedOrganism] ); const filteredProjects = useMemo( () => [...new Set(filteredMeters.map((m) => m.areaName))], [filteredMeters] ); const chartData = useMemo( () => filteredProjects.map((projectName) => ({ name: projectName, meterCount: filteredMeters.filter((m) => m.areaName === projectName) .length, })), [filteredProjects, filteredMeters] ); // eslint-disable-next-line @typescript-eslint/no-explicit-any const handleBarClick = (data: any) => { if (data?.activeLabel) { navigateToMetersWithProject(data.activeLabel); } }; /* ================= ORGANISM FILTER (DRAWER) ================= */ const filteredOrganisms = useMemo(() => { const q = organismQuery.trim().toLowerCase(); if (!q) return organismsData; return organismsData.filter((o) => o.name.toLowerCase().includes(q)); }, [organismQuery]); /* ================= MOCK ALERTS / HISTORY ================= */ const alerts: AlertItem[] = [ { company: "Empresa A", type: "Fuga", time: "Hace 2 horas" }, { company: "Empresa C", type: "Consumo alto", time: "Hace 5 horas" }, { company: "Empresa B", type: "Inactividad", time: "Hace 8 horas" }, ]; const history: HistoryItem[] = [ { user: "GRH", action: "Creó un nuevo medidor", target: "SN001", time: "Hace 5 minutos", }, { user: "CESPT", action: "Actualizó concentrador", target: "Planta 1", time: "Hace 20 minutos", }, { user: "GRH", action: "Eliminó un usuario", target: "Juan Pérez", time: "Hace 1 hora", }, { user: "CESPT", action: "Creó un payload", target: "Payload 12", time: "Hace 2 horas", }, { user: "GRH", action: "Actualizó medidor", target: "SN002", time: "Hace 3 horas", }, ]; /* ================= KPIs (Optional) ================= */ // eslint-disable-next-line @typescript-eslint/no-unused-vars const totalMeters = filteredMeters.length; // eslint-disable-next-line @typescript-eslint/no-unused-vars const totalProjects = filteredProjects.length; // eslint-disable-next-line @typescript-eslint/no-unused-vars const totalActiveAlerts = 0; // eslint-disable-next-line @typescript-eslint/no-unused-vars const avgMetersPerProject = totalProjects > 0 ? totalMeters / totalProjects : 0; return (
{/* Título + Selector */}
{/* ✅ Título + logo a la derecha */}

Sistema de Tomas de Agua

Monitorea, administra y controla tus operaciones en un solo lugar.

{/* ✅ Logo con z-index bajo para NO tapar menús */} Gestión de Recursos Hídricos
{/* Cards de Secciones */}
setPage("meters")} > Tomas
Alertas
Mantenimiento
Reportes
{/* Organismos Operadores */}

Organismos Operadores

Seleccionado:{" "} {selectedOrganism}

{showOrganisms && (
{/* Overlay */}
{ setShowOrganisms(false); setOrganismQuery(""); }} /> {/* Panel */}
{/* Header */}

Organismos Operadores

Selecciona un organismo para filtrar la información del dashboard.

{/* Search */}
setOrganismQuery(e.target.value)} placeholder="Buscar organismo…" className="w-full rounded-lg border border-gray-300 px-3 py-2 text-sm outline-none focus:ring-2 focus:ring-blue-200" />
{/* List */}
{filteredOrganisms.map((o) => { const active = o.name === selectedOrganism; return (

{o.name}

{o.region}

{o.status}
Proyectos {o.projects}
Medidores {o.meters}
Alertas activas {o.activeAlerts}
Última sync {o.lastSync}
Responsable {o.contact}
); })} {filteredOrganisms.length === 0 && (
No se encontraron organismos.
)}
{/* Footer */}
Nota: Las propiedades están en modo demostración hasta integrar backend.
)}
{/* Gráfica */}

Número de Medidores por Proyecto

Click en barra para ver tomas
{/* Historial */}

Historial Reciente

    {history.map((h, i) => (
  • {h.user} {h.action}{" "} {h.target}

    {h.time}

  • ))}
{/* Últimas alertas */}

Últimas Alertas

    {alerts.map((a, i) => (
  • {a.company} - {a.type} {a.time}
  • ))}
); }