import { useState } from 'react'; import { Box, CircularProgress, Alert, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Typography, Dialog, DialogTitle, DialogContent, IconButton } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'; import RemoveIcon from '@mui/icons-material/Remove'; import { formatFullDateTime } from '../utils/formatters'; import type { CotizacionBolsa } from '../models/mercadoModels'; import { useApiData } from '../hooks/useApiData'; import { HistoricalChartWidget } from './HistoricalChartWidget'; // Usamos el formato de EEUU para los precios en dólares const formatCurrency = (num: number) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(num); const formatPercentage = (num: number) => num.toFixed(2); const Variacion = ({ value }: { value: number }) => { const color = value > 0 ? 'success.main' : value < 0 ? 'error.main' : 'text.secondary'; const Icon = value > 0 ? ArrowUpwardIcon : value < 0 ? ArrowDownwardIcon : RemoveIcon; return ( {formatPercentage(value)}% ); }; export const BolsaUsaWidget = () => { const { data, loading, error } = useApiData('/mercados/bolsa/eeuu'); const [selectedTicker, setSelectedTicker] = useState(null); const handleRowClick = (ticker: string) => { setSelectedTicker(ticker); }; const handleCloseDialog = () => { setSelectedTicker(null); }; if (loading) { return ; } if (error) { return {error}; } // Recordatorio de que el fetcher puede estar desactivado if (!data || data.length === 0) { return No hay datos disponibles para el mercado de EEUU. (El fetcher podría estar desactivado en el Worker).; } return ( <> Última actualización: {formatFullDateTime(data[0].fechaRegistro)} Símbolo Precio Actual Apertura Cierre Anterior % Cambio {data.map((row) => ( handleRowClick(row.ticker)}> {row.ticker} {formatCurrency(row.precioActual)} {formatCurrency(row.apertura)} {formatCurrency(row.cierreAnterior)} ))}
Historial de 30 días para: {selectedTicker} theme.palette.grey[500] }} > {selectedTicker && } ); };