mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-21 22:46:32 +00:00
fix(map): draw the route line to and from the day's accommodation (#1275)
The map route ran first-activity to last-activity only, while the sidebar already showed the hotel-to-first-stop and last-stop-to-hotel legs with their drive times. Feed the day's accommodation bookends into the map route too, reusing the same getDayBookendHotels lookup and the "optimize from accommodation" gate, so the drawn line starts and ends at the hotel, including single-activity and transfer days.
This commit is contained in:
@@ -6,6 +6,7 @@ import {
|
||||
calculateSegments,
|
||||
optimizeRoute,
|
||||
generateGoogleMapsUrl,
|
||||
withHotelBookends,
|
||||
} from './RouteCalculator'
|
||||
|
||||
const OSRM_BASE = 'https://router.project-osrm.org/route/v1'
|
||||
@@ -241,3 +242,46 @@ describe('generateGoogleMapsUrl', () => {
|
||||
expect(result).toContain('48.86,2.36')
|
||||
})
|
||||
})
|
||||
|
||||
// ── withHotelBookends (#1275: draw the hotel → first / last → hotel legs) ────────
|
||||
|
||||
describe('withHotelBookends', () => {
|
||||
const hotel = { lat: 1, lng: 1 }
|
||||
const a = { lat: 2, lng: 2 }
|
||||
const b = { lat: 3, lng: 3 }
|
||||
const evening = { lat: 4, lng: 4 }
|
||||
|
||||
it('FE-COMP-ROUTECALCULATOR-021: leaves runs untouched when there is no hotel', () => {
|
||||
const runs = [[a, b]]
|
||||
expect(withHotelBookends(runs, a, b, null, null)).toEqual([[a, b]])
|
||||
})
|
||||
|
||||
it('FE-COMP-ROUTECALCULATOR-022: prepends hotel→first and appends last→hotel around the runs', () => {
|
||||
const runs = [[a, b]]
|
||||
expect(withHotelBookends(runs, a, b, hotel, evening)).toEqual([
|
||||
[hotel, a],
|
||||
[a, b],
|
||||
[b, evening],
|
||||
])
|
||||
})
|
||||
|
||||
it('FE-COMP-ROUTECALCULATOR-023: a single stop with no runs still draws hotel→stop→hotel', () => {
|
||||
expect(withHotelBookends([], a, a, hotel, evening)).toEqual([
|
||||
[hotel, a],
|
||||
[a, evening],
|
||||
])
|
||||
})
|
||||
|
||||
it('FE-COMP-ROUTECALCULATOR-024: a missing first/last waypoint skips that bookend', () => {
|
||||
const runs = [[a, b]]
|
||||
expect(withHotelBookends(runs, undefined, undefined, hotel, evening)).toEqual([[a, b]])
|
||||
})
|
||||
|
||||
it('FE-COMP-ROUTECALCULATOR-025: only the start hotel adds just the opening leg', () => {
|
||||
const runs = [[a, b]]
|
||||
expect(withHotelBookends(runs, a, b, hotel, null)).toEqual([
|
||||
[hotel, a],
|
||||
[a, b],
|
||||
])
|
||||
})
|
||||
})
|
||||
|
||||
@@ -67,6 +67,27 @@ export async function calculateRoute(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepends a hotel→first-waypoint run and appends a last-waypoint→hotel run to the
|
||||
* day's activity runs, so the drawn route starts and ends at the day's accommodation
|
||||
* (matching the sidebar's hotel connectors). A bookend is only added when both its
|
||||
* hotel and the first/last located waypoint exist; passing nulls leaves `runs`
|
||||
* untouched. The shared first/last waypoint is repeated so the polylines join.
|
||||
*/
|
||||
export function withHotelBookends(
|
||||
runs: Waypoint[][],
|
||||
firstWay: Waypoint | undefined,
|
||||
lastWay: Waypoint | undefined,
|
||||
startHotel: Waypoint | null,
|
||||
endHotel: Waypoint | null,
|
||||
): Waypoint[][] {
|
||||
const out: Waypoint[][] = []
|
||||
if (startHotel && firstWay) out.push([startHotel, firstWay])
|
||||
out.push(...runs)
|
||||
if (endHotel && lastWay) out.push([lastWay, endHotel])
|
||||
return out
|
||||
}
|
||||
|
||||
export function generateGoogleMapsUrl(places: Waypoint[]): string | null {
|
||||
const valid = places.filter((p) => p.lat && p.lng)
|
||||
if (valid.length === 0) return null
|
||||
|
||||
Reference in New Issue
Block a user