import React, { useState, useRef } from 'react'; import { Box, CircularProgress, Alert, Paper, Typography, Dialog, DialogTitle, DialogContent, IconButton } from '@mui/material'; import { PiCow } from "react-icons/pi"; import ScaleIcon from '@mui/icons-material/Scale'; import { PiChartLineUpBold } from "react-icons/pi"; import CloseIcon from '@mui/icons-material/Close'; // Importaciones de nuestro proyecto import type { CotizacionGanado } from '../models/mercadoModels'; import { useApiData } from '../hooks/useApiData'; import { useIsHoliday } from '../hooks/useIsHoliday'; import { formatCurrency, formatInteger, formatDateOnly } from '../utils/formatters'; import { AgroHistoricalChartWidget } from './AgroHistoricalChartWidget'; import { HolidayAlert } from './common/HolidayAlert'; /** * Sub-componente para una única tarjeta de categoría de ganado. */ const AgroCard = ({ registro, onChartClick }: { registro: CotizacionGanado, onChartClick: (event: React.MouseEvent) => void }) => { return ( {/* Contenido principal de la tarjeta */} {registro.categoria} {registro.especificaciones} Precio Máximo: ${formatCurrency(registro.maximo)} Precio Mínimo: ${formatCurrency(registro.minimo)} Precio Mediano: ${formatCurrency(registro.mediano)} {/* Pie de la tarjeta */} {formatInteger(registro.cabezas)} Cabezas {formatInteger(registro.kilosTotales)} Kilos {formatDateOnly(registro.fechaRegistro)} ); }; /** * Widget autónomo para las tarjetas de resumen del Mercado Agroganadero. */ export const MercadoAgroCardWidget = () => { const { data, loading: dataLoading, error: dataError } = useApiData('/mercados/agroganadero'); const isHoliday = useIsHoliday('BA'); const [selectedCategory, setSelectedCategory] = useState(null); const triggerButtonRef = useRef(null); const handleChartClick = (registro: CotizacionGanado, event: React.MouseEvent) => { triggerButtonRef.current = event.currentTarget; setSelectedCategory(registro); }; const handleCloseDialog = () => { setSelectedCategory(null); setTimeout(() => { triggerButtonRef.current?.focus(); }, 0); }; const isLoading = dataLoading || isHoliday === null; if (isLoading) { return ; } if (dataError) { return {dataError}; } if (!data || data.length === 0) { if (isHoliday) { return ; } return No hay datos del mercado agroganadero disponibles.; } return ( <> {isHoliday && ( )} {data.map(registro => ( handleChartClick(registro, event)} /> ))} theme.palette.grey[500], backgroundColor: 'white', boxShadow: 3, '&:hover': { backgroundColor: 'grey.100' }, }} > Historial de 30 días para {selectedCategory?.categoria} ({selectedCategory?.especificaciones}) {selectedCategory && ( )} ); };