import { useState, useEffect, useMemo, Fragment } from "react"; import { api } from "../lib/api"; import { Loader, ErrorBox, Filters, Select } from "../components/UI"; const MESES = ["ENERO","FEBRERO","MARZO","ABRIL","MAYO","JUNIO","JULIO","AGOSTO","SEPTIEMBRE","OCTUBRE","NOVIEMBRE","DICIEMBRE"]; export default function OtrosGeneral() { const hoy = new Date(); const [ano, setAno] = useState(String(hoy.getFullYear())); const [mes, setMes] = useState(String(hoy.getMonth() + 1)); const [dia, setDia] = useState("TODOS"); const [filtros, setFiltros] = useState({ anos: [2026] }); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [expAlways, setExpAlways] = useState({}); const [expAlwaysProg, setExpAlwaysProg] = useState({}); const [expWeb, setExpWeb] = useState({}); const [expAsig, setExpAsig] = useState({}); const [reload, setReload] = useState(0); useEffect(() => { api.leadsFiltros().then(setFiltros).catch(() => {}); }, []); // Auto-refresco cada 15 min (sin F5) + recarga al guardar en Config useEffect(() => { const id = setInterval(() => setReload((n) => n + 1), 15 * 60 * 1000); const onActualizar = () => setReload((n) => n + 1); window.addEventListener("datos-actualizar", onActualizar); return () => { clearInterval(id); window.removeEventListener("datos-actualizar", onActualizar); }; }, []); useEffect(() => { let activo = true; if (!data) setLoading(true); // spinner solo en la primera carga setError(null); api.otrosGeneral(ano, mes, dia) .then((res) => { if (activo) { setData(res); setLoading(false); } }) .catch((e) => { if (activo) { setError(e.message); setLoading(false); } }); return () => { activo = false; }; }, [ano, mes, dia, reload]); const optAnos = useMemo(() => (filtros.anos || []).map(String), [filtros]); const optMes = useMemo(() => [{ value: "TODOS", label: "TODOS" }, ...MESES.map((m,i)=>({ value: String(i+1), label: m }))], []); const optDia = useMemo(() => ["TODOS", ...Array.from({length:31}, (_,i)=>String(i+1))], []); const money = (v) => `$${Number(v || 0).toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; const sol = (v) => `S/ ${Number(v || 0).toLocaleString("en-US", { maximumFractionDigits: 0 })}`; return (

📊 Otros General