import { useMemo, useState, Suspense, useEffect } from 'react'; import { useSuspenseQuery } from '@tanstack/react-query'; import { getPanelElectoral } from '../../../apiService'; import { MapaNacional } from './components/MapaNacional'; import { PanelResultados } from './components/PanelResultados'; import { Breadcrumbs } from './components/Breadcrumbs'; import { MunicipioSearch } from './components/MunicipioSearch'; import './PanelNacional.css'; import Select from 'react-select'; import type { PanelElectoralDto, ResultadoTicker } from '../../../types/types'; import { FiMap, FiList, FiChevronDown, FiChevronUp } from 'react-icons/fi'; import { useMediaQuery } from './hooks/useMediaQuery'; import { Toaster } from 'react-hot-toast'; import { ImageWithFallback } from '../../../components/common/ImageWithFallback'; import { assetBaseUrl } from '../../../apiService'; // --- COMPONENTE INTERNO PARA LA TARJETA DE RESULTADOS EN MÓVIL --- interface MobileResultsCardProps { eleccionId: number; ambitoId: string | null; categoriaId: number; ambitoNombre: string; ambitoNivel: 'pais' | 'provincia' | 'municipio'; } const formatPercent = (num: number) => `${(num || 0).toFixed(2).replace('.', ',')}%`; // --- SUB-COMPONENTE PARA UNA FILA DE RESULTADO --- const ResultRow = ({ partido }: { partido: ResultadoTicker }) => (
{partido.nombreCandidato ? ( <> {partido.nombreCandidato} {partido.nombreCorto || partido.nombre} ) : ( {partido.nombreCorto || partido.nombre} )}
{formatPercent(partido.porcentaje)} {partido.votos.toLocaleString('es-AR')}
); // --- COMPONENTE REFACTORIZADO PARA LA TARJETA MÓVIL --- interface MobileResultsCardProps { eleccionId: number; ambitoId: string | null; categoriaId: number; ambitoNombre: string; ambitoNivel: 'pais' | 'provincia' | 'municipio'; mobileView: 'mapa' | 'resultados'; setMobileView: (view: 'mapa' | 'resultados') => void; } const MobileResultsCard = ({ eleccionId, ambitoId, categoriaId, ambitoNombre, ambitoNivel, mobileView, setMobileView }: MobileResultsCardProps) => { const [isExpanded, setIsExpanded] = useState(false); const { data } = useSuspenseQuery({ queryKey: ['panelElectoral', eleccionId, ambitoId, categoriaId], queryFn: () => getPanelElectoral(eleccionId, ambitoId, categoriaId), }); useEffect(() => { setIsExpanded(ambitoNivel === 'municipio'); }, [ambitoNivel]); const topResults = data.resultadosPanel.slice(0, 3); if (topResults.length === 0 && ambitoNivel === 'pais') { return null; } return (
{/* Sección Colapsable con Resultados */}
setIsExpanded(!isExpanded)}>

{ambitoNombre}

{/* Se añade una clase para estilizar este texto específicamente */} {isExpanded ? 'Ocultar resultados' : 'Ver top 3'}
{isExpanded ? : }
{topResults.length > 0 ? ( topResults.map(partido => ) ) : (

No hay resultados para esta selección.

)}
{/* Footer Fijo con Botones de Navegación */}
); }; // --- WIDGET PRINCIPAL --- interface PanelNacionalWidgetProps { eleccionId: number; } type AmbitoState = { id: string | null; nivel: 'pais' | 'provincia' | 'municipio'; nombre: string; provinciaNombre?: string; provinciaDistritoId?: string | null; }; const CATEGORIAS_NACIONALES = [ { value: 2, label: 'Diputados Nacionales' }, { value: 1, label: 'Senadores Nacionales' }, ]; const PanelContenido = ({ eleccionId, ambitoActual, categoriaId }: { eleccionId: number, ambitoActual: AmbitoState, categoriaId: number }) => { const { data } = useSuspenseQuery({ queryKey: ['panelElectoral', eleccionId, ambitoActual.id, categoriaId], queryFn: () => getPanelElectoral(eleccionId, ambitoActual.id, categoriaId), }); return ; }; export const PanelNacionalWidget = ({ eleccionId }: PanelNacionalWidgetProps) => { const [ambitoActual, setAmbitoActual] = useState({ id: null, nivel: 'pais', nombre: 'Argentina', provinciaDistritoId: null }); const [categoriaId, setCategoriaId] = useState(2); const [isPanelOpen, setIsPanelOpen] = useState(true); const [mobileView, setMobileView] = useState<'mapa' | 'resultados'>('mapa'); const isMobile = useMediaQuery('(max-width: 800px)'); const handleAmbitoSelect = (nuevoAmbitoId: string, nuevoNivel: 'provincia' | 'municipio', nuevoNombre: string) => { setAmbitoActual(prev => ({ id: nuevoAmbitoId, nivel: nuevoNivel, nombre: nuevoNombre, provinciaNombre: nuevoNivel === 'municipio' ? prev.provinciaNombre : (nuevoNivel === 'provincia' ? nuevoNombre : undefined), provinciaDistritoId: nuevoNivel === 'provincia' ? nuevoAmbitoId : prev.provinciaDistritoId })); }; const handleResetToPais = () => { setAmbitoActual({ id: null, nivel: 'pais', nombre: 'Argentina', provinciaDistritoId: null }); }; const handleVolverAProvincia = () => { if (ambitoActual.provinciaDistritoId && ambitoActual.provinciaNombre) { setAmbitoActual({ id: ambitoActual.provinciaDistritoId, nivel: 'provincia', nombre: ambitoActual.provinciaNombre, provinciaDistritoId: ambitoActual.provinciaDistritoId, provinciaNombre: ambitoActual.provinciaNombre, }); } else { handleResetToPais(); } }; const selectedCategoria = useMemo(() => CATEGORIAS_NACIONALES.find(c => c.value === categoriaId), [categoriaId] ); return (