diff --git a/lib/src/Components/Map/Subcomponents/AddButton.tsx b/lib/src/Components/Map/Subcomponents/AddButton.tsx index 5cc953b7..198f3027 100644 --- a/lib/src/Components/Map/Subcomponents/AddButton.tsx +++ b/lib/src/Components/Map/Subcomponents/AddButton.tsx @@ -10,6 +10,8 @@ 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 } from 'react' + export default function AddButton({ triggerAction, }: { @@ -24,9 +26,20 @@ export default function AddButton({ const containerRef = useRef(null) useEffect(() => { - if (containerRef.current) { - DomEvent.disableClickPropagation(containerRef.current) - DomEvent.disableScrollPropagation(containerRef.current) + 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) } }, []) @@ -44,6 +57,28 @@ export default function AddButton({ return canAdd } + const stopPropagation = ( + event: ReactMouseEvent | ReactTouchEvent, + ): 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() ? ( @@ -54,7 +89,23 @@ export default function AddButton({ -
    +
      {layers.map( (layer) => layer.api?.createItem && @@ -76,16 +130,22 @@ export default function AddButton({ > - ) + + ) + }, [appState.assetsApi.url, selectNewItemPosition, setSelectNewItemPosition, toastId]) - toastIdRef.current = toast( -
      - {message} - -
      , - { - toastId: 'select-position-toast', + useEffect(() => { + if (selectNewItemPosition && toastContent) { + if (!toastIdRef.current) { + toastIdRef.current = toast(toastContent, { + toastId, autoClose: false, closeButton: false, closeOnClick: false, draggable: false, - }, - ) + }) + } else { + toast.update(toastId, { + render: toastContent, + autoClose: false, + closeButton: false, + closeOnClick: false, + draggable: false, + }) + } } if (!selectNewItemPosition && toastIdRef.current) { toast.dismiss(toastIdRef.current) toastIdRef.current = null } - }, [selectNewItemPosition, setSelectNewItemPosition]) + }, [selectNewItemPosition, toastContent, toastId]) return null }