Fix bancas widget
This commit is contained in:
		| @@ -1,73 +1,68 @@ | ||||
| // src/components/ConfiguracionGeneral.tsx | ||||
| import { useState, useEffect } from 'react'; | ||||
| import { useQueryClient } from '@tanstack/react-query'; | ||||
| import { getAgrupaciones, getConfiguracion, updateConfiguracion } from '../services/apiService'; | ||||
| import type { AgrupacionPolitica } from '../types'; | ||||
| import './AgrupacionesManager.css'; // Reutilizamos los estilos para mantener la consistencia | ||||
| import './AgrupacionesManager.css'; | ||||
|  | ||||
| export const ConfiguracionGeneral = () => { | ||||
|     const queryClient = useQueryClient(); | ||||
|     const [agrupaciones, setAgrupaciones] = useState<AgrupacionPolitica[]>([]); | ||||
|     const [loading, setLoading] = useState(true); | ||||
|     const [error, setError] = useState<string | null>(null); | ||||
|     // Estado específico para la configuración de la presidencia del Senado | ||||
|  | ||||
|     const [presidenciaSenadoId, setPresidenciaSenadoId] = useState<string>(''); | ||||
|     const [usarDatosOficiales, setUsarDatosOficiales] = useState(false); | ||||
|     // Renombramos el estado para mayor claridad | ||||
|     const [modoOficialActivo, setModoOficialActivo] = useState(false); | ||||
|  | ||||
|     useEffect(() => { | ||||
|         const loadInitialData = async () => { | ||||
|             try { | ||||
|                 setLoading(true); | ||||
|                 setError(null); | ||||
|  | ||||
|                 // Hacemos ambas llamadas a la API en paralelo para más eficiencia | ||||
|                 const [agrupacionesData, configData] = await Promise.all([ | ||||
|                     getAgrupaciones(), | ||||
|                     getConfiguracion() | ||||
|                 ]); | ||||
|  | ||||
|                 const [agrupacionesData, configData] = await Promise.all([getAgrupaciones(), getConfiguracion()]); | ||||
|                 setAgrupaciones(agrupacionesData); | ||||
|  | ||||
|                 // Asignamos el valor guardado, si existe | ||||
|                 if (configData && configData.PresidenciaSenadores) { | ||||
|                     setPresidenciaSenadoId(configData.PresidenciaSenadores); | ||||
|                 } | ||||
|                 setUsarDatosOficiales(configData.UsarDatosDeBancadasOficiales === 'true'); | ||||
|                 setPresidenciaSenadoId(configData.PresidenciaSenadores || ''); | ||||
|                 setModoOficialActivo(configData.UsarDatosDeBancadasOficiales === 'true'); | ||||
|             } catch (err) { | ||||
|                 console.error("Error al cargar datos de configuración:", err); | ||||
|                 setError("No se pudieron cargar los datos necesarios para la configuración."); | ||||
|             } finally { | ||||
|                 setLoading(false); | ||||
|             } | ||||
|             } finally { setLoading(false); } | ||||
|         }; | ||||
|         loadInitialData(); | ||||
|     }, []); | ||||
|  | ||||
|     const handleSave = async () => { | ||||
|         try { | ||||
|             await updateConfiguracion({ "PresidenciaSenadores": presidenciaSenadoId, "UsarDatosDeBancadasOficiales": usarDatosOficiales.toString() }); | ||||
|             alert('Configuración guardada con éxito.'); | ||||
|         } catch (err) { | ||||
|             console.error("Error al guardar la configuración:", err); | ||||
|             alert('Error al guardar la configuración.'); | ||||
|             await updateConfiguracion({ | ||||
|                 "PresidenciaSenadores": presidenciaSenadoId, | ||||
|                 "UsarDatosDeBancadasOficiales": modoOficialActivo.toString() | ||||
|             }); | ||||
|             await queryClient.invalidateQueries({ queryKey: ['composicionCongreso'] }); | ||||
|             await queryClient.invalidateQueries({ queryKey: ['bancadasDetalle'] }); | ||||
|             alert('Configuración guardada.'); | ||||
|         } catch { | ||||
|             alert('Error al guardar.'); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     if (loading) return <div className="admin-module"><p>Cargando configuración...</p></div>; | ||||
|     if (loading) return <div className="admin-module"><p>Cargando...</p></div>; | ||||
|     if (error) return <div className="admin-module"><p style={{ color: 'red' }}>{error}</p></div>; | ||||
|  | ||||
|     return ( | ||||
|         <div className="admin-module"> | ||||
|             <h3>Configuración General de Cámaras</h3> | ||||
|             <h3>Configuración General de Visualización</h3> | ||||
|             <div className="form-group"> | ||||
|                 <label> | ||||
|                     <input | ||||
|                         type="checkbox" | ||||
|                         checked={usarDatosOficiales} | ||||
|                         onChange={e => setUsarDatosOficiales(e.target.checked)} | ||||
|                         checked={modoOficialActivo} | ||||
|                         onChange={e => setModoOficialActivo(e.target.checked)} | ||||
|                     /> | ||||
|                     Activar Modo "Resultados Oficiales" | ||||
|                     **Activar Modo "Resultados Oficiales"** | ||||
|                 </label> | ||||
|                 <p style={{ fontSize: '0.8rem', color: '#666', margin: '0.5rem 0 0 0' }}> | ||||
|                     Si está activo, el widget del Congreso mostrará la composición gestionada manualmente en esta página. Si está inactivo, mostrará la proyección en tiempo real de las elecciones. | ||||
|                 <p style={{ fontSize: '0.8rem', color: '#666' }}> | ||||
|                     Si está activo, el sitio público mostrará la composición de bancas y los ocupantes definidos manualmente en este panel. Si está inactivo, mostrará la proyección en tiempo real de la elección. | ||||
|                 </p> | ||||
|             </div> | ||||
|             <div style={{ marginTop: '1rem', paddingBottom: '1rem', borderBottom: '1px solid #eee' }}> | ||||
|   | ||||
| @@ -1,11 +1,13 @@ | ||||
| // src/components/LoginPage.tsx | ||||
| import { useState } from 'react'; | ||||
| import { useAuth } from '../context/AuthContext'; | ||||
| import { useQueryClient } from '@tanstack/react-query'; | ||||
|  | ||||
| export const LoginPage = () => { | ||||
|   const [username, setUsername] = useState(''); | ||||
|   const [password, setPassword] = useState(''); | ||||
|   const [error, setError] = useState(''); | ||||
|   const queryClient = useQueryClient(); | ||||
|   const { login } = useAuth(); | ||||
|  | ||||
|   const handleSubmit = async (e: React.FormEvent) => { | ||||
| @@ -14,6 +16,9 @@ export const LoginPage = () => { | ||||
|     const success = await login({ username, password }); | ||||
|     if (!success) { | ||||
|       setError('Usuario o contraseña incorrectos.'); | ||||
|     } else { | ||||
|       // Si el login es exitoso, invalidamos todo para empezar de cero | ||||
|       await queryClient.invalidateQueries(); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user