"use client" import type React from "react" import { useState, useCallback, useRef, useEffect } from "react" import { type ViewState, Map, type MapRef, NavigationControl } from "react-map-gl/mapbox" import { FullscreenControl } from "react-map-gl/mapbox" import { BASE_LATITUDE, BASE_LONGITUDE, BASE_ZOOM, MAPBOX_STYLES, type MapboxStyle } from "@/app/_utils/const/map" import "mapbox-gl/dist/mapbox-gl.css" import { createRoot } from "react-dom/client" import { YearSelectorControl } from "./controls/year-selector" import { useFullscreen } from "@/app/_hooks/use-fullscreen" import { CustomControl } from "./controls/example" import { toast } from "sonner" interface MapViewProps { children?: React.ReactNode initialViewState?: Partial mapStyle?: MapboxStyle className?: string width?: string | number height?: string | number mapboxApiAccessToken?: string onMoveEnd?: (viewState: ViewState) => void customControls?: React.ReactNode } export default function MapView({ children, initialViewState, mapStyle = MAPBOX_STYLES.Standard, className = "w-full h-96", width = "100%", height = "100%", mapboxApiAccessToken = process.env.NEXT_PUBLIC_MAPBOX_ACCESS_TOKEN, onMoveEnd, }: MapViewProps) { const [mapRef, setMapRef] = useState(null) const mapContainerRef = useRef(null) const { isFullscreen } = useFullscreen(mapContainerRef) const defaultViewState: Partial = { longitude: BASE_LONGITUDE, latitude: BASE_LATITUDE, zoom: BASE_ZOOM, bearing: 0, pitch: 0, ...initialViewState, } const handleMoveEnd = useCallback( (event: any) => { if (onMoveEnd) { onMoveEnd(event.viewState) } }, [onMoveEnd] ) return (
{children}
) }