diff --git a/apps/planner/app/components/PlannerMap.tsx b/apps/planner/app/components/PlannerMap.tsx index 85e33e6..f79f359 100644 --- a/apps/planner/app/components/PlannerMap.tsx +++ b/apps/planner/app/components/PlannerMap.tsx @@ -363,13 +363,15 @@ export function PlannerMap({ yjs, onRouteRequest, highlightPosition, highlighted const addWaypoint = useCallback( (lat: number, lng: number, name?: string) => { - const snap = name ? { lat, lon: lng, name, snapped: false } : snapToPoi(lat, lng, poiState.pois); + const snap = snapToPoi(lat, lng, poiState.pois); yjs.doc.transact(() => { const yMap = new Y.Map(); yMap.set("lat", snap.lat); yMap.set("lon", snap.snapped ? snap.lon : lng); if (snap.name) yMap.set("name", snap.name); - else if (name) yMap.set("name", name); + else if (name) yMap.set("name", name); // fallback for explicit name + if (snap.osmId) yMap.set("osmId", snap.osmId); + if (snap.poiTags) yMap.set("poiTags", snap.poiTags); yjs.waypoints.push([yMap]); }, "local"); }, @@ -410,6 +412,13 @@ export function PlannerMap({ yjs, onRouteRequest, highlightPosition, highlighted } else { yMap.delete("name"); } + if (snap.osmId) { + yMap.set("osmId", snap.osmId); + if (snap.poiTags) yMap.set("poiTags", snap.poiTags); + } else { + yMap.delete("osmId"); + yMap.delete("poiTags"); + } }, "local"); } }, diff --git a/apps/planner/app/lib/poi-snap.ts b/apps/planner/app/lib/poi-snap.ts index d00424f..c702fe3 100644 --- a/apps/planner/app/lib/poi-snap.ts +++ b/apps/planner/app/lib/poi-snap.ts @@ -2,11 +2,15 @@ import type { Poi } from "./overpass.ts"; const SNAP_DISTANCE_METERS = 50; -interface SnapResult { +export interface SnapResult { lat: number; lon: number; name?: string; snapped: boolean; + /** OSM node ID if snapped */ + osmId?: number; + /** Key POI tags if snapped */ + poiTags?: Record; } /** @@ -28,11 +32,22 @@ export function snapToPoi(lat: number, lon: number, pois: Poi[]): SnapResult { } if (bestPoi && bestDist <= SNAP_DISTANCE_METERS) { + // Pick key tags worth persisting with the waypoint + const keepTags = ["phone", "contact:phone", "website", "opening_hours", + "addr:street", "addr:housenumber", "addr:postcode", "addr:city", + "description", "amenity", "tourism", "shop"]; + const poiTags: Record = {}; + for (const key of keepTags) { + if (bestPoi.tags[key]) poiTags[key] = bestPoi.tags[key]; + } + return { lat: bestPoi.lat, lon: bestPoi.lon, name: bestPoi.name, snapped: true, + osmId: bestPoi.id, + poiTags: Object.keys(poiTags).length > 0 ? poiTags : undefined, }; }