CI / Build & Quality Checks (pull_request) Successful in 3m19s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 11s
CI / Playwright smoke (e2e) (pull_request) Successful in 14m32s
The composer's location button sent the exact position (6 decimals) from a single click once the browser permission had been granted, discarding the fix's accuracy, so a ±3.5 km Wi-Fi/IP fix was shown as exact. - ShareLocationDialog: "Share your location?" with the coordinates and ±accuracy, a "Check on OpenStreetMap" link, and Cancel / Send approximate (~1 km) / Send. Focus starts on Cancel; Esc cancels. - utils/geoShare.ts (unit-tested): RFC 5870 geo URI with `;u=` accuracy; approximate shares round to 2 decimals and never claim better than 1 km. - Location cards show the ± when the event carries `u=`. - The toolbar icon is a pin instead of the globe. Verified headless (fix 40.748817,-73.985428 ±3500 m): the click opens the dialog and sends nothing; Cancel/Esc send nothing; Send approximate → geo:40.75,-73.99;u=3500; Send → geo:40.748817,-73.985428;u=3500; the card reads "40.74882, -73.98543 (±3.5 km)". Fixes #340 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
40 lines
1.5 KiB
TypeScript
40 lines
1.5 KiB
TypeScript
/**
|
|
* [Gitea #340] Helpers for the "Share location" confirm step: the geo URI to
|
|
* send (RFC 5870, with the fix's accuracy as `u=` so receivers can draw a
|
|
* radius) and a human accuracy label, so a ±3 km Wi-Fi/IP fix isn't presented
|
|
* — or sent — as if it were exact.
|
|
*/
|
|
|
|
/** Decimals kept for an "approximate" share: 2 → ~1.1 km of latitude. */
|
|
export const APPROXIMATE_DECIMALS = 2;
|
|
/** Uncertainty reported for an approximate share (half a 0.01° cell, rounded up). */
|
|
export const APPROXIMATE_UNCERTAINTY_M = 1000;
|
|
|
|
const validAccuracy = (accuracy?: number): number | undefined =>
|
|
typeof accuracy === 'number' && Number.isFinite(accuracy) && accuracy > 0
|
|
? Math.round(accuracy)
|
|
: undefined;
|
|
|
|
export const buildGeoUri = (
|
|
latitude: number,
|
|
longitude: number,
|
|
accuracy?: number,
|
|
approximate = false,
|
|
): string => {
|
|
const decimals = approximate ? APPROXIMATE_DECIMALS : 6;
|
|
const u = approximate
|
|
? Math.max(APPROXIMATE_UNCERTAINTY_M, validAccuracy(accuracy) ?? 0)
|
|
: validAccuracy(accuracy);
|
|
const base = `geo:${latitude.toFixed(decimals)},${longitude.toFixed(decimals)}`;
|
|
return u ? `${base};u=${u}` : base;
|
|
};
|
|
|
|
/** "±12 m", "±3.5 km", or undefined when the browser gave no accuracy. */
|
|
export const formatAccuracy = (accuracy?: number): string | undefined => {
|
|
const m = validAccuracy(accuracy);
|
|
if (m === undefined) return undefined;
|
|
if (m < 1000) return `±${m} m`;
|
|
const km = m / 1000;
|
|
return `±${km < 10 ? km.toFixed(1) : Math.round(km)} km`;
|
|
};
|