Skip to content

Commit 3981e9f

Browse files
committed
Added support for ios send pin
1 parent 0bc95a7 commit 3981e9f

2 files changed

Lines changed: 34 additions & 19 deletions

File tree

src/lib/parse-coordinates.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,28 +46,33 @@ function extractUrlFromText(text: string): string | null {
4646
return null;
4747
}
4848

49-
function parseAppleMapsUrl(url: URL): Coordinates | null {
50-
// ll param takes precedence
51-
const ll = url.searchParams.get("ll");
52-
if (ll) {
53-
const parts = ll.split(",");
54-
if (parts.length === 2) {
55-
const lat = parseFloat(parts[0]);
56-
const lng = parseFloat(parts[1]);
57-
if (!isNaN(lat) && !isNaN(lng)) return { lat, lng };
58-
}
49+
function parseCoordParam(value: string | null): Coordinates | null {
50+
if (!value) return null;
51+
const parts = value.split(",");
52+
if (parts.length === 2) {
53+
const lat = parseFloat(parts[0].trim());
54+
const lng = parseFloat(parts[1].trim());
55+
if (!isNaN(lat) && !isNaN(lng)) return { lat, lng };
5956
}
57+
return null;
58+
}
59+
60+
function parseAppleMapsUrl(url: URL): Coordinates | null {
61+
// coordinate param (iOS dropped pin: /place?coordinate=lat,lng)
62+
const coord = parseCoordParam(url.searchParams.get("coordinate"));
63+
if (coord) return coord;
64+
65+
// ll param
66+
const ll = parseCoordParam(url.searchParams.get("ll"));
67+
if (ll) return ll;
6068

6169
// Fall back to q param if it looks like coordinates
62-
const q = url.searchParams.get("q");
63-
if (q) {
64-
const parts = q.split(",");
65-
if (parts.length === 2) {
66-
const lat = parseFloat(parts[0].trim());
67-
const lng = parseFloat(parts[1].trim());
68-
if (!isNaN(lat) && !isNaN(lng)) return { lat, lng };
69-
}
70-
}
70+
const q = parseCoordParam(url.searchParams.get("q"));
71+
if (q) return q;
72+
73+
// sll param (sometimes included as starting location)
74+
const sll = parseCoordParam(url.searchParams.get("sll"));
75+
if (sll) return sll;
7176

7277
return null;
7378
}

test/parse-coordinates.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ describe("parseCoordinates", () => {
6565
});
6666

6767
describe("Apple Maps URLs", () => {
68+
it("parses iOS dropped pin with coordinate param", async () => {
69+
const result = await parseCoordinates(
70+
"https://maps.apple.com/place?coordinate=49.263547,-123.064553&name=Dropped%20Pin&span=0.008626,0.016866"
71+
);
72+
expect(result).toEqual({
73+
ok: true,
74+
coordinates: { lat: 49.263547, lng: -123.064553 },
75+
});
76+
});
77+
6878
it("parses maps.apple.com with ll param", async () => {
6979
const result = await parseCoordinates(
7080
"https://maps.apple.com/?ll=51.0447,-115.0632&q=Marked%20Location"

0 commit comments

Comments
 (0)