[frontend]: Add 'Favourite' button to LuasPopup

This commit is contained in:
2025-03-14 16:18:34 +00:00
parent dc0325d1f2
commit 4c8e753eb5
2 changed files with 69 additions and 5 deletions

View File

@ -1,5 +1,6 @@
import React, { useState, useEffect, useMemo, useRef } from "react"; import React, { useState, useEffect, useMemo, useRef } from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import Cookies from "js-cookie";
import Navbar from "./components/Navbar"; import Navbar from "./components/Navbar";
import Statistics from "./components/Statistics.jsx"; import Statistics from "./components/Statistics.jsx";
@ -22,7 +23,45 @@ const dataSources = [
{ id: "buses", name: "Buses", api: "transient", objectType: "Bus" }, { id: "buses", name: "Buses", api: "transient", objectType: "Bus" },
]; ];
const defaultFavourites = {
IrishRailTrain: [],
Bus: [],
LuasStop: [],
BusStop: [],
IrishRailStation: []
};
function App() { function App() {
const [favourites, setFavourites] = useState(defaultFavourites);
useEffect(() => {
try {
const savedFavourites = Cookies.get("favourites");
if (savedFavourites) {
const parsedFavourites = JSON.parse(savedFavourites);
setFavourites({ ...defaultFavourites, ...parsedFavourites });
}
} catch (error) {
console.error("Error loading favourites from cookies:", error);
setFavourites(defaultFavourites);
}
}, []);
const toggleFavourite = (type, id) => {
setFavourites((prev) => {
const updatedFavourites = {
...defaultFavourites,
...prev,
[type]: prev[type]?.includes(id)
? prev[type].filter((fav) => fav !== id)
: [...(prev[type] || []), id]
};
Cookies.set("favourites", JSON.stringify(updatedFavourites), { expires: 365 });
return updatedFavourites;
});
};
const [selectedSources, setSelectedSources] = useState([]); const [selectedSources, setSelectedSources] = useState([]);
const [markers, setMarkers] = useState([]); const [markers, setMarkers] = useState([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@ -302,7 +341,13 @@ function App() {
luasLine = "N/A"; luasLine = "N/A";
} }
popupContent = ( popupContent = (
<LuasPopup item={item} objectTitle={objectTitle} luasLine={luasLine} /> <LuasPopup
item={item}
objectTitle={objectTitle}
luasLine={luasLine}
toggleFavourite={toggleFavourite}
favourites={favourites}
/>
); );
markerText = item.luasStopIrishName + " " + item.luasStopName + " " + luasLine; markerText = item.luasStopIrishName + " " + item.luasStopName + " " + luasLine;
@ -413,7 +458,11 @@ function App() {
userLocationAvailable={userLocationAvailable} userLocationAvailable={userLocationAvailable}
/> />
<div style={{ flex: 1 }}> <div style={{ flex: 1 }}>
<MapComponent markers={filteredMarkers} clusteringEnabled={clusteringEnabled} userLocationAvailable={userLocationAvailable} /> <MapComponent
markers={filteredMarkers}
clusteringEnabled={clusteringEnabled}
userLocationAvailable={userLocationAvailable}
/>
</div> </div>
</div> </div>
} }

View File

@ -1,7 +1,14 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { useMap } from "react-leaflet"; import { useMap } from "react-leaflet";
const LuasPopup = ({ item, objectTitle, luasLine }) => { const LuasPopup = ({ item, objectTitle, luasLine, toggleFavourite, favourites }) => {
const [isFavourite, setIsFavourite] = useState(favourites.LuasStop?.includes(item.luasStopID));
const handleToggleFavourite = () => {
toggleFavourite("LuasStop", item.luasStopID);
setIsFavourite((prev) => !prev);
};
const [luasInfo, setLuasInfo] = useState(""); const [luasInfo, setLuasInfo] = useState("");
const map = useMap(); // Access the Leaflet map instance const map = useMap(); // Access the Leaflet map instance
@ -53,7 +60,15 @@ const LuasPopup = ({ item, objectTitle, luasLine }) => {
return ( return (
<div> <div>
<h3>{objectTitle}</h3> <div style={{display: "flex", justifyContent: "space-between", alignItems: "center"}}>
<h3>{objectTitle}</h3>
<button
onClick={handleToggleFavourite}
style={{background: "white", border: "none", fontSize: "20px", cursor: "pointer"}}
>
{isFavourite ? "⭐" : "☆"}
</button>
</div>
<ul> <ul>
<li><b>Luas Stop Name:</b> {item.luasStopName} / {item.luasStopIrishName}</li> <li><b>Luas Stop Name:</b> {item.luasStopName} / {item.luasStopIrishName}</li>
<li><b>Line:</b> {luasLine}</li> <li><b>Line:</b> {luasLine}</li>
@ -77,7 +92,7 @@ const LuasPopup = ({ item, objectTitle, luasLine }) => {
Load incoming trams Load incoming trams
</button> </button>
<div <div
dangerouslySetInnerHTML={{ __html: luasInfo }} dangerouslySetInnerHTML={{__html: luasInfo}}
style={{ style={{
marginTop: "10px", marginTop: "10px",
maxHeight: "200px", // Limit popup height maxHeight: "200px", // Limit popup height