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 (
{/* --- 2. NUEVO CONTENEDOR PARA BREADCRUMBS Y BUSCADOR --- */}
{/* --- 3. RENDERIZADO CONDICIONAL DEL BUSCADOR --- */}
{ambitoActual.nivel === 'provincia' && ambitoActual.provinciaDistritoId && (
handleAmbitoSelect(municipioId, 'municipio', municipioNombre)
}
/>
)}
}>
{isMobile && (
)}
);
};