import { useState } from 'react'; import { Box, Paper, Typography, ToggleButton, ToggleButtonGroup, CircularProgress, Alert } from '@mui/material'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'; import RemoveIcon from '@mui/icons-material/Remove'; import type { CotizacionBolsa } from '../models/mercadoModels'; import { formatCurrency2Decimal, formatCurrency } from '../utils/formatters'; import { HistoricalChartWidget } from './HistoricalChartWidget'; import { useApiData } from '../hooks/useApiData'; import { useIsHoliday } from '../hooks/useIsHoliday'; // <-- Importamos el hook import { HolidayAlert } from './common/HolidayAlert'; // <-- Importamos la alerta /** * Sub-componente para la variación del índice. */ const VariacionMerval = ({ actual, anterior }: { actual: number, anterior: number }) => { if (anterior === 0) return null; const variacionPuntos = actual - anterior; const variacionPorcentaje = (variacionPuntos / anterior) * 100; const isPositive = variacionPuntos > 0; const isNegative = variacionPuntos < 0; const color = isPositive ? 'success.main' : isNegative ? 'error.main' : 'text.secondary'; const Icon = isPositive ? ArrowUpwardIcon : isNegative ? ArrowDownwardIcon : RemoveIcon; return ( {formatCurrency(variacionPuntos)} ({variacionPorcentaje.toFixed(2)}%) ); }; /** * Widget autónomo para la tarjeta de héroe del S&P Merval. */ export const MervalHeroCard = () => { // Cada widget gestiona sus propias llamadas a la API const { data: allLocalData, loading: dataLoading, error: dataError } = useApiData('/mercados/bolsa/local'); const isHoliday = useIsHoliday('BA'); // Estado interno para el gráfico const [dias, setDias] = useState(30); const handleRangoChange = ( _event: React.MouseEvent, nuevoRango: number | null ) => { if (nuevoRango !== null) { setDias(nuevoRango); } }; // Filtramos el dato específico que este widget necesita const mervalData = allLocalData?.find(d => d.ticker === '^MERV'); // --- LÓGICA DE RENDERIZADO CORREGIDA --- // El estado de carga depende de AMBAS llamadas a la API. const isLoading = dataLoading || isHoliday === null; if (isLoading) { return ; } if (dataError) { return {dataError}; } // Si no hay datos del Merval, es un estado final. if (!mervalData) { // Si no hay datos PERO sabemos que es feriado, la alerta de feriado es más informativa. if (isHoliday) { return ; } return No se encontraron datos para el índice MERVAL.; } // Si llegamos aquí, SÍ tenemos datos para mostrar. return ( {/* Si es feriado, mostramos la alerta como un AVISO encima del contenido. */} {isHoliday && ( )} {/* El contenido principal del widget siempre se muestra si hay datos. */} Índice S&P MERVAL {formatCurrency2Decimal(mervalData.precioActual)} Semanal Mensual Anual ); };