"use client";
import { useState, useRef, useCallback } from "react";
import dynamic from "next/dynamic";
import { LayerPanel, getDefaultVisibility } from "./layer-panel";
import { BasemapSwitcher } from "./basemap-switcher";
import { SearchBar } from "./search-bar";
import { SelectionToolbar, type SelectionMode } from "./selection-toolbar";
import { FeatureInfoPanel } from "./feature-info-panel";
import type { MapViewerHandle } from "./map-viewer";
import type {
BasemapId, ClickedFeature, LayerVisibility, SearchResult, SelectedFeature,
} from "../types";
const MapViewer = dynamic(
() => import("./map-viewer").then((m) => ({ default: m.MapViewer })),
{
ssr: false,
loading: () => (
),
}
);
export function GeoportalModule() {
const mapHandleRef = useRef(null);
const [basemap, setBasemap] = useState("liberty");
const [layerVisibility, setLayerVisibility] = useState(getDefaultVisibility);
const [clickedFeature, setClickedFeature] = useState(null);
const [selectionMode, setSelectionMode] = useState("off");
const [selectedFeatures, setSelectedFeatures] = useState([]);
const [flyTarget, setFlyTarget] = useState<{ center: [number, number]; zoom?: number } | undefined>();
const handleFeatureClick = useCallback((feature: ClickedFeature | null) => {
// null = clicked on empty space, close panel
if (!feature || !feature.properties) {
setClickedFeature(null);
return;
}
setClickedFeature(feature);
}, []);
const handleSearchResult = useCallback((result: SearchResult) => {
if (result.coordinates) {
setFlyTarget({ center: result.coordinates, zoom: result.type === "uat" ? 12 : 17 });
}
}, []);
const handleSelectionModeChange = useCallback((mode: SelectionMode) => {
if (mode === "off") {
mapHandleRef.current?.clearSelection();
setSelectedFeatures([]);
}
setSelectionMode(mode);
}, []);
return (
{/* Top-left: search + layers */}
{/* Top-right: basemap switcher + feature panel (aligned) */}
{clickedFeature && selectionMode === "off" && (
setClickedFeature(null)} />
)}
{/* Bottom-left: selection toolbar */}
{ mapHandleRef.current?.clearSelection(); setSelectedFeatures([]); }}
/>
);
}