"use client" import { useEffect } from "react" import { MapContainer, TileLayer, Marker, Popup, useMap } from "react-leaflet" import L from "leaflet" import "leaflet/dist/leaflet.css" import { Restaurant } from "@/app/types" import Link from "next/link" // Custom amber marker function createAmberIcon(isSelected: boolean) { const size = isSelected ? 40 : 32 const svg = ` ` return L.divIcon({ html: svg, className: "", iconSize: [size, size], iconAnchor: [size / 2, size], popupAnchor: [0, -size], }) } function avgRating(r: Restaurant) { if (!r.visits.length) return 0 return r.visits.reduce((s, v) => s + v.rating, 0) / r.visits.length } function FlyToSelected({ restaurants, selectedId, }: { restaurants: Restaurant[] selectedId: string | null }) { const map = useMap() useEffect(() => { if (!selectedId) return const r = restaurants.find((x) => x.id === selectedId) if (r) { map.flyTo([r.lat, r.lng], 13, { duration: 1 }) } }, [selectedId, restaurants, map]) return null } interface Props { restaurants: Restaurant[] selectedId: string | null onSelect: (id: string | null) => void theme?: "light" | "dark" } export default function MapView({ restaurants, selectedId, onSelect, theme = "dark" }: Props) { const center: [number, number] = restaurants.length > 0 ? [restaurants[0].lat, restaurants[0].lng] : [51.5, 10] const tileUrl = theme === "dark" ? "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png" : "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png" return ( {restaurants.map((r) => ( onSelect(r.id === selectedId ? null : r.id), }} > {r.name} {r.city}, {r.country} {r.cuisine.map((c) => ( {c} ))} {avgRating(r).toFixed(1)} {r.visits.length} {r.visits.length === 1 ? "visit" : "visits"} View details ))} ) }
{r.name}
{r.city}, {r.country}