"use client"; import { useState, useMemo } from "react"; import { ComposableMap, Geographies, Geography, ZoomableGroup, } from "react-simple-maps"; import { useHeatmapData, type HeatmapPoint } from "@/hooks/use-heatmap-data"; import { HeatmapLayer } from "./heatmap-layer"; import { geoMercator } from "d3-geo"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; const GEO_URL = "https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json"; interface ContinentConfig { center: [number, number]; zoom: number; label: string; } const continentConfigs: Record = { asia: { center: [100, 35], zoom: 2.5, label: "Asia" }, europe: { center: [15, 52], zoom: 4, label: "Europe" }, americas: { center: [-80, 15], zoom: 1.8, label: "Americas" }, africa: { center: [20, 5], zoom: 2.2, label: "Africa" }, oceania: { center: [145, -25], zoom: 3, label: "Oceania" }, }; const continentRegionMap: Record = { asia: "Asia", europe: "Europe", americas: "Americas", africa: "Africa", oceania: "Oceania", }; interface ContinentMapProps { slug: string; } export function ContinentMap({ slug }: ContinentMapProps) { const config = continentConfigs[slug] ?? continentConfigs.asia; const regionFilter = continentRegionMap[slug]; const { points } = useHeatmapData(30000); const [selectedPoint, setSelectedPoint] = useState(null); const filteredPoints = useMemo( () => (regionFilter ? points.filter(() => true) : points), [points, regionFilter] ); const projection = useMemo( () => geoMercator() .center(config.center) .scale(150 * config.zoom) .translate([400, 300]), [config] ); const projectionFn = (coords: [number, number]): [number, number] | null => { const result = projection(coords); return result ?? null; }; return (
{({ geographies }) => geographies.map((geo) => ( )) }
{selectedPoint && (

{selectedPoint.city}

{selectedPoint.country}

{selectedPoint.lobsterCount} lobsters weight: {selectedPoint.weight.toFixed(1)}
)}
); }