import React, { useState } from "react"; import { MapContainer, TileLayer, Marker, Popup } from "react-leaflet"; import "leaflet/dist/leaflet.css"; import MarkerClusterGroup from "react-leaflet-markercluster"; import L, { Icon } from "leaflet"; import "leaflet.markercluster/dist/MarkerCluster.css"; import "leaflet.markercluster/dist/MarkerCluster.Default.css"; // Icons import trainStationIconURL from "../src/assets/icons/train-station.png"; import trainIconURL from "../src/assets/icons/train.png"; // Fix marker icon issue with Leaflet delete L.Icon.Default.prototype._getIconUrl; L.Icon.Default.mergeOptions({ iconUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon.png", iconRetinaUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-icon-2x.png", shadowUrl: "https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.7.1/images/marker-shadow.png", }); const icons = new Map(); icons.set( "IrishRailStation", new Icon({ iconUrl: trainStationIconURL, iconSize: [24, 24], }) ); icons.set( "IrishRailTrain", new Icon({ iconUrl: trainIconURL, iconSize: [24, 24], }) ); const TRANSIENT_DATA_API = "https://281bc6mcm5.execute-api.us-east-1.amazonaws.com/transient_data"; const PERMANENT_DATA_API = "https://a6y312dpuj.execute-api.us-east-1.amazonaws.com/permanent_data"; const dataSources = [ { id: "IrishRailTrains", name: "Irish Rail Trains", url: TRANSIENT_DATA_API + "?objectType=IrishRailTrain" }, { id: "IrishRailStations", name: "Irish Rail Stations", url: PERMANENT_DATA_API + "?objectType=IrishRailStation" }, ]; function App() { const [selectedSources, setSelectedSources] = useState([]); const [markers, setMarkers] = useState([]); const [loading, setLoading] = useState(false); const [clusteringEnabled, setClusteringEnabled] = useState(true); const handleCheckboxChange = (id) => { setSelectedSources((prev) => prev.includes(id) ? prev.filter((source) => source !== id) : [...prev, id] ); }; const fetchData = async () => { setLoading(true); const newMarkers = []; for (const source of dataSources) { if (selectedSources.includes(source.id)) { try { const response = await fetch(source.url); const data = await response.json(); data.forEach((item) => { newMarkers.push({ coords: [item.latitude, item.longitude], popup: item.objectType, icon: item.objectType, }); }); } catch (error) { console.error(`Error fetching data from ${source.name}:`, error); } } } setMarkers(newMarkers); setLoading(false); }; return (
{loading && (
Loading data...
)}

Select Data Sources

{dataSources.map((source) => (
handleCheckboxChange(source.id)} />
))}
setClusteringEnabled(!clusteringEnabled)} />
{clusteringEnabled ? ( {markers.map((marker, index) => ( {marker.popup} ))} ) : ( markers.map((marker, index) => ( {marker.popup} )) )}
); } export default App;