import { Box, CircularProgress, Alert, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Button } from '@mui/material'; import ContentCopyIcon from '@mui/icons-material/ContentCopy'; // Importaciones de nuestro proyecto import { useApiData } from '../../hooks/useApiData'; import { useIsHoliday } from '../../hooks/useIsHoliday'; import type { CotizacionBolsa } from '../../models/mercadoModels'; import { formatCurrency, formatFullDateTime } from '../../utils/formatters'; import { copyToClipboard } from '../../utils/clipboardUtils'; import { HolidayAlert } from '../common/HolidayAlert'; /** * Función para convertir los datos de la tabla a formato CSV. */ const toCSV = (headers: string[], data: CotizacionBolsa[]) => { const headerRow = headers.join(';'); const dataRows = data.map(row => [ row.ticker, row.nombreEmpresa, formatCurrency(row.precioActual), formatCurrency(row.cierreAnterior), `${row.porcentajeCambio.toFixed(2)}%`, formatFullDateTime(row.fechaRegistro) ].join(';') ); return [headerRow, ...dataRows].join('\n'); }; /** * Componente de tabla de datos crudos para la Bolsa Local (MERVAL y acciones), * diseñado para la página de redacción. */ export const RawBolsaLocalTable = () => { // Hooks para obtener los datos y el estado de feriado. const { data, loading: dataLoading, error: dataError } = useApiData('/mercados/bolsa/local'); const isHoliday = useIsHoliday('BA'); const handleCopy = () => { if (!data) return; const headers = ["Ticker", "Nombre", "Último Precio", "Cierre Anterior", "Variación %", "Fecha de Registro"]; const csvData = toCSV(headers, data); copyToClipboard(csvData) .then(() => alert('¡Tabla copiada al portapapeles!')) .catch(err => { console.error('Error al copiar:', err); alert('Error: No se pudo copiar la tabla.'); }); }; // Estado de carga unificado. const isLoading = dataLoading || isHoliday === null; if (isLoading) return ; if (dataError) return {dataError}; if (!data || data.length === 0) { if (isHoliday) { return ; } return No hay datos disponibles para el mercado local.; } return ( {/* Si es feriado, mostramos una alerta informativa encima de la tabla. */} {isHoliday && ( )} Ticker Nombre Último Precio Cierre Anterior Variación % Última Act. {data.map(row => ( {row.ticker} {row.nombreEmpresa} ${formatCurrency(row.precioActual)} ${formatCurrency(row.cierreAnterior)} {row.porcentajeCambio.toFixed(2)}% {formatFullDateTime(row.fechaRegistro)} ))}
); };