From 60f8d79d9e8ccedcd95610a88dd7dc8ec5521aca Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:51:47 +0100 Subject: Simplify estimates endpoint to return only arrival data (#57) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arielcostas <94913521+arielcostas@users.noreply.github.com> --- .../SantiagoController.cs | 13 +------ src/Costasdev.Busurbano.Backend/VigoController.cs | 5 ++- src/frontend/app/components/GroupedTable.tsx | 10 ++--- src/frontend/app/components/RegularTable.tsx | 8 ++-- src/frontend/app/components/StopSheet.tsx | 8 ++-- src/frontend/app/routes/estimates-$id.tsx | 43 ++++++++++++---------- 6 files changed, 42 insertions(+), 45 deletions(-) diff --git a/src/Costasdev.Busurbano.Backend/SantiagoController.cs b/src/Costasdev.Busurbano.Backend/SantiagoController.cs index 51a76c6..41bc62b 100644 --- a/src/Costasdev.Busurbano.Backend/SantiagoController.cs +++ b/src/Costasdev.Busurbano.Backend/SantiagoController.cs @@ -55,17 +55,8 @@ public class SantiagoController : ControllerBase 0 )).ToList(); - return new OkObjectResult(new StopEstimateResponse - { - Stop = new StopEstimateResponse.StopInfo - { - Name = root.GetProperty("nombre").GetString() ?? string.Empty, - Id = root.GetProperty("id").GetInt32(), - Latitude = root.GetProperty("coordenadas").GetProperty("latitud").GetDecimal(), - Longitude = root.GetProperty("coordenadas").GetProperty("longitud").GetDecimal() - }, - Estimates = estimates - }); + // Return only the estimates array, not the stop metadata + return new OkObjectResult(estimates); } catch (InvalidOperationException) { diff --git a/src/Costasdev.Busurbano.Backend/VigoController.cs b/src/Costasdev.Busurbano.Backend/VigoController.cs index 41a8765..be0e7c6 100644 --- a/src/Costasdev.Busurbano.Backend/VigoController.cs +++ b/src/Costasdev.Busurbano.Backend/VigoController.cs @@ -37,8 +37,9 @@ public class VigoController : ControllerBase try { - var estimates = await _api.GetStopEstimates(requestedStopId); - return new OkObjectResult(estimates); + var response = await _api.GetStopEstimates(requestedStopId); + // Return only the estimates array, not the stop metadata + return new OkObjectResult(response.Estimates); } catch (InvalidOperationException) { diff --git a/src/frontend/app/components/GroupedTable.tsx b/src/frontend/app/components/GroupedTable.tsx index fd97d5b..9bdd5a0 100644 --- a/src/frontend/app/components/GroupedTable.tsx +++ b/src/frontend/app/components/GroupedTable.tsx @@ -1,9 +1,9 @@ -import { type StopDetails } from "../routes/estimates-$id"; +import { type Estimate } from "../routes/estimates-$id"; import LineIcon from "./LineIcon"; import { type RegionConfig } from "../data/RegionConfig"; interface GroupedTable { - data: StopDetails; + data: Estimate[]; dataDate: Date | null; regionConfig: RegionConfig; } @@ -17,7 +17,7 @@ export const GroupedTable: React.FC = ({ data, dataDate, regionCon } }; - const groupedEstimates = data.estimates.reduce( + const groupedEstimates = data.reduce( (acc, estimate) => { if (!acc[estimate.line]) { acc[estimate.line] = []; @@ -25,7 +25,7 @@ export const GroupedTable: React.FC = ({ data, dataDate, regionCon acc[estimate.line].push(estimate); return acc; }, - {} as Record, + {} as Record, ); const sortedLines = Object.keys(groupedEstimates).sort((a, b) => { @@ -72,7 +72,7 @@ export const GroupedTable: React.FC = ({ data, dataDate, regionCon )} - {data?.estimates.length === 0 && ( + {data?.length === 0 && ( diff --git a/src/frontend/app/components/RegularTable.tsx b/src/frontend/app/components/RegularTable.tsx index 68b732a..868332f 100644 --- a/src/frontend/app/components/RegularTable.tsx +++ b/src/frontend/app/components/RegularTable.tsx @@ -1,10 +1,10 @@ import { useTranslation } from "react-i18next"; -import { type StopDetails } from "../routes/estimates-$id"; +import { type Estimate } from "../routes/estimates-$id"; import LineIcon from "./LineIcon"; import { type RegionConfig } from "../data/RegionConfig"; interface RegularTableProps { - data: StopDetails; + data: Estimate[]; dataDate: Date | null; regionConfig: RegionConfig; } @@ -56,7 +56,7 @@ export const RegularTable: React.FC = ({ - {data.estimates + {data .sort((a, b) => a.minutes - b.minutes) .map((estimate, idx) => ( @@ -80,7 +80,7 @@ export const RegularTable: React.FC = ({ ))} - {data?.estimates.length === 0 && ( + {data?.length === 0 && ( diff --git a/src/frontend/app/components/StopSheet.tsx b/src/frontend/app/components/StopSheet.tsx index 0084c14..4bd75a8 100644 --- a/src/frontend/app/components/StopSheet.tsx +++ b/src/frontend/app/components/StopSheet.tsx @@ -6,7 +6,7 @@ import { Clock, ClockFading, Hourglass, RefreshCw } from "lucide-react"; import LineIcon from "./LineIcon"; import { StopSheetSkeleton } from "./StopSheetSkeleton"; import { ErrorDisplay } from "./ErrorDisplay"; -import { type StopDetails } from "../routes/estimates-$id"; +import { type Estimate } from "../routes/estimates-$id"; import { type RegionId, getRegionConfig } from "../data/RegionConfig"; import { useApp } from "../AppContext"; import "./StopSheet.css"; @@ -24,7 +24,7 @@ interface ErrorInfo { message?: string; } -const loadStopData = async (region: RegionId, stopId: number): Promise => { +const loadStopData = async (region: RegionId, stopId: number): Promise => { const regionConfig = getRegionConfig(region); const resp = await fetch(`${regionConfig.estimatesEndpoint}?id=${stopId}`, { headers: { @@ -48,7 +48,7 @@ export const StopSheet: React.FC = ({ const { t } = useTranslation(); const { region } = useApp(); const regionConfig = getRegionConfig(region); - const [data, setData] = useState(null); + const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [lastUpdated, setLastUpdated] = useState(null); @@ -120,7 +120,7 @@ export const StopSheet: React.FC = ({ // Show only the next 4 arrivals const limitedEstimates = - data?.estimates.sort((a, b) => a.minutes - b.minutes).slice(0, 4) || []; + data?.sort((a, b) => a.minutes - b.minutes).slice(0, 4) || []; return ( => { +const loadData = async (region: RegionId, stopId: string): Promise => { const regionConfig = getRegionConfig(region); const resp = await fetch(`${regionConfig.estimatesEndpoint}?id=${stopId}`, { headers: { @@ -78,9 +70,10 @@ export default function Estimates() { const params = useParams(); const stopIdNum = parseInt(params.id ?? ""); const [customName, setCustomName] = useState(undefined); + const [stopData, setStopData] = useState(undefined); // Estimates data state - const [data, setData] = useState(null); + const [data, setData] = useState(null); const [dataDate, setDataDate] = useState(null); const [estimatesLoading, setEstimatesLoading] = useState(true); const [estimatesError, setEstimatesError] = useState(null); @@ -121,6 +114,10 @@ export default function Estimates() { const body = await loadData(region, params.id!); setData(body); setDataDate(new Date()); + + // Load stop data from StopDataProvider + const stop = await StopDataProvider.getStopById(region, stopIdNum); + setStopData(stop); setCustomName(StopDataProvider.getCustomName(region, stopIdNum)); } catch (error) { console.error('Error loading estimates data:', error); @@ -198,8 +195,16 @@ export default function Estimates() { } }; + // Helper function to get the display name for the stop + const getStopDisplayName = () => { + if (customName) return customName; + if (stopData?.name.intersect) return stopData.name.intersect; + if (stopData?.name.original) return stopData.name.original; + return `Parada ${stopIdNum}`; + }; + const handleRename = () => { - const current = customName ?? data?.stop.name; + const current = getStopDisplayName(); const input = window.prompt("Custom name for this stop:", current); if (input === null) return; // cancelled const trimmed = input.trim(); @@ -257,8 +262,8 @@ export default function Estimates() { onClick={toggleFavourite} /> - {customName ?? data?.stop.name ?? `Parada ${stopIdNum}`}{" "} - ({data?.stop.id ?? stopIdNum}) + {getStopDisplayName()}{" "} + ({stopIdNum})