diff --git a/frontend/src/components/TrainStationPopup.jsx b/frontend/src/components/TrainStationPopup.jsx index 2e036c9..67e11dc 100644 --- a/frontend/src/components/TrainStationPopup.jsx +++ b/frontend/src/components/TrainStationPopup.jsx @@ -1,20 +1,29 @@ -import React, { useState } from "react"; +import React, { useState, useRef } from "react"; +import { useMap } from "react-leaflet"; const TrainStationPopup = ({ item, objectTitle }) => { const [trainInfo, setTrainInfo] = useState(""); + const map = useMap(); // Access the Leaflet map instance const fetchTrainData = async () => { + let trainInfoHtml = ""; + try { - const response = await fetch(`https://kkz92ft0ad.execute-api.us-east-1.amazonaws.com/return_station_data?stationCode=${item.trainStationCode}`); + const response = await fetch( + `https://kkz92ft0ad.execute-api.us-east-1.amazonaws.com/return_station_data?stationCode=${item.trainStationCode}` + ); const data = await response.json(); - // Ensure objStationData is always an array let trainDataArray = Array.isArray(data.ArrayOfObjStationData.objStationData) ? data.ArrayOfObjStationData.objStationData : [data.ArrayOfObjStationData.objStationData]; trainDataArray = trainDataArray.slice(0, 3); // Only show the first 3 trains + if (trainDataArray.length === 0) { + throw new Error("No train data available"); + } + const trainData = trainDataArray.map(train => ({ trainCode: train.Traincode, origin: train.Origin, @@ -25,21 +34,30 @@ const TrainStationPopup = ({ item, objectTitle }) => { lastLocation: train.Lastlocation, })); - const trainInfoHtml = "Trains due in next 90 minutes:
" - + trainData.map(train => ` - Train Code: ${train.trainCode}
- Origin: ${train.origin}
- Destination: ${train.destination}
- Due In: ${train.dueIn} minutes
- Punctuality: ${train.late > 0 ? `${train.late} minute${train.late === 1 ? "" : "s"} late` : train.late < 0 ? `${Math.abs(train.late)} minute${Math.abs(train.late) === 1 ? "" : "s"} early` : "On time"}
- Status: ${train.status}
- Last Location: ${train.lastLocation || "N/A"}

- `).join(""); + trainInfoHtml = + "Trains due in next 90 minutes:
" + + trainData + .map(train => ` + Train Code: ${train.trainCode}
+ Origin: ${train.origin}
+ Destination: ${train.destination}
+ Due In: ${train.dueIn} minutes
+ Punctuality: ${train.late > 0 ? `${train.late} minute${train.late === 1 ? "" : "s"} late` : train.late < 0 ? `${Math.abs(train.late)} minute${Math.abs(train.late) === 1 ? "" : "s"} early` : "On time"}
+ Status: ${train.status}
+ Last Location: ${train.lastLocation || "N/A"}

+ `) + .join(""); - setTrainInfo(trainInfoHtml); } catch (error) { - setTrainInfo("No trains due in the next 90 minutes"); + trainInfoHtml = "No trains due in the next 90 minutes."; } + + setTrainInfo(trainInfoHtml); + + // Ensure the map pans to keep the popup in view even if an error occurs + setTimeout(() => { + map.panTo([item.latitude, item.longitude], { animate: true }); + }, 300); }; return ( @@ -50,12 +68,30 @@ const TrainStationPopup = ({ item, objectTitle }) => {
  • Train Station ID: {item.trainStationID}
  • Train Station Code: {item.trainStationCode}
  • - -
    +
    ); }; -export default TrainStationPopup; \ No newline at end of file +export default TrainStationPopup;