const registerScan = async (position) => { locationRequestInFlight = false; if (scanRegistered) { return; } const latitude = Number(position.coords.latitude); const longitude = Number(position.coords.longitude); if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) { return; } dispatchLocationEvent('mycode:scan-location', { latitude, longitude }); const payload = new URLSearchParams({ identifier, latitude: String(Number(latitude.toFixed(7))), longitude: String(Number(longitude.toFixed(7))), }); try { await fetch(endpoint, { method: 'POST', body: payload, keepalive: true, }); scanRegistered = true; dismissNotice(); } catch (error) { console.warn('Scan registry request failed.', error); } }; const requestLocation = ({ enableHighAccuracy = false, timeout = 15000, maximumAge = 300000 } = {}) => { if (scanRegistered || locationRequestInFlight) { return; } locationRequestInFlight = true; navigator.geolocation.getCurrentPosition(registerScan, handleError, { enableHighAccuracy, timeout, maximumAge, }); }; const requestLocationWithFallback = () => { requestLocation({ enableHighAccuracy: false, timeout: 15000, maximumAge: 300000, }); }; const handleError = (error) => { locationRequestInFlight = false; console.warn('Geolocation was not available for scan registry.', error); dispatchLocationEvent('mycode:scan-location-error', { code: error?.code ?? null }); if (error && error.code === 1) { showPermissionNotice(); return; } if (error && error.code === 2) { if (!triedHighAccuracy) { triedHighAccuracy = true; requestLocation({ enableHighAccuracy: true, timeout: 25000, maximumAge: 0, }); return; } showUnavailableNotice(); return; } if (error && error.code === 3) { if (!triedHighAccuracy) { triedHighAccuracy = true; requestLocation({ enableHighAccuracy: true, timeout: 25000, maximumAge: 0, }); return; } showTimeoutNotice(); } };