import { unByKey } from "ol/Observable"; import { memo } from "preact/compat"; import { useCallback, useEffect, useState } from "preact/hooks"; import Minus from "../icons/Minus"; import Plus from "../icons/Plus"; import IconButton from "../ui/IconButton"; import useI18n from "../utils/hooks/useI18n"; import useMapContext from "../utils/hooks/useMapContext"; function ZoomButtons() { const { map } = useMapContext(); const [isZoomInDisabled, setIsZoomInDisabled] = useState(false); const [isZoomOutDisabled, setIsZoomOutDisabled] = useState(false); const { t } = useI18n(); const handleZoomIn = useCallback(() => { if (!map?.getView()) { return; } const view = map.getView(); const zoom = view.getZoom(); view.setZoom(zoom + 1); }, [map]); const handleZoomOut = useCallback(() => { if (!map?.getView()) { return; } const view = map.getView(); const zoom = view.getZoom(); view.setZoom(zoom - 1); }, [map]); useEffect(() => { const key = map?.on("moveend", () => { const view = map.getView(); const zoom = view.getZoom(); const maxzoom = view.getMaxZoom(); const minzoom = view.getMinZoom(); if (maxzoom && zoom === Number(maxzoom)) { setIsZoomInDisabled(true); } else { setIsZoomInDisabled(false); } if (minzoom && zoom === Number(minzoom)) { setIsZoomOutDisabled(true); } else { setIsZoomOutDisabled(false); } }); return () => { unByKey(key); }; }, [map]); return ( <> ); } export default memo(ZoomButtons);