import { Geolocation } from "@capacitor/geolocation"; import { LOCATION_DECIMALS } from "../constants"; import { log } from "./log"; const OPTIES = { enableHighAccuracy: false, timeout: 8000, maximumAge: 60000 }; /* * Huidige positie als { lat, lon }, afgerond op LOCATION_DECIMALS (2 ≈ 1 km): meer hebben we * niet nodig voor afstanden, en zo komt een precieze locatie de telefoon niet eens uit * (de server rondt bovendien zelf ook af). Op Android/iOS regelt @capacitor/geolocation de * permissie-prompt; in de browser valt de plugin terug op navigator.geolocation. Gooit bij * weigering/time-out. * * Het meelezen gaat hier met de hand en niet met `gelogd` uit lib/log.js: dat zou het hele * antwoord van de plugin tonen, en daar staat de onafgeronde positie in. Wat er wél in het log * hoort is het afgeronde antwoord met de nauwkeurigheid van de fix — genoeg om te zien of het * gelukt is en hoe scherp — en bij een mislukking de `code`, want daar zet de plugin de reden in: * location-disabled, location-permission-denied, location-timeout, location-unavailable en zo * verder. Die code is het verschil tussen "kijken waarom" en "het doet het soms niet". */ export async function currentLocation() { log("→ Geolocation.getCurrentPosition", JSON.stringify(OPTIES)); let pos; try { pos = await Geolocation.getCurrentPosition(OPTIES); } catch (e) { log("✗ Geolocation.getCurrentPosition", JSON.stringify({ code: e?.code ?? null, message: e?.message ?? String(e) })); throw e; } const uit = { lat: +pos.coords.latitude.toFixed(LOCATION_DECIMALS), lon: +pos.coords.longitude.toFixed(LOCATION_DECIMALS), }; log("← Geolocation.getCurrentPosition", JSON.stringify({ ...uit, accuracy: pos.coords.accuracy, timestamp: pos.timestamp })); return uit; }