diff --git a/package.json b/package.json index 5e50482..43b90f6 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@heroicons/react": "^2.1.3", "@serwist/next": "^8.4.4", "@serwist/precaching": "^8.4.4", "@serwist/sw": "^8.4.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 77250d3..2ceff37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@heroicons/react': + specifier: ^2.1.3 + version: 2.1.3(react@18.2.0) '@serwist/next': specifier: ^8.4.4 version: 8.4.4(next@14.1.4)(webpack@5.91.0) @@ -641,6 +644,14 @@ packages: tslib: 2.6.2 dev: false + /@heroicons/react@2.1.3(react@18.2.0): + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} + peerDependencies: + react: '>= 16' + dependencies: + react: 18.2.0 + dev: false + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index 4414197..670d0d9 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -1,4 +1,5 @@ import dynamic from "next/dynamic"; +import { type OverpassQueryFilter } from "overpass-ql-ts"; import { getData } from "@/services/overpass"; @@ -7,14 +8,19 @@ const LazyMap = dynamic(() => import("@/components/Map"), { loading: () =>

Loading...

, }); +const QUERY: OverpassQueryFilter = { + amenity: /(bar|restaurant|pub|cafe)/, + changing_table: "yes", +}; + export default async function Home() { - const data = await getData({ amenity: "restaurant", changing_table: "yes" }); + const data = await getData(QUERY); return (
({ + spots={data.map((e: any) => ({ position: [e.lat, e.lon], - content: e.tags.name, + content: e.tags?.name, }))} />
diff --git a/src/components/Map.tsx b/src/components/Map.tsx index 22864a5..9896c90 100644 --- a/src/components/Map.tsx +++ b/src/components/Map.tsx @@ -4,10 +4,40 @@ import "leaflet/dist/leaflet.css"; import "leaflet-defaulticon-compatibility/dist/leaflet-defaulticon-compatibility.webpack.css"; import "leaflet-defaulticon-compatibility"; -import { MapContainer, TileLayer } from "react-leaflet"; +import { ViewfinderCircleIcon } from "@heroicons/react/24/solid"; +import { useEffect } from "react"; +import { MapContainer, TileLayer, useMap } from "react-leaflet"; import Spot from "./Spot"; +const POSITION_CLASSES = { + bottomleft: "leaflet-bottom leaflet-left", + bottomright: "leaflet-bottom leaflet-right", + topleft: "leaflet-top leaflet-left", + topright: "leaflet-top leaflet-right", +}; + +const LocationControl = ({ position }: { position: string }) => { + const map = useMap(); + const locate = () => { + map.locate().on("locationfound", function (e) { + map.flyTo(e.latlng, map.getZoom()); + }); + }; + + useEffect(locate, [map]); + + const positionClass = + (position && POSITION_CLASSES[position]) || POSITION_CLASSES.topright; + return ( +
+ +
+ ); +}; + export default function Map({ spots }: { spots: any[] }) { return ( ( ))} + ); } diff --git a/src/services/overpass.ts b/src/services/overpass.ts index 76fffba..6e8dae6 100644 --- a/src/services/overpass.ts +++ b/src/services/overpass.ts @@ -1,9 +1,12 @@ -// @ts-expect-error -import { DefaultOverpassApi } from "overpass-ql-ts"; +import { DefaultOverpassApi, type OverpassQueryFilter } from "overpass-ql-ts"; import { cache } from "react"; const api = DefaultOverpassApi(); -export const getData = cache(async (query: any) => - api.execJson((s: any) => [s.node.query(query)]), -); +export const getData = cache(async (query: OverpassQueryFilter) => { + const results = await api.execJson((s) => { + return [s.node.query(query)]; + }); + console.debug(`Found ${results.elements.length} elements.`); + return results.elements; +});