import { MapContainer, TileLayer, Circle, Popup } from 'react-leaflet'; import PropTypes from 'prop-types'; import { useConfig } from '../contexts/ConfigContext.jsx'; import { DataProvider } from '../contexts/DataContext.jsx'; import { useData } from '../contexts/DataContext.jsx'; /** * PollutionMap.jsx * * Este archivo define el componente PollutionMap, que muestra un mapa con los niveles de contaminación en diferentes ubicaciones. * * Importaciones: * - MapContainer, TileLayer, Circle, Popup: Componentes de react-leaflet para renderizar el mapa y los círculos de contaminación. * - useConfig: Hook personalizado para acceder al contexto de configuración. * - DataProvider, useData: Funciones del contexto de datos para obtener y manejar datos. * * Funcionalidad: * - PollutionMap: Componente que configura la solicitud de datos y utiliza el DataProvider para obtener datos de sensores. * - Muestra mensajes de carga y error según el estado de la configuración. * - PollutionMapContent: Componente que procesa los datos obtenidos y renderiza los círculos de contaminación en el mapa. * - Utiliza el hook `useData` para acceder a los datos de sensores. * - Renderiza círculos de diferentes colores y tamaños según el nivel de contaminación. * */ const PollutionCircles = ({ data }) => { return data.map(({ lat, lng, level }, index) => { const baseColor = level < 20 ? '#00FF85' : level < 60 ? '#FFA500' : '#FF0000'; const steps = 4; const maxRadius = 400; const stepSize = maxRadius / steps; return (
{[...Array(steps)].map((_, i) => { const radius = stepSize * (i + 1); const opacity = 0.6 * ((i + 1) / steps); return ( ); })} Contaminación: {level} µg/m³
); }); }; const PollutionMap = ({ deviceId }) => { const { config, configLoading, configError } = useConfig(); if (configLoading) return

Cargando configuración...

; if (configError) return

Error al cargar configuración: {configError}

; if (!config) return

Configuración no disponible.

; const BASE = config.appConfig.endpoints.LOGIC_URL; const ENDPOINT = config.appConfig.endpoints.GET_DEVICE_POLLUTION_MAP; let endp = ENDPOINT.replace('{0}', deviceId); const reqConfig = { baseUrl: `${BASE}/${endp}`, params: {} } return ( ); }; const PollutionMapContent = () => { const { config, configLoading, configError } = useConfig(); const { data, dataLoading, dataError } = useData(); if (configLoading) return

Cargando configuración...

; if (configError) return

Error al cargar configuración: {configError}

; if (!config) return

Configuración no disponible.

; if (dataLoading) return

Cargando datos...

; if (dataError) return

Error al cargar datos: {configError}

; if (!data) return

Datos no disponibles.

; const SEVILLA = config?.userConfig.city; const pollutionData = data.map((measure) => ({ lat: measure.lat, lng: measure.lon, level: measure.carbonMonoxide })); return (
); } const mapStyles = { height: '500px', width: '100%', borderRadius: '20px' }; PollutionMap.propTypes = { deviceId: PropTypes.number.isRequired }; export default PollutionMap;