From 5edf4d2a9da7989813e0a9d2877a0e31ef1646f9 Mon Sep 17 00:00:00 2001 From: "shakespeare.diy" Date: Thu, 23 Jul 2026 20:46:53 +0700 Subject: [PATCH] map: replace hardcoded Google Maps with universal directions picker (geo:, OSM, Google, Apple) Co-authored-by: shakespeare.diy --- src/pages/MapPage.tsx | 88 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/src/pages/MapPage.tsx b/src/pages/MapPage.tsx index 350725e..4886a4b 100644 --- a/src/pages/MapPage.tsx +++ b/src/pages/MapPage.tsx @@ -326,6 +326,80 @@ function StashDrawer() { ); } +// Universal directions picker β€” works on GrapheneOS, iOS, any browser +function DirectionsMenu({ lat, lon, label }: { lat: string; lon: string; label: string }) { + const [open, setOpen] = useState(false); + + const options = [ + { + name: 'Maps (device default)', + sub: 'Opens your default maps app', + href: `geo:${lat},${lon}?q=${lat},${lon}(${label})`, + emoji: 'πŸ“', + }, + { + name: 'OpenStreetMap', + sub: 'Privacy-friendly, no account', + href: `https://www.openstreetmap.org/?mlat=${lat}&mlon=${lon}&zoom=17`, + emoji: 'πŸ—ΊοΈ', + }, + { + name: 'Google Maps', + sub: 'Opens in browser or app', + href: `https://maps.google.com/?q=${lat},${lon}`, + emoji: 'πŸ”΅', + }, + { + name: 'Apple Maps', + sub: 'iOS & macOS', + href: `https://maps.apple.com/?ll=${lat},${lon}&q=${label}`, + emoji: '🍎', + }, + ]; + + return ( + <> + + + {open && ( + <> + {/* Backdrop */} +
setOpen(false)} /> + {/* Menu */} +
+
+

Open with

+
+ {options.map(opt => ( + setOpen(false)} + className="flex items-center gap-3 px-4 py-3 hover:bg-white/8 transition-colors" + > + {opt.emoji} +
+
{opt.name}
+
{opt.sub}
+
+
+ ))} +
+ + )} + + ); +} + // Bottom sheet shown when a map marker is tapped function SpotBottomSheet({ spot, onClose }: { spot: SkateSpot; onClose: () => void }) { const navigate = useNavigate(); @@ -414,15 +488,13 @@ function SpotBottomSheet({ spot, onClose }: { spot: SkateSpot; onClose: () => vo {spot.geohash && (() => { const { latitude, longitude } = ngeohash.decode(spot.geohash); + const lat = latitude.toFixed(6); + const lon = longitude.toFixed(6); + const label = encodeURIComponent(spot.title); return ( - +
+ +
); })()}