import { useMemo, useState } from "react"; import { Plus, Trash2, Pencil, RefreshCcw } from "lucide-react"; import ConfirmModal from "../../components/layout/common/ConfirmModal"; import { createConcentrator, deleteConcentrator, updateConcentrator, type Concentrator, type ConcentratorInput, } from "../../api/concentrators"; import { useConcentrators } from "./useConcentrators"; import ConcentratorsSidebar from "./ConcentratorsSidebar"; import ConcentratorsTable from "./ConcentratorsTable"; import ConcentratorsModal from "./ConcentratorsModal"; export type SampleView = "GENERAL" | "LORA" | "LORAWAN" | "GRANDES"; export type ProjectStatus = "ACTIVO" | "INACTIVO"; export type ProjectCard = { id: string; name: string; region: string; projects: number; concentrators: number; activeAlerts: number; lastSync: string; contact: string; status: ProjectStatus; }; type User = { role: "SUPER_ADMIN" | "USER"; project?: string; }; export default function ConcentratorsPage() { const currentUser: User = { role: "SUPER_ADMIN", project: "CESPT", }; const c = useConcentrators(currentUser); const [typesMenuOpen, setTypesMenuOpen] = useState(false); const [search, setSearch] = useState(""); const [activeConcentrator, setActiveConcentrator] = useState(null); const [confirmOpen, setConfirmOpen] = useState(false); const [deleting, setDeleting] = useState(false); const [showModal, setShowModal] = useState(false); const [editingId, setEditingId] = useState(null); const getEmptyForm = (): ConcentratorInput => ({ serialNumber: "", name: "", projectId: "", location: "", type: "LORA", status: "ACTIVE", ipAddress: "", firmwareVersion: "", }); const [form, setForm] = useState(getEmptyForm()); const [errors, setErrors] = useState>({}); const searchFiltered = useMemo(() => { if (!c.isGeneral) return []; return c.filteredConcentrators.filter((row) => { const q = search.trim().toLowerCase(); if (!q) return true; const name = (row.name ?? "").toLowerCase(); const sn = (row.serialNumber ?? "").toLowerCase(); return name.includes(q) || sn.includes(q); }); }, [c.filteredConcentrators, c.isGeneral, search]); const validateForm = () => { const next: Record = {}; if (!form.name.trim()) next["name"] = true; if (!form.serialNumber.trim()) next["serialNumber"] = true; if (!form.projectId.trim()) next["projectId"] = true; setErrors(next); return Object.keys(next).length === 0; }; const handleSave = async () => { if (!c.isGeneral) return; if (!validateForm()) return; try { if (editingId) { const updated = await updateConcentrator(editingId, form); c.setConcentrators((prev) => prev.map((x) => (x.id === editingId ? updated : x))); } else { const created = await createConcentrator(form); c.setConcentrators((prev) => [...prev, created]); } setShowModal(false); setEditingId(null); setForm(getEmptyForm()); setErrors({}); setActiveConcentrator(null); } catch (err) { console.error(err); alert(`Error saving concentrator: ${err instanceof Error ? err.message : "Please try again."}`); } }; const handleDelete = async () => { if (!c.isGeneral) return; if (!activeConcentrator) return; try { await deleteConcentrator(activeConcentrator.id); c.setConcentrators((prev) => prev.filter((x) => x.id !== activeConcentrator.id)); setActiveConcentrator(null); } catch (err) { console.error(err); alert(`Error deleting concentrator: ${err instanceof Error ? err.message : "Please try again."}`); } }; const openEditModal = () => { if (!c.isGeneral || !activeConcentrator) return; setEditingId(activeConcentrator.id); setForm({ serialNumber: activeConcentrator.serialNumber, name: activeConcentrator.name, projectId: activeConcentrator.projectId, location: activeConcentrator.location ?? "", type: activeConcentrator.type ?? "LORA", status: activeConcentrator.status, ipAddress: activeConcentrator.ipAddress ?? "", firmwareVersion: activeConcentrator.firmwareVersion ?? "", }); setErrors({}); setShowModal(true); }; const openCreateModal = () => { if (!c.isGeneral) return; setForm(getEmptyForm()); setErrors({}); setEditingId(null); setShowModal(true); }; return (

Concentrator Management

{!c.isGeneral ? `Vista: ${c.sampleViewLabel} (mock)` : c.selectedProject ? `Proyecto: ${c.selectedProject}` : "Selecciona un proyecto desde el panel izquierdo"}

setSearch(e.target.value)} disabled={!c.isGeneral || !c.selectedProject} />
setActiveConcentrator(row)} emptyMessage={ !c.isGeneral ? `Vista "${c.sampleViewLabel}" está en modo mock (sin backend todavía).` : !c.selectedProject ? "Selecciona un proyecto para ver los concentradores." : c.loadingConcentrators ? "Cargando concentradores..." : "No hay concentradores. Haz clic en 'Agregar' para crear uno." } />
setConfirmOpen(false)} onConfirm={async () => { if (!c.isGeneral) return; setDeleting(true); try { await handleDelete(); setConfirmOpen(false); } finally { setDeleting(false); } }} />
{showModal && c.isGeneral && ( { setShowModal(false); setErrors({}); }} onSave={handleSave} /> )}
); }