import { useEffect, useMemo, useState, type FormEvent } from 'react' import type { AreaRead, ProjectRead } from '../../types' const AREA_CATALOG_PAGE_SIZE = 12 function projectDisplayName(project: ProjectRead | null): string { if (project?.name === 'Belgium and North Sea Workbench') { return 'België en Belgische Noordzee' } if (project?.name === 'Kempen Regional Workbench') { return 'Kempen · volledige regio' } if (project?.name === 'Mol Municipality Workbench') { return 'Mol · lokale historische werkruimte' } return project?.name ?? 'Geen werkruimte actief' } interface AreaFormState { name: string geometry: string crs: string } interface AreaPanelProps { areas: AreaRead[] selectedProject: ProjectRead | null selectedProjectId: string | null loadingAreas: boolean areaForm: AreaFormState selectedMapAreaId: string onCreateArea: (event: FormEvent) => void onUpdateAreaForm: (areaForm: AreaFormState) => void onSelectMapArea: (areaId: string) => void } export function AreaPanel({ areas, selectedProject, selectedProjectId, loadingAreas, areaForm, selectedMapAreaId, onCreateArea, onUpdateAreaForm, onSelectMapArea, }: AreaPanelProps): JSX.Element { const [catalogOpen, setCatalogOpen] = useState(false) const [searchQuery, setSearchQuery] = useState('') const [page, setPage] = useState(1) const selectedArea = areas.find((area) => area.id === selectedMapAreaId) const filteredAreas = useMemo(() => { const query = searchQuery.trim().toLocaleLowerCase('nl-BE') if (!query) return areas return areas.filter((area) => area.name.toLocaleLowerCase('nl-BE').includes(query)) }, [areas, searchQuery]) const pageCount = Math.max(1, Math.ceil(filteredAreas.length / AREA_CATALOG_PAGE_SIZE)) const visibleAreas = filteredAreas.slice( (page - 1) * AREA_CATALOG_PAGE_SIZE, page * AREA_CATALOG_PAGE_SIZE, ) useEffect(() => { setPage((current) => Math.min(current, pageCount)) }, [pageCount]) useEffect(() => { setSearchQuery('') setPage(1) setCatalogOpen(false) }, [selectedProjectId]) return (

Geografisch bereik

Gebieden

{areas.length}

{projectDisplayName(selectedProject)}

Getoond op de kaart {selectedArea?.name ?? 'Geen gebied geselecteerd'} {selectedArea?.area_m2 ? `${(selectedArea.area_m2 / 1_000_000).toLocaleString('nl-BE', { maximumFractionDigits: 2 })} km2` : 'Kies een gemeente, gewest, zeezone of teken een eigen selectie.'}
Eigen gebied toevoegen (GeoJSON)