From 4c8e753eb530fb5989fdc71dd11281c7b98544f2 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 14 Mar 2025 16:18:34 +0000 Subject: [PATCH] [frontend]: Add 'Favourite' button to LuasPopup --- frontend/src/App.jsx | 53 ++++++++++++++++++++++++++- frontend/src/components/LuasPopup.jsx | 21 +++++++++-- 2 files changed, 69 insertions(+), 5 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 962d221..11b4d3b 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,5 +1,6 @@ import React, { useState, useEffect, useMemo, useRef } from "react"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; +import Cookies from "js-cookie"; import Navbar from "./components/Navbar"; import Statistics from "./components/Statistics.jsx"; @@ -22,7 +23,45 @@ const dataSources = [ { id: "buses", name: "Buses", api: "transient", objectType: "Bus" }, ]; +const defaultFavourites = { + IrishRailTrain: [], + Bus: [], + LuasStop: [], + BusStop: [], + IrishRailStation: [] +}; + 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 [markers, setMarkers] = useState([]); const [loading, setLoading] = useState(false); @@ -302,7 +341,13 @@ function App() { luasLine = "N/A"; } popupContent = ( - + ); markerText = item.luasStopIrishName + " " + item.luasStopName + " " + luasLine; @@ -413,7 +458,11 @@ function App() { userLocationAvailable={userLocationAvailable} />
- +
} diff --git a/frontend/src/components/LuasPopup.jsx b/frontend/src/components/LuasPopup.jsx index 2f48f97..a53272d 100644 --- a/frontend/src/components/LuasPopup.jsx +++ b/frontend/src/components/LuasPopup.jsx @@ -1,7 +1,14 @@ import React, { useState } from "react"; 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 map = useMap(); // Access the Leaflet map instance @@ -53,7 +60,15 @@ const LuasPopup = ({ item, objectTitle, luasLine }) => { return (
-

{objectTitle}

+
+

{objectTitle}

+ +
  • Luas Stop Name: {item.luasStopName} / {item.luasStopIrishName}
  • Line: {luasLine}
  • @@ -77,7 +92,7 @@ const LuasPopup = ({ item, objectTitle, luasLine }) => { Load incoming trams