/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import { DomEvent } from 'leaflet' import { useEffect, useRef, useState } from 'react' import SVG from 'react-inlinesvg' import PlusSVG from '#assets/plus.svg' import { useAppState } from '#components/AppShell/hooks/useAppState' import { useLayers } from '#components/Map/hooks/useLayers' import { useHasUserPermission } from '#components/Map/hooks/usePermissions' import useWindowDimensions from '#components/Map/hooks/useWindowDimension' import type { MouseEvent as ReactMouseEvent, TouchEvent as ReactTouchEvent, PointerEvent as ReactPointerEvent, } from 'react' export default function AddButton({ triggerAction, }: { triggerAction: React.Dispatch> }) { const layers = useLayers() const hasUserPermission = useHasUserPermission() const appState = useAppState() const { width } = useWindowDimensions() const isMobile = width < 768 const [isOpen, setIsOpen] = useState(false) const containerRef = useRef(null) useEffect(() => { const container = containerRef.current if (!container) return DomEvent.disableClickPropagation(container) DomEvent.disableScrollPropagation(container) const stopPointerPropagation = (event: PointerEvent) => { event.stopPropagation() } DomEvent.on(container, 'pointerdown pointerup pointermove', stopPointerPropagation) return () => { DomEvent.off(container, 'pointerdown pointerup pointermove', stopPointerPropagation) } }, []) const canAddItems = () => { let canAdd = false layers.map((layer) => { if ( layer.api?.createItem && hasUserPermission(layer.api.collectionName!, 'create', undefined, layer) && layer.listed ) canAdd = true return null }) return canAdd } const stopPropagation = ( event: | ReactMouseEvent | ReactTouchEvent | ReactPointerEvent, ): void => { event.preventDefault() event.stopPropagation() if ( 'nativeEvent' in event && typeof event.nativeEvent.stopImmediatePropagation === 'function' ) { event.nativeEvent.stopImmediatePropagation() } } const handleLayerSelect = ( event: ReactMouseEvent | ReactTouchEvent, layer: (typeof layers)[number], ) => { stopPropagation(event) triggerAction(layer) setIsOpen(false) } return ( <> {canAddItems() ? (
) : ( '' )} ) }