// src/features/legislativas/provinciales/DiputadosPorSeccionWidget.tsx import { useState, useMemo, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import Select from 'react-select'; import { getSeccionesElectorales, getResultadosPorSeccion, getConfiguracionPublica, assetBaseUrl } from '../../../apiService'; import type { MunicipioSimple, ResultadoTicker, ApiResponseResultadosPorSeccion } from '../../../types/types'; import { ImageWithFallback } from '../../../components/common/ImageWithFallback'; import './TickerWidget.css'; const formatPercent = (num: number) => `${(num || 0).toFixed(2).replace('.', ',')}%`; const customSelectStyles = { control: (base: any) => ({ ...base, minWidth: '220px', border: '1px solid #ced4da' }), menu: (base: any) => ({ ...base, zIndex: 100 }), }; const CATEGORIA_ID = 6; // ID para Diputados export const DiputadosPorSeccionWidget = () => { const [selectedSeccion, setSelectedSeccion] = useState<{ value: string; label: string } | null>(null); const { data: configData } = useQuery({ queryKey: ['configuracionPublica'], queryFn: getConfiguracionPublica, staleTime: 0, }); const cantidadAMostrar = parseInt(configData?.ConcejalesResultadosCantidad || '5', 10); // Ahora usamos useQuery para obtener las secciones filtradas const { data: secciones = [], isLoading: isLoadingSecciones } = useQuery({ queryKey: ['seccionesElectorales', CATEGORIA_ID], // Key única para la caché queryFn: () => getSeccionesElectorales(CATEGORIA_ID), // Pasamos el ID de la categoría }); // useEffect para establecer la primera sección por defecto useEffect(() => { if (secciones.length > 0 && !selectedSeccion) { // Ordenamos aquí solo para la selección inicial const orden = new Map([ ['Capital', 0], ['Primera', 1], ['Segunda', 2], ['Tercera', 3], ['Cuarta', 4], ['Quinta', 5], ['Sexta', 6], ['Séptima', 7] ]); const getOrden = (nombre: string) => { const match = nombre.match(/Capital|Primera|Segunda|Tercera|Cuarta|Quinta|Sexta|Séptima/); return match ? orden.get(match[0]) ?? 99 : 99; }; const seccionesOrdenadas = [...secciones].sort((a, b) => getOrden(a.nombre) - getOrden(b.nombre)); setSelectedSeccion({ value: seccionesOrdenadas[0].id, label: seccionesOrdenadas[0].nombre }); } }, [secciones, selectedSeccion]); const seccionOptions = useMemo(() => secciones .map(s => ({ value: s.id, label: s.nombre })) .sort((a, b) => { // Mantenemos el orden en el dropdown const orden = new Map([ ['Sección Capital', 0], ['Sección Primera', 1], ['Sección Segunda', 2], ['Sección Tercera', 3], ['Sección Cuarta', 4], ['Sección Quinta', 5], ['Sección Sexta', 6], ['Sección Séptima', 7] ]); return (orden.get(a.label) ?? 99) - (orden.get(b.label) ?? 99); }), [secciones]); const { data, isLoading: isLoadingResultados } = useQuery({ queryKey: ['resultadosPorSeccion', selectedSeccion?.value, CATEGORIA_ID], queryFn: () => getResultadosPorSeccion(1,selectedSeccion!.value, CATEGORIA_ID), enabled: !!selectedSeccion, }); const resultados = data?.resultados || []; let displayResults: ResultadoTicker[] = resultados; if (resultados && resultados.length > cantidadAMostrar) { const topParties = resultados.slice(0, cantidadAMostrar - 1); const otherParties = resultados.slice(cantidadAMostrar - 1); const otrosPorcentaje = otherParties.reduce((sum, party) => sum + (party.porcentaje || 0), 0); const otrosEntry: ResultadoTicker = { id: `otros-diputados-${selectedSeccion?.value}`, nombre: 'Otros', nombreCorto: 'Otros', color: '#888888', logoUrl: null, votos: 0, porcentaje: otrosPorcentaje, }; displayResults = [...topParties, otrosEntry]; } else if (resultados) { displayResults = resultados.slice(0, cantidadAMostrar); } return (

DIPUTADOS POR SECCIÓN