'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var React = require('react'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function debounce(func, wait) { var timeout; return function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var context = this; clearTimeout(timeout); timeout = setTimeout(function () { return func.apply(context, args); }, wait); }; } function parentHasClass(element, className) { while (element) { if (element.classList && element.classList.contains(className)) { return true; } element = element.parentElement; } return false; } function parentPosition(element) { var rect = element.getBoundingClientRect(); return { x: rect.left, y: rect.top }; } function osm(x, y, z) { return "https://tile.openstreetmap.org/" + z + "/" + x + "/" + y + ".png"; } var ANIMATION_TIME = 300; var DIAGONAL_THROW_TIME = 1500; var SCROLL_PIXELS_FOR_ZOOM_LEVEL = 150; var MIN_DRAG_FOR_THROW = 40; var CLICK_TOLERANCE = 2; var DOUBLE_CLICK_DELAY = 300; var DEBOUNCE_DELAY = 60; var PINCH_RELEASE_THROW_DELAY = 300; var WARNING_DISPLAY_TIMEOUT = 300; var NOOP = function NOOP() { return true; }; var lng2tile = function lng2tile(lon, zoom) { return (lon + 180) / 360 * Math.pow(2, zoom); }; var lat2tile = function lat2tile(lat, zoom) { return (1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom); }; function tile2lng(x, z) { return x / Math.pow(2, z) * 360 - 180; } function tile2lat(y, z) { var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z); return 180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))); } function getMousePixel(dom, event) { var parent = parentPosition(dom); return [event.clientX - parent.x, event.clientY - parent.y]; } function easeOutQuad(t) { return t * (2 - t); } var absoluteMinMax = [tile2lat(Math.pow(2, 10), 10), tile2lat(0, 10), tile2lng(0, 10), tile2lng(Math.pow(2, 10), 10)]; var hasWindow = typeof window !== 'undefined'; var performanceNow = hasWindow && window.performance && window.performance.now ? function () { return window.performance.now(); } : function () { var timeStart = new Date().getTime(); return function () { return new Date().getTime() - timeStart; }; }(); var requestAnimationFrame = function requestAnimationFrame(callback) { if (hasWindow) { return (window.requestAnimationFrame || window.setTimeout)(callback); } else { callback(new Date().getTime()); return null; } }; var cancelAnimationFrame = function cancelAnimationFrame(animFrame) { return hasWindow && animFrame ? (window.cancelAnimationFrame || window.clearTimeout)(animFrame) : false; }; function srcSet(dprs, url, x, y, z) { if (!dprs || dprs.length === 0) { return ''; } return dprs.map(function (dpr) { return url(x, y, z, dpr) + (dpr === 1 ? '' : " " + dpr + "x"); }).join(', '); } var ImgTile = function ImgTile(_ref) { var tile = _ref.tile, tileLoaded = _ref.tileLoaded; return /*#__PURE__*/React__default["default"].createElement("img", { src: tile.url, srcSet: tile.srcSet, width: tile.width, height: tile.height, loading: 'lazy', onLoad: tileLoaded, alt: '', style: { position: 'absolute', left: tile.left, top: tile.top, willChange: 'transform', transformOrigin: 'top left', opacity: 1 } }); }; var Map = /*#__PURE__*/function (_Component) { _inheritsLoose(Map, _Component); function Map(props) { var _ref2, _props$defaultZoom, _ref3, _props$defaultCenter, _ref4, _props$width, _ref5, _props$height; var _this; _this = _Component.call(this, props) || this; _defineProperty(_assertThisInitialized(_this), "_containerRef", void 0); _defineProperty(_assertThisInitialized(_this), "_mousePosition", void 0); _defineProperty(_assertThisInitialized(_this), "_loadTracker", void 0); _defineProperty(_assertThisInitialized(_this), "_dragStart", null); _defineProperty(_assertThisInitialized(_this), "_mouseDown", false); _defineProperty(_assertThisInitialized(_this), "_moveEvents", []); _defineProperty(_assertThisInitialized(_this), "_lastClick", null); _defineProperty(_assertThisInitialized(_this), "_lastTap", null); _defineProperty(_assertThisInitialized(_this), "_lastWheel", null); _defineProperty(_assertThisInitialized(_this), "_touchStartPixel", null); _defineProperty(_assertThisInitialized(_this), "_touchStartMidPoint", null); _defineProperty(_assertThisInitialized(_this), "_touchStartDistance", null); _defineProperty(_assertThisInitialized(_this), "_secondTouchEnd", null); _defineProperty(_assertThisInitialized(_this), "_warningClearTimeout", null); _defineProperty(_assertThisInitialized(_this), "_isAnimating", false); _defineProperty(_assertThisInitialized(_this), "_animationStart", null); _defineProperty(_assertThisInitialized(_this), "_animationEnd", null); _defineProperty(_assertThisInitialized(_this), "_zoomStart", null); _defineProperty(_assertThisInitialized(_this), "_centerTarget", null); _defineProperty(_assertThisInitialized(_this), "_zoomTarget", null); _defineProperty(_assertThisInitialized(_this), "_zoomAround", null); _defineProperty(_assertThisInitialized(_this), "_animFrame", null); _defineProperty(_assertThisInitialized(_this), "_boundsSynced", false); _defineProperty(_assertThisInitialized(_this), "_minMaxCache", null); _defineProperty(_assertThisInitialized(_this), "_lastZoom", void 0); _defineProperty(_assertThisInitialized(_this), "_lastCenter", void 0); _defineProperty(_assertThisInitialized(_this), "_centerStart", void 0); _defineProperty(_assertThisInitialized(_this), "_resizeObserver", null); _defineProperty(_assertThisInitialized(_this), "updateWidthHeight", function () { if (_this._containerRef) { var rect = _this._containerRef.getBoundingClientRect(); if (rect && rect.width > 0 && rect.height > 0) { _this.setState({ width: rect.width, height: rect.height }); return true; } } return false; }); _defineProperty(_assertThisInitialized(_this), "wa", function () { var _window; return (_window = window).addEventListener.apply(_window, arguments); }); _defineProperty(_assertThisInitialized(_this), "wr", function () { var _window2; return (_window2 = window).removeEventListener.apply(_window2, arguments); }); _defineProperty(_assertThisInitialized(_this), "bindMouseEvents", function () { _this.wa('mousedown', _this.handleMouseDown); _this.wa('mouseup', _this.handleMouseUp); _this.wa('mousemove', _this.handleMouseMove); }); _defineProperty(_assertThisInitialized(_this), "bindTouchEvents", function () { _this.wa('touchstart', _this.handleTouchStart, { passive: false }); _this.wa('touchmove', _this.handleTouchMove, { passive: false }); _this.wa('touchend', _this.handleTouchEnd, { passive: false }); }); _defineProperty(_assertThisInitialized(_this), "unbindMouseEvents", function () { _this.wr('mousedown', _this.handleMouseDown); _this.wr('mouseup', _this.handleMouseUp); _this.wr('mousemove', _this.handleMouseMove); }); _defineProperty(_assertThisInitialized(_this), "unbindTouchEvents", function () { _this.wr('touchstart', _this.handleTouchStart); _this.wr('touchmove', _this.handleTouchMove); _this.wr('touchend', _this.handleTouchEnd); }); _defineProperty(_assertThisInitialized(_this), "bindResizeEvent", function () { _this.wa('resize', _this.updateWidthHeight); }); _defineProperty(_assertThisInitialized(_this), "unbindResizeEvent", function () { _this.wr('resize', _this.updateWidthHeight); }); _defineProperty(_assertThisInitialized(_this), "bindWheelEvent", function () { if (_this._containerRef) { _this._containerRef.addEventListener('wheel', _this.handleWheel, { passive: false }); } }); _defineProperty(_assertThisInitialized(_this), "unbindWheelEvent", function () { if (_this._containerRef) { _this._containerRef.removeEventListener('wheel', _this.handleWheel); } }); _defineProperty(_assertThisInitialized(_this), "setCenterZoomTarget", function (center, zoom, fromProps, zoomAround, animationDuration) { if (fromProps === void 0) { fromProps = false; } if (zoomAround === void 0) { zoomAround = null; } if (animationDuration === void 0) { animationDuration = ANIMATION_TIME; } if (_this.props.animate && (!fromProps || _this.distanceInScreens(center, zoom, _this.state.center, _this.state.zoom) <= _this.props.animateMaxScreens)) { if (_this._isAnimating) { cancelAnimationFrame(_this._animFrame); var _this$animationStep = _this.animationStep(performanceNow()), centerStep = _this$animationStep.centerStep, zoomStep = _this$animationStep.zoomStep; _this._centerStart = centerStep; _this._zoomStart = zoomStep; } else { _this._isAnimating = true; _this._centerStart = _this.limitCenterAtZoom([_this._lastCenter[0], _this._lastCenter[1]], _this._lastZoom); _this._zoomStart = _this._lastZoom; _this.onAnimationStart(); } _this._animationStart = performanceNow(); _this._animationEnd = _this._animationStart + animationDuration; if (zoomAround) { _this._zoomAround = zoomAround; _this._centerTarget = _this.calculateZoomCenter(_this._lastCenter, zoomAround, _this._lastZoom, zoom); } else { _this._zoomAround = null; _this._centerTarget = center; } _this._zoomTarget = zoom; _this._animFrame = requestAnimationFrame(_this.animate); } else { _this.stopAnimating(); if (zoomAround) { var _center = _this.calculateZoomCenter(_this._lastCenter, zoomAround, _this._lastZoom, zoom); _this.setCenterZoom(_center, zoom, fromProps); } else { _this.setCenterZoom(center || _this.state.center, zoom, fromProps); } } }); _defineProperty(_assertThisInitialized(_this), "setCenterZoomForChildren", function (center, zoom) { _this.setCenterZoomTarget(center || _this.state.center, zoom || _this.state.zoom, true); }); _defineProperty(_assertThisInitialized(_this), "distanceInScreens", function (centerTarget, zoomTarget, center, zoom) { var _this$state = _this.state, width = _this$state.width, height = _this$state.height; var l1 = _this.latLngToPixel(center, center, zoom); var l2 = _this.latLngToPixel(centerTarget, center, zoom); var z1 = _this.latLngToPixel(center, center, zoomTarget); var z2 = _this.latLngToPixel(centerTarget, center, zoomTarget); var w = (Math.abs(l1[0] - l2[0]) + Math.abs(z1[0] - z2[0])) / 2 / width; var h = (Math.abs(l1[1] - l2[1]) + Math.abs(z1[1] - z2[1])) / 2 / height; return Math.sqrt(w * w + h * h); }); _defineProperty(_assertThisInitialized(_this), "animationStep", function (timestamp) { if (!_this._animationEnd || !_this._animationStart || !_this._zoomTarget || !_this._zoomStart || !_this._centerStart || !_this._centerTarget) { return { centerStep: _this.state.center, zoomStep: _this.state.zoom }; } var length = _this._animationEnd - _this._animationStart; var progress = Math.max(timestamp - _this._animationStart, 0); var percentage = easeOutQuad(progress / length); var zoomDiff = (_this._zoomTarget - _this._zoomStart) * percentage; var zoomStep = _this._zoomStart + zoomDiff; if (_this._zoomAround) { var centerStep = _this.calculateZoomCenter(_this._centerStart, _this._zoomAround, _this._zoomStart, zoomStep); return { centerStep: centerStep, zoomStep: zoomStep }; } else { var _centerStep = [_this._centerStart[0] + (_this._centerTarget[0] - _this._centerStart[0]) * percentage, _this._centerStart[1] + (_this._centerTarget[1] - _this._centerStart[1]) * percentage]; return { centerStep: _centerStep, zoomStep: zoomStep }; } }); _defineProperty(_assertThisInitialized(_this), "animate", function (timestamp) { if (!_this._animationEnd || timestamp >= _this._animationEnd) { _this._isAnimating = false; _this.setCenterZoom(_this._centerTarget, _this._zoomTarget, true); _this.onAnimationStop(); } else { var _this$animationStep2 = _this.animationStep(timestamp), centerStep = _this$animationStep2.centerStep, zoomStep = _this$animationStep2.zoomStep; _this.setCenterZoom(centerStep, zoomStep); _this._animFrame = requestAnimationFrame(_this.animate); } }); _defineProperty(_assertThisInitialized(_this), "stopAnimating", function () { if (_this._isAnimating) { _this._isAnimating = false; _this.onAnimationStop(); cancelAnimationFrame(_this._animFrame); } }); _defineProperty(_assertThisInitialized(_this), "limitCenterAtZoom", function (center, zoom) { var minMax = _this.getBoundsMinMax(zoom || _this.state.zoom); return [Math.max(Math.min(!center || isNaN(center[0]) ? _this.state.center[0] : center[0], minMax[1]), minMax[0]), Math.max(Math.min(!center || isNaN(center[1]) ? _this.state.center[1] : center[1], minMax[3]), minMax[2])]; }); _defineProperty(_assertThisInitialized(_this), "onAnimationStart", function () { _this.props.onAnimationStart && _this.props.onAnimationStart(); }); _defineProperty(_assertThisInitialized(_this), "onAnimationStop", function () { _this.props.onAnimationStop && _this.props.onAnimationStop(); }); _defineProperty(_assertThisInitialized(_this), "setCenterZoom", function (center, zoom, animationEnded) { if (animationEnded === void 0) { animationEnded = false; } var limitedCenter = _this.limitCenterAtZoom(center, zoom); if (zoom && Math.round(_this.state.zoom) !== Math.round(zoom)) { var tileValues = _this.tileValues(_this.state); var nextValues = _this.tileValues({ center: limitedCenter, zoom: zoom, width: _this.state.width, height: _this.state.height }); var oldTiles = _this.state.oldTiles; _this.setState({ oldTiles: oldTiles.filter(function (o) { return o.roundedZoom !== tileValues.roundedZoom; }).concat(tileValues) }, NOOP); var loadTracker = {}; for (var x = nextValues.tileMinX; x <= nextValues.tileMaxX; x++) { for (var y = nextValues.tileMinY; y <= nextValues.tileMaxY; y++) { var key = x + "-" + y + "-" + nextValues.roundedZoom; loadTracker[key] = false; } } _this._loadTracker = loadTracker; } _this.setState({ center: limitedCenter, zoom: zoom || _this.state.zoom }, NOOP); var maybeZoom = _this.props.zoom ? _this.props.zoom : _this._lastZoom; var maybeCenter = _this.props.center ? _this.props.center : _this._lastCenter; if (zoom && (animationEnded || Math.abs(maybeZoom - zoom) > 0.001 || Math.abs(maybeCenter[0] - limitedCenter[0]) > 0.00001 || Math.abs(maybeCenter[1] - limitedCenter[1]) > 0.00001)) { _this._lastZoom = zoom; _this._lastCenter = [].concat(limitedCenter); _this.syncToProps(limitedCenter, zoom); } }); _defineProperty(_assertThisInitialized(_this), "getBoundsMinMax", function (zoom) { if (_this.props.limitBounds === 'center') { return absoluteMinMax; } var _this$state2 = _this.state, width = _this$state2.width, height = _this$state2.height; if (_this._minMaxCache && _this._minMaxCache[0] === zoom && _this._minMaxCache[1] === width && _this._minMaxCache[2] === height) { return _this._minMaxCache[3]; } var pixelsAtZoom = Math.pow(2, zoom) * 256; var minLng = width > pixelsAtZoom ? 0 : tile2lng(width / 512, zoom); var minLat = height > pixelsAtZoom ? 0 : tile2lat(Math.pow(2, zoom) - height / 512, zoom); var maxLng = width > pixelsAtZoom ? 0 : tile2lng(Math.pow(2, zoom) - width / 512, zoom); var maxLat = height > pixelsAtZoom ? 0 : tile2lat(height / 512, zoom); var minMax = [minLat, maxLat, minLng, maxLng]; _this._minMaxCache = [zoom, width, height, minMax]; return minMax; }); _defineProperty(_assertThisInitialized(_this), "tileLoaded", function (key) { if (_this._loadTracker && key in _this._loadTracker) { _this._loadTracker[key] = true; var unloadedCount = Object.values(_this._loadTracker).filter(function (v) { return !v; }).length; if (unloadedCount === 0) { _this.setState({ oldTiles: [] }, NOOP); } } }); _defineProperty(_assertThisInitialized(_this), "handleTouchStart", function (event) { if (!_this._containerRef) { return; } if (event.target && parentHasClass(event.target, 'pigeon-drag-block')) { return; } if (event.touches.length === 1) { var touch = event.touches[0]; var pixel = getMousePixel(_this._containerRef, touch); if (_this.coordsInside(pixel)) { _this._touchStartPixel = [pixel]; if (!_this.props.twoFingerDrag) { _this.stopAnimating(); if (_this._lastTap && performanceNow() - _this._lastTap < DOUBLE_CLICK_DELAY) { event.preventDefault(); var latLngNow = _this.pixelToLatLng(_this._touchStartPixel[0]); _this.setCenterZoomTarget(null, Math.max(_this.props.minZoom, Math.min(_this.state.zoom + 1, _this.props.maxZoom)), false, latLngNow); } else { _this._lastTap = performanceNow(); _this.trackMoveEvents(pixel); } } } } else if (event.touches.length === 2 && _this._touchStartPixel) { event.preventDefault(); _this.stopTrackingMoveEvents(); if (_this.state.pixelDelta || _this.state.zoomDelta) { _this.sendDeltaChange(); } var t1 = getMousePixel(_this._containerRef, event.touches[0]); var t2 = getMousePixel(_this._containerRef, event.touches[1]); _this._touchStartPixel = [t1, t2]; _this._touchStartMidPoint = [(t1[0] + t2[0]) / 2, (t1[1] + t2[1]) / 2]; _this._touchStartDistance = Math.sqrt(Math.pow(t1[0] - t2[0], 2) + Math.pow(t1[1] - t2[1], 2)); } }); _defineProperty(_assertThisInitialized(_this), "handleTouchMove", function (event) { if (!_this._containerRef) { _this._touchStartPixel = null; return; } if (event.touches.length === 1 && _this._touchStartPixel) { var touch = event.touches[0]; var pixel = getMousePixel(_this._containerRef, touch); if (_this.props.twoFingerDrag) { if (_this.coordsInside(pixel)) { _this.showWarning('fingers'); } } else { event.preventDefault(); _this.trackMoveEvents(pixel); _this.setState({ pixelDelta: [pixel[0] - _this._touchStartPixel[0][0], pixel[1] - _this._touchStartPixel[0][1]] }, NOOP); } } else if (event.touches.length === 2 && _this._touchStartPixel && _this._touchStartMidPoint && _this._touchStartDistance) { var _this$state3 = _this.state, width = _this$state3.width, height = _this$state3.height, zoom = _this$state3.zoom; event.preventDefault(); var t1 = getMousePixel(_this._containerRef, event.touches[0]); var t2 = getMousePixel(_this._containerRef, event.touches[1]); var midPoint = [(t1[0] + t2[0]) / 2, (t1[1] + t2[1]) / 2]; var midPointDiff = [midPoint[0] - _this._touchStartMidPoint[0], midPoint[1] - _this._touchStartMidPoint[1]]; var distance = Math.sqrt(Math.pow(t1[0] - t2[0], 2) + Math.pow(t1[1] - t2[1], 2)); var zoomDelta = Math.max(_this.props.minZoom, Math.min(_this.props.maxZoom, zoom + Math.log2(distance / _this._touchStartDistance))) - zoom; var scale = Math.pow(2, zoomDelta); var centerDiffDiff = [(width / 2 - midPoint[0]) * (scale - 1), (height / 2 - midPoint[1]) * (scale - 1)]; _this.setState({ zoomDelta: zoomDelta, pixelDelta: [centerDiffDiff[0] + midPointDiff[0] * scale, centerDiffDiff[1] + midPointDiff[1] * scale] }, NOOP); } }); _defineProperty(_assertThisInitialized(_this), "handleTouchEnd", function (event) { if (!_this._containerRef) { _this._touchStartPixel = null; return; } if (_this._touchStartPixel) { var _this$props = _this.props, zoomSnap = _this$props.zoomSnap, twoFingerDrag = _this$props.twoFingerDrag, minZoom = _this$props.minZoom, maxZoom = _this$props.maxZoom; var zoomDelta = _this.state.zoomDelta; var _this$sendDeltaChange = _this.sendDeltaChange(), center = _this$sendDeltaChange.center, zoom = _this$sendDeltaChange.zoom; if (event.touches.length === 0) { if (twoFingerDrag) { _this.clearWarning(); } else { var oldTouchPixel = _this._touchStartPixel[0]; var newTouchPixel = getMousePixel(_this._containerRef, event.changedTouches[0]); if (Math.abs(oldTouchPixel[0] - newTouchPixel[0]) > CLICK_TOLERANCE || Math.abs(oldTouchPixel[1] - newTouchPixel[1]) > CLICK_TOLERANCE) { if (!_this._secondTouchEnd || performanceNow() - _this._secondTouchEnd > PINCH_RELEASE_THROW_DELAY) { event.preventDefault(); _this.throwAfterMoving(newTouchPixel, center, zoom); } } _this._touchStartPixel = null; _this._secondTouchEnd = null; } } else if (event.touches.length === 1) { event.preventDefault(); var touch = getMousePixel(_this._containerRef, event.touches[0]); _this._secondTouchEnd = performanceNow(); _this._touchStartPixel = [touch]; _this.trackMoveEvents(touch); if (zoomSnap) { var latLng = _this._touchStartMidPoint ? _this.pixelToLatLng(_this._touchStartMidPoint) : _this.state.center; var zoomTarget; if (twoFingerDrag && Math.round(_this.state.zoom) === Math.round(_this.state.zoom + zoomDelta)) { zoomTarget = Math.round(_this.state.zoom); } else { zoomTarget = zoomDelta > 0 ? Math.ceil(_this.state.zoom) : Math.floor(_this.state.zoom); } var _zoom = Math.max(minZoom, Math.min(zoomTarget, maxZoom)); _this.setCenterZoomTarget(latLng, _zoom, false, latLng); } } } }); _defineProperty(_assertThisInitialized(_this), "handleMouseDown", function (event) { if (!_this._containerRef) { return; } var pixel = getMousePixel(_this._containerRef, event); if (event.button === 0 && (!event.target || !parentHasClass(event.target, 'pigeon-drag-block')) && _this.coordsInside(pixel)) { _this.stopAnimating(); event.preventDefault(); if (_this._lastClick && performanceNow() - _this._lastClick < DOUBLE_CLICK_DELAY) { if (!parentHasClass(event.target, 'pigeon-click-block')) { var latLngNow = _this.pixelToLatLng(_this._mousePosition || pixel); _this.setCenterZoomTarget(null, Math.max(_this.props.minZoom, Math.min(_this.state.zoom + 1, _this.props.maxZoom)), false, latLngNow); } } else { _this._lastClick = performanceNow(); _this._mouseDown = true; _this._dragStart = pixel; _this.trackMoveEvents(pixel); } } }); _defineProperty(_assertThisInitialized(_this), "handleMouseMove", function (event) { if (!_this._containerRef) { return; } _this._mousePosition = getMousePixel(_this._containerRef, event); if (_this._mouseDown && _this._dragStart) { _this.trackMoveEvents(_this._mousePosition); _this.setState({ pixelDelta: [_this._mousePosition[0] - _this._dragStart[0], _this._mousePosition[1] - _this._dragStart[1]] }, NOOP); } }); _defineProperty(_assertThisInitialized(_this), "handleMouseUp", function (event) { if (!_this._containerRef) { _this._mouseDown = false; return; } var pixelDelta = _this.state.pixelDelta; if (_this._mouseDown) { _this._mouseDown = false; var pixel = getMousePixel(_this._containerRef, event); if (_this.props.onClick && (!event.target || !parentHasClass(event.target, 'pigeon-click-block')) && (!pixelDelta || Math.abs(pixelDelta[0]) + Math.abs(pixelDelta[1]) <= CLICK_TOLERANCE)) { var latLng = _this.pixelToLatLng(pixel); _this.props.onClick({ event: event, latLng: latLng, pixel: pixel }); _this.setState({ pixelDelta: undefined }, NOOP); } else { var _this$sendDeltaChange2 = _this.sendDeltaChange(), center = _this$sendDeltaChange2.center, zoom = _this$sendDeltaChange2.zoom; _this.throwAfterMoving(pixel, center, zoom); } } }); _defineProperty(_assertThisInitialized(_this), "stopTrackingMoveEvents", function () { _this._moveEvents = []; }); _defineProperty(_assertThisInitialized(_this), "trackMoveEvents", function (coords) { var timestamp = performanceNow(); if (_this._moveEvents.length === 0 || timestamp - _this._moveEvents[_this._moveEvents.length - 1].timestamp > 40) { _this._moveEvents.push({ timestamp: timestamp, coords: coords }); if (_this._moveEvents.length > 2) { _this._moveEvents.shift(); } } }); _defineProperty(_assertThisInitialized(_this), "throwAfterMoving", function (coords, center, zoom) { var _this$state4 = _this.state, width = _this$state4.width, height = _this$state4.height; var animate = _this.props.animate; var timestamp = performanceNow(); var lastEvent = _this._moveEvents.shift(); if (lastEvent && animate) { var deltaMs = Math.max(timestamp - lastEvent.timestamp, 1); var delta = [(coords[0] - lastEvent.coords[0]) / deltaMs * 120, (coords[1] - lastEvent.coords[1]) / deltaMs * 120]; var distance = Math.sqrt(delta[0] * delta[0] + delta[1] * delta[1]); if (distance > MIN_DRAG_FOR_THROW) { var diagonal = Math.sqrt(width * width + height * height); var throwTime = DIAGONAL_THROW_TIME * distance / diagonal; var lng = tile2lng(lng2tile(center[1], zoom) - delta[0] / 256.0, zoom); var lat = tile2lat(lat2tile(center[0], zoom) - delta[1] / 256.0, zoom); _this.setCenterZoomTarget([lat, lng], zoom, false, null, throwTime); } } _this.stopTrackingMoveEvents(); }); _defineProperty(_assertThisInitialized(_this), "sendDeltaChange", function () { var _this$state5 = _this.state, center = _this$state5.center, zoom = _this$state5.zoom, pixelDelta = _this$state5.pixelDelta, zoomDelta = _this$state5.zoomDelta; var lat = center[0]; var lng = center[1]; if (pixelDelta || zoomDelta !== 0) { lng = tile2lng(lng2tile(center[1], zoom + zoomDelta) - (pixelDelta ? pixelDelta[0] / 256.0 : 0), zoom + zoomDelta); lat = tile2lat(lat2tile(center[0], zoom + zoomDelta) - (pixelDelta ? pixelDelta[1] / 256.0 : 0), zoom + zoomDelta); _this.setCenterZoom([lat, lng], zoom + zoomDelta); } _this.setState({ pixelDelta: undefined, zoomDelta: 0 }, NOOP); return { center: _this.limitCenterAtZoom([lat, lng], zoom + zoomDelta), zoom: zoom + zoomDelta }; }); _defineProperty(_assertThisInitialized(_this), "getBounds", function (center, zoom) { if (center === void 0) { center = _this.state.center; } if (zoom === void 0) { zoom = _this.zoomPlusDelta(); } var _this$state6 = _this.state, width = _this$state6.width, height = _this$state6.height; return { ne: _this.pixelToLatLng([width - 1, 0], center, zoom), sw: _this.pixelToLatLng([0, height - 1], center, zoom) }; }); _defineProperty(_assertThisInitialized(_this), "syncToProps", function (center, zoom) { if (center === void 0) { center = _this.state.center; } if (zoom === void 0) { zoom = _this.state.zoom; } var onBoundsChanged = _this.props.onBoundsChanged; if (onBoundsChanged) { var bounds = _this.getBounds(center, zoom); onBoundsChanged({ center: center, zoom: zoom, bounds: bounds, initial: !_this._boundsSynced }); _this._boundsSynced = true; } }); _defineProperty(_assertThisInitialized(_this), "handleWheel", function (event) { var _this$props2 = _this.props, mouseEvents = _this$props2.mouseEvents, metaWheelZoom = _this$props2.metaWheelZoom, zoomSnap = _this$props2.zoomSnap, animate = _this$props2.animate; if (!mouseEvents) { return; } if (!metaWheelZoom || event.metaKey || event.ctrlKey) { event.preventDefault(); var addToZoom = -event.deltaY / SCROLL_PIXELS_FOR_ZOOM_LEVEL; if (!zoomSnap && _this._zoomTarget) { var stillToAdd = _this._zoomTarget - _this.state.zoom; _this.zoomAroundMouse(addToZoom + stillToAdd, event); } else { if (animate) { _this.zoomAroundMouse(addToZoom, event); } else { if (!_this._lastWheel || performanceNow() - _this._lastWheel > ANIMATION_TIME) { _this._lastWheel = performanceNow(); _this.zoomAroundMouse(addToZoom, event); } } } } else { _this.showWarning('wheel'); } }); _defineProperty(_assertThisInitialized(_this), "showWarning", function (warningType) { if (!_this.state.showWarning || _this.state.warningType !== warningType) { _this.setState({ showWarning: true, warningType: warningType }); } if (_this._warningClearTimeout) { window.clearTimeout(_this._warningClearTimeout); } _this._warningClearTimeout = window.setTimeout(_this.clearWarning, WARNING_DISPLAY_TIMEOUT); }); _defineProperty(_assertThisInitialized(_this), "clearWarning", function () { if (_this.state.showWarning) { _this.setState({ showWarning: false }); } }); _defineProperty(_assertThisInitialized(_this), "zoomAroundMouse", function (zoomDiff, event) { if (!_this._containerRef) { return; } var zoom = _this.state.zoom; var _this$props3 = _this.props, minZoom = _this$props3.minZoom, maxZoom = _this$props3.maxZoom, zoomSnap = _this$props3.zoomSnap; _this._mousePosition = getMousePixel(_this._containerRef, event); if (!_this._mousePosition || zoom === minZoom && zoomDiff < 0 || zoom === maxZoom && zoomDiff > 0) { return; } var latLngNow = _this.pixelToLatLng(_this._mousePosition); var zoomTarget = zoom + zoomDiff; if (zoomSnap) { zoomTarget = zoomDiff < 0 ? Math.floor(zoomTarget) : Math.ceil(zoomTarget); } zoomTarget = Math.max(minZoom, Math.min(zoomTarget, maxZoom)); _this.setCenterZoomTarget(null, zoomTarget, false, latLngNow); }); _defineProperty(_assertThisInitialized(_this), "zoomPlusDelta", function () { return _this.state.zoom + _this.state.zoomDelta; }); _defineProperty(_assertThisInitialized(_this), "pixelToLatLng", function (pixel, center, zoom) { if (center === void 0) { center = _this.state.center; } if (zoom === void 0) { zoom = _this.zoomPlusDelta(); } var _this$state7 = _this.state, width = _this$state7.width, height = _this$state7.height, pixelDelta = _this$state7.pixelDelta; var pointDiff = [(pixel[0] - width / 2 - (pixelDelta ? pixelDelta[0] : 0)) / 256.0, (pixel[1] - height / 2 - (pixelDelta ? pixelDelta[1] : 0)) / 256.0]; var tileX = lng2tile(center[1], zoom) + pointDiff[0]; var tileY = lat2tile(center[0], zoom) + pointDiff[1]; return [Math.max(absoluteMinMax[0], Math.min(absoluteMinMax[1], tile2lat(tileY, zoom))), Math.max(absoluteMinMax[2], Math.min(absoluteMinMax[3], tile2lng(tileX, zoom)))]; }); _defineProperty(_assertThisInitialized(_this), "latLngToPixel", function (latLng, center, zoom) { if (center === void 0) { center = _this.state.center; } if (zoom === void 0) { zoom = _this.zoomPlusDelta(); } var _this$state8 = _this.state, width = _this$state8.width, height = _this$state8.height, pixelDelta = _this$state8.pixelDelta; var tileCenterX = lng2tile(center[1], zoom); var tileCenterY = lat2tile(center[0], zoom); var tileX = lng2tile(latLng[1], zoom); var tileY = lat2tile(latLng[0], zoom); return [(tileX - tileCenterX) * 256.0 + width / 2 + (pixelDelta ? pixelDelta[0] : 0), (tileY - tileCenterY) * 256.0 + height / 2 + (pixelDelta ? pixelDelta[1] : 0)]; }); _defineProperty(_assertThisInitialized(_this), "calculateZoomCenter", function (center, coords, oldZoom, newZoom) { var _this$state9 = _this.state, width = _this$state9.width, height = _this$state9.height; var pixelBefore = _this.latLngToPixel(coords, center, oldZoom); var pixelAfter = _this.latLngToPixel(coords, center, newZoom); var newCenter = _this.pixelToLatLng([width / 2 + pixelAfter[0] - pixelBefore[0], height / 2 + pixelAfter[1] - pixelBefore[1]], center, newZoom); return _this.limitCenterAtZoom(newCenter, newZoom); }); _defineProperty(_assertThisInitialized(_this), "setRef", function (dom) { _this._containerRef = dom; }); _this.syncToProps = debounce(_this.syncToProps, DEBOUNCE_DELAY); _this._lastZoom = (_ref2 = (_props$defaultZoom = props.defaultZoom) !== null && _props$defaultZoom !== void 0 ? _props$defaultZoom : props.zoom) !== null && _ref2 !== void 0 ? _ref2 : 14; _this._lastCenter = (_ref3 = (_props$defaultCenter = props.defaultCenter) !== null && _props$defaultCenter !== void 0 ? _props$defaultCenter : props.center) !== null && _ref3 !== void 0 ? _ref3 : [0, 0]; _this.state = { zoom: _this._lastZoom, center: _this._lastCenter, width: (_ref4 = (_props$width = props.width) !== null && _props$width !== void 0 ? _props$width : props.defaultWidth) !== null && _ref4 !== void 0 ? _ref4 : -1, height: (_ref5 = (_props$height = props.height) !== null && _props$height !== void 0 ? _props$height : props.defaultHeight) !== null && _ref5 !== void 0 ? _ref5 : -1, zoomDelta: 0, pixelDelta: undefined, oldTiles: [], showWarning: false, warningType: undefined }; return _this; } var _proto = Map.prototype; _proto.componentDidMount = function componentDidMount() { var _this2 = this; this.props.mouseEvents && this.bindMouseEvents(); this.props.touchEvents && this.bindTouchEvents(); if (!this.props.width || !this.props.height) { if (!this.updateWidthHeight()) { requestAnimationFrame(this.updateWidthHeight); } this.bindResizeEvent(); } this.bindWheelEvent(); this.syncToProps(); if (typeof window.ResizeObserver !== 'undefined') { this._resizeObserver = new window.ResizeObserver(function () { _this2.updateWidthHeight(); }); this._resizeObserver.observe(this._containerRef); } }; _proto.componentWillUnmount = function componentWillUnmount() { this.props.mouseEvents && this.unbindMouseEvents(); this.props.touchEvents && this.unbindTouchEvents(); this.unbindWheelEvent(); if (!this.props.width || !this.props.height) { this.unbindResizeEvent(); } if (this._resizeObserver) { this._resizeObserver.disconnect(); } }; _proto.componentDidUpdate = function componentDidUpdate(prevProps) { var _prevProps$center; if (this.props.mouseEvents !== prevProps.mouseEvents) { this.props.mouseEvents ? this.bindMouseEvents() : this.unbindMouseEvents(); } if (this.props.touchEvents !== prevProps.touchEvents) { this.props.touchEvents ? this.bindTouchEvents() : this.unbindTouchEvents(); } if (this.props.width && this.props.width !== prevProps.width) { this.setState({ width: this.props.width }); } if (this.props.height && this.props.height !== prevProps.height) { this.setState({ height: this.props.height }); } if (!this.props.center && !this.props.zoom) { return; } if ((!this.props.center || this.props.center[0] === (prevProps === null || prevProps === void 0 ? void 0 : (_prevProps$center = prevProps.center) === null || _prevProps$center === void 0 ? void 0 : _prevProps$center[0]) && this.props.center[1] === prevProps.center[1]) && this.props.zoom === prevProps.zoom) { return; } var currentCenter = this._isAnimating ? this._centerTarget : this.state.center; var currentZoom = this._isAnimating ? this._zoomTarget : this.state.zoom; if (currentCenter && currentZoom) { var _this$props$center, _this$props$zoom; var nextCenter = (_this$props$center = this.props.center) !== null && _this$props$center !== void 0 ? _this$props$center : currentCenter; var nextZoom = (_this$props$zoom = this.props.zoom) !== null && _this$props$zoom !== void 0 ? _this$props$zoom : currentZoom; if (Math.abs(nextZoom - currentZoom) > 0.001 || Math.abs(nextCenter[0] - currentCenter[0]) > 0.0001 || Math.abs(nextCenter[1] - currentCenter[1]) > 0.0001) { this.setCenterZoomTarget(nextCenter, nextZoom, true); } } }; _proto.coordsInside = function coordsInside(pixel) { var _this$state10 = this.state, width = _this$state10.width, height = _this$state10.height; if (pixel[0] < 0 || pixel[1] < 0 || pixel[0] >= width || pixel[1] >= height) { return false; } var parent = this._containerRef; if (parent) { var pos = parentPosition(parent); var element = document.elementFromPoint(pixel[0] + pos.x, pixel[1] + pos.y); return parent === element || parent.contains(element); } else { return false; } }; _proto.tileValues = function tileValues(_ref6) { var center = _ref6.center, zoom = _ref6.zoom, pixelDelta = _ref6.pixelDelta, zoomDelta = _ref6.zoomDelta, width = _ref6.width, height = _ref6.height; var roundedZoom = Math.round(zoom + (zoomDelta || 0)); var zoomDiff = zoom + (zoomDelta || 0) - roundedZoom; var scale = Math.pow(2, zoomDiff); var scaleWidth = width / scale; var scaleHeight = height / scale; var tileCenterX = lng2tile(center[1], roundedZoom) - (pixelDelta ? pixelDelta[0] / 256.0 / scale : 0); var tileCenterY = lat2tile(center[0], roundedZoom) - (pixelDelta ? pixelDelta[1] / 256.0 / scale : 0); var halfWidth = scaleWidth / 2 / 256.0; var halfHeight = scaleHeight / 2 / 256.0; var tileMinX = Math.floor(tileCenterX - halfWidth); var tileMaxX = Math.floor(tileCenterX + halfWidth); var tileMinY = Math.floor(tileCenterY - halfHeight); var tileMaxY = Math.floor(tileCenterY + halfHeight); return { tileMinX: tileMinX, tileMaxX: tileMaxX, tileMinY: tileMinY, tileMaxY: tileMaxY, tileCenterX: tileCenterX, tileCenterY: tileCenterY, roundedZoom: roundedZoom, zoomDelta: zoomDelta || 0, scaleWidth: scaleWidth, scaleHeight: scaleHeight, scale: scale }; }; _proto.renderTiles = function renderTiles() { var _this3 = this; var _this$state11 = this.state, oldTiles = _this$state11.oldTiles, width = _this$state11.width, height = _this$state11.height; var dprs = this.props.dprs; var mapUrl = this.props.provider || osm; var _this$tileValues = this.tileValues(this.state), tileMinX = _this$tileValues.tileMinX, tileMaxX = _this$tileValues.tileMaxX, tileMinY = _this$tileValues.tileMinY, tileMaxY = _this$tileValues.tileMaxY, tileCenterX = _this$tileValues.tileCenterX, tileCenterY = _this$tileValues.tileCenterY, roundedZoom = _this$tileValues.roundedZoom, scaleWidth = _this$tileValues.scaleWidth, scaleHeight = _this$tileValues.scaleHeight, scale = _this$tileValues.scale; var tiles = []; for (var i = 0; i < oldTiles.length; i++) { var old = oldTiles[i]; var zoomDiff = old.roundedZoom - roundedZoom; if (Math.abs(zoomDiff) > 4 || zoomDiff === 0) { continue; } var pow = 1 / Math.pow(2, zoomDiff); var xDiff = -(tileMinX - old.tileMinX * pow) * 256; var yDiff = -(tileMinY - old.tileMinY * pow) * 256; var _xMin = Math.max(old.tileMinX, 0); var _yMin = Math.max(old.tileMinY, 0); var _xMax = Math.min(old.tileMaxX, Math.pow(2, old.roundedZoom) - 1); var _yMax = Math.min(old.tileMaxY, Math.pow(2, old.roundedZoom) - 1); for (var x = _xMin; x <= _xMax; x++) { for (var y = _yMin; y <= _yMax; y++) { tiles.push({ key: x + "-" + y + "-" + old.roundedZoom, url: mapUrl(x, y, old.roundedZoom), srcSet: srcSet(dprs, mapUrl, x, y, old.roundedZoom), left: xDiff + (x - old.tileMinX) * 256 * pow, top: yDiff + (y - old.tileMinY) * 256 * pow, width: 256 * pow, height: 256 * pow, active: false }); } } } var xMin = Math.max(tileMinX, 0); var yMin = Math.max(tileMinY, 0); var xMax = Math.min(tileMaxX, Math.pow(2, roundedZoom) - 1); var yMax = Math.min(tileMaxY, Math.pow(2, roundedZoom) - 1); for (var _x = xMin; _x <= xMax; _x++) { for (var _y = yMin; _y <= yMax; _y++) { tiles.push({ key: _x + "-" + _y + "-" + roundedZoom, url: mapUrl(_x, _y, roundedZoom), srcSet: srcSet(dprs, mapUrl, _x, _y, roundedZoom), left: (_x - tileMinX) * 256, top: (_y - tileMinY) * 256, width: 256, height: 256, active: true }); } } var boxStyle = { width: scaleWidth, height: scaleHeight, position: 'absolute', top: "calc((100% - " + height + "px) / 2)", left: "calc((100% - " + width + "px) / 2)", overflow: 'hidden', willChange: 'transform', transform: "scale(" + scale + ", " + scale + ")", transformOrigin: 'top left' }; var boxClassname = this.props.boxClassname || 'pigeon-tiles-box'; var left = -((tileCenterX - tileMinX) * 256 - scaleWidth / 2); var top = -((tileCenterY - tileMinY) * 256 - scaleHeight / 2); var tilesStyle = { position: 'absolute', width: (tileMaxX - tileMinX + 1) * 256, height: (tileMaxY - tileMinY + 1) * 256, willChange: 'transform', transform: "translate(" + left + "px, " + top + "px)" }; var Tile = this.props.tileComponent; return /*#__PURE__*/React__default["default"].createElement("div", { style: boxStyle, className: boxClassname }, /*#__PURE__*/React__default["default"].createElement("div", { className: "pigeon-tiles", style: tilesStyle }, tiles.map(function (tile) { return /*#__PURE__*/React__default["default"].createElement(Tile, { key: tile.key, tile: tile, tileLoaded: function tileLoaded() { return _this3.tileLoaded(tile.key); } }); }))); }; _proto.renderOverlays = function renderOverlays() { var _this4 = this; var _this$state12 = this.state, width = _this$state12.width, height = _this$state12.height, center = _this$state12.center; var mapState = { bounds: this.getBounds(), zoom: this.zoomPlusDelta(), center: center, width: width, height: height }; var childrenWithProps = React__default["default"].Children.map(this.props.children, function (child) { if (!child) { return null; } if (! /*#__PURE__*/React__default["default"].isValidElement(child)) { return child; } var _child$props = child.props, anchor = _child$props.anchor, position = _child$props.position, offset = _child$props.offset; var c = _this4.latLngToPixel(anchor || position || center); return /*#__PURE__*/React__default["default"].cloneElement(child, { left: c[0] - (offset ? offset[0] : 0), top: c[1] - (offset ? offset[1] : 0), latLngToPixel: _this4.latLngToPixel, pixelToLatLng: _this4.pixelToLatLng, setCenterZoom: _this4.setCenterZoomForChildren, mapProps: _this4.props, mapState: mapState }); }); var childrenStyle = { position: 'absolute', width: width, height: height, top: "calc((100% - " + height + "px) / 2)", left: "calc((100% - " + width + "px) / 2)" }; return /*#__PURE__*/React__default["default"].createElement("div", { className: "pigeon-overlays", style: childrenStyle }, childrenWithProps); }; _proto.renderAttribution = function renderAttribution() { var _this$props4 = this.props, attribution = _this$props4.attribution, attributionPrefix = _this$props4.attributionPrefix; if (attribution === false) { return null; } var style = { position: 'absolute', bottom: 0, right: 0, fontSize: '11px', padding: '2px 5px', background: 'rgba(255, 255, 255, 0.7)', fontFamily: "'Helvetica Neue', Helvetica, Arial, sans-serif", color: '#333' }; var linkStyle = { color: '#0078A8', textDecoration: 'none' }; return /*#__PURE__*/React__default["default"].createElement("div", { key: "attr", className: "pigeon-attribution", style: style }, attributionPrefix === false ? null : /*#__PURE__*/React__default["default"].createElement("span", null, attributionPrefix || /*#__PURE__*/React__default["default"].createElement("a", { href: "https://pigeon-maps.js.org/", style: linkStyle, target: "_blank", rel: "noreferrer noopener" }, "Pigeon"), ' | '), attribution || /*#__PURE__*/React__default["default"].createElement("span", null, ' © ', /*#__PURE__*/React__default["default"].createElement("a", { href: "https://www.openstreetmap.org/copyright", style: linkStyle, target: "_blank", rel: "noreferrer noopener" }, "OpenStreetMap"), ' contributors')); }; _proto.renderWarning = function renderWarning() { var _this$props5 = this.props, metaWheelZoom = _this$props5.metaWheelZoom, metaWheelZoomWarning = _this$props5.metaWheelZoomWarning, twoFingerDrag = _this$props5.twoFingerDrag, twoFingerDragWarning = _this$props5.twoFingerDragWarning, warningZIndex = _this$props5.warningZIndex; var _this$state13 = this.state, showWarning = _this$state13.showWarning, warningType = _this$state13.warningType, width = _this$state13.width, height = _this$state13.height; if (metaWheelZoom && metaWheelZoomWarning || twoFingerDrag && twoFingerDragWarning) { var style = { position: 'absolute', top: 0, left: 0, width: width, height: height, overflow: 'hidden', pointerEvents: 'none', opacity: showWarning ? 100 : 0, transition: 'opacity 300ms', background: 'rgba(0,0,0,0.5)', color: '#fff', display: 'flex', justifyContent: 'center', alignItems: 'center', fontSize: 22, fontFamily: '"Arial", sans-serif', textAlign: 'center', zIndex: warningZIndex }; var meta = typeof window !== 'undefined' && window.navigator && window.navigator.platform.toUpperCase().indexOf('MAC') >= 0 ? '⌘' : 'ctrl'; var warningText = warningType === 'fingers' ? twoFingerDragWarning : metaWheelZoomWarning; return /*#__PURE__*/React__default["default"].createElement("div", { className: "pigeon-overlay-warning", style: style }, warningText.replace('META', meta)); } else { return null; } }; _proto.render = function render() { var _this$props6 = this.props, touchEvents = _this$props6.touchEvents, twoFingerDrag = _this$props6.twoFingerDrag; var _this$state14 = this.state, width = _this$state14.width, height = _this$state14.height; var containerStyle = { width: this.props.width ? width : '100%', height: this.props.height ? height : '100%', position: 'relative', display: 'inline-block', overflow: 'hidden', background: '#dddddd', touchAction: touchEvents ? twoFingerDrag ? 'pan-x pan-y' : 'none' : 'auto' }; var hasSize = !!(width && height); return /*#__PURE__*/React__default["default"].createElement("div", { style: containerStyle, ref: this.setRef, dir: "ltr" }, hasSize && this.renderTiles(), hasSize && this.renderOverlays(), hasSize && this.renderAttribution(), hasSize && this.renderWarning()); }; return Map; }(React.Component); _defineProperty(Map, "defaultProps", { animate: true, metaWheelZoom: false, metaWheelZoomWarning: 'Use META + wheel to zoom!', twoFingerDrag: false, twoFingerDragWarning: 'Use two fingers to move the map', zoomSnap: true, mouseEvents: true, touchEvents: true, warningZIndex: 100, animateMaxScreens: 5, minZoom: 1, maxZoom: 18, limitBounds: 'center', dprs: [], tileComponent: ImgTile }); function Marker(props) { var width = typeof props.width !== 'undefined' ? props.width : typeof props.height !== 'undefined' ? props.height * 29 / 34 : 29; var height = typeof props.height !== 'undefined' ? props.height : typeof props.width !== 'undefined' ? props.width * 34 / 29 : 34; var _useState = React.useState(props.hover || false), internalHover = _useState[0], setInternalHover = _useState[1]; var hover = typeof props.hover === 'undefined' ? internalHover : props.hover; var color = props.color || '#93C0D0'; var eventParameters = function eventParameters(event) { return { event: event, anchor: props.anchor, payload: props.payload }; }; return /*#__PURE__*/React__default["default"].createElement("div", { style: _objectSpread2({ position: 'absolute', transform: "translate(" + (props.left - width / 2) + "px, " + (props.top - (height - 1)) + "px)", filter: hover ? 'drop-shadow(0 0 4px rgba(0, 0, 0, .3))' : '', pointerEvents: 'none', cursor: 'pointer' }, props.style || {}), className: props.className ? props.className + " pigeon-click-block" : 'pigeon-click-block', onClick: props.onClick ? function (event) { return props.onClick(eventParameters(event)); } : null, onContextMenu: props.onContextMenu ? function (event) { return props.onContextMenu(eventParameters(event)); } : null, onMouseOver: function onMouseOver(event) { props.onMouseOver && props.onMouseOver(eventParameters(event)); setInternalHover(true); }, onMouseOut: function onMouseOut(event) { props.onMouseOut && props.onMouseOut(eventParameters(event)); setInternalHover(false); } }, props.children || /*#__PURE__*/React__default["default"].createElement("svg", { width: width, height: height, viewBox: "0 0 61 71", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React__default["default"].createElement("g", { style: { pointerEvents: 'auto' } }, /*#__PURE__*/React__default["default"].createElement("path", { d: "M52 31.5C52 36.8395 49.18 42.314 45.0107 47.6094C40.8672 52.872 35.619 57.678 31.1763 61.6922C30.7916 62.0398 30.2084 62.0398 29.8237 61.6922C25.381 57.678 20.1328 52.872 15.9893 47.6094C11.82 42.314 9 36.8395 9 31.5C9 18.5709 18.6801 9 30.5 9C42.3199 9 52 18.5709 52 31.5Z", fill: color, stroke: "white", strokeWidth: "4" }), /*#__PURE__*/React__default["default"].createElement("circle", { cx: "30.5", cy: "30.5", r: "8.5", fill: "white", opacity: hover ? 0.98 : 0.6 })))); } function Overlay(props) { return /*#__PURE__*/React__default["default"].createElement("div", { style: _objectSpread2({ position: 'absolute', transform: "translate(" + props.left + "px, " + props.top + "px)" }, props.style || {}), className: props.className ? props.className + " pigeon-click-block" : 'pigeon-click-block' }, props.children); } var defaultSvgAttributes = { fill: '#93c0d099', strokeWidth: '2', stroke: 'white', r: '30' }; function PointComponent(props) { var _props$svgAttributes; var latLngToPixel = props.latLngToPixel; var _props$coordinates = props.coordinates, y = _props$coordinates[0], x = _props$coordinates[1]; var _latLngToPixel = latLngToPixel([x, y]), cx = _latLngToPixel[0], cy = _latLngToPixel[1]; if ((_props$svgAttributes = props.svgAttributes) !== null && _props$svgAttributes !== void 0 && _props$svgAttributes.path) { var path = "M" + cx + "," + cy + "c" + props.svgAttributes.path.split(/[c|C|L|l|v|V|h|H]([\s\S]*)/)[1]; return /*#__PURE__*/React__default["default"].createElement("path", _objectSpread2({ d: path }, props.svgAttributes)); } return /*#__PURE__*/React__default["default"].createElement("circle", _objectSpread2({ cx: cx, cy: cy }, props.svgAttributes)); } function MultiPoint(props) { return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, props.coordinates.map(function (point, i) { return /*#__PURE__*/React__default["default"].createElement(PointComponent, _objectSpread2(_objectSpread2({}, props), {}, { coordinates: point, key: i })); })); } function LineString(props) { var latLngToPixel = props.latLngToPixel; var p = 'M' + props.coordinates.reduce(function (a, _ref) { var y = _ref[0], x = _ref[1]; var _latLngToPixel2 = latLngToPixel([x, y]), v = _latLngToPixel2[0], w = _latLngToPixel2[1]; return a + ' ' + v + ' ' + w; }, ''); return /*#__PURE__*/React__default["default"].createElement("path", _objectSpread2({ d: p }, props.svgAttributes)); } function MultiLineString(props) { return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, props.coordinates.map(function (line, i) { return /*#__PURE__*/React__default["default"].createElement(LineString, _objectSpread2(_objectSpread2({}, props), {}, { coordinates: line, key: i })); })); } function Polygon(props) { var latLngToPixel = props.latLngToPixel; var p = props.coordinates.reduce(function (a, part) { return a + ' M' + part.reduce(function (a, _ref2) { var y = _ref2[0], x = _ref2[1]; var _latLngToPixel3 = latLngToPixel([x, y]), v = _latLngToPixel3[0], w = _latLngToPixel3[1]; return a + ' ' + v + ' ' + w; }, '') + 'Z'; }, ''); return /*#__PURE__*/React__default["default"].createElement("path", _objectSpread2({ d: p }, props.svgAttributes)); } function MultiPolygon(props) { return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, props.coordinates.map(function (polygon, i) { return /*#__PURE__*/React__default["default"].createElement(Polygon, _objectSpread2(_objectSpread2({}, props), {}, { coordinates: polygon, key: i })); })); } function GeometryCollection(props) { var renderer = { Point: PointComponent, MultiPoint: MultiPoint, LineString: LineString, MultiLineString: MultiLineString, Polygon: Polygon, MultiPolygon: MultiPolygon }; var _props$geometry = props.geometry, type = _props$geometry.type, coordinates = _props$geometry.coordinates, geometries = _props$geometry.geometries; if (type === 'GeometryCollection') { return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, geometries.map(function (geometry, i) { return /*#__PURE__*/React__default["default"].createElement(GeometryCollection, _objectSpread2(_objectSpread2({ key: i }, props), {}, { geometry: geometry })); })); } var Component = renderer[type]; if (Component === undefined) { console.warn("The GeoJson Type " + type + " is not known"); return null; } return /*#__PURE__*/React__default["default"].createElement(Component, { latLngToPixel: props.latLngToPixel, geometry: props.geometry, coordinates: coordinates, svgAttributes: props.svgAttributes }); } function GeoJsonFeature(props) { var _useState = React.useState(props.hover || false), internalHover = _useState[0], setInternalHover = _useState[1]; var hover = props.hover !== undefined ? props.hover : internalHover; var callbackSvgAttributes = props.styleCallback && props.styleCallback(props.feature, hover); var svgAttributes = callbackSvgAttributes ? props.svgAttributes ? _objectSpread2(_objectSpread2({}, props.svgAttributes), callbackSvgAttributes) : callbackSvgAttributes : props.svgAttributes ? props.svgAttributes : defaultSvgAttributes; var eventParameters = function eventParameters(event) { return { event: event, anchor: props.anchor, payload: props.feature }; }; return /*#__PURE__*/React__default["default"].createElement("g", { clipRule: "evenodd", style: { pointerEvents: 'auto' }, onClick: props.onClick ? function (event) { return props.onClick(eventParameters(event)); } : null, onContextMenu: props.onContextMenu ? function (event) { return props.onContextMenu(eventParameters(event)); } : null, onMouseOver: function onMouseOver(event) { props.onMouseOver && props.onMouseOver(eventParameters(event)); setInternalHover(true); }, onMouseOut: function onMouseOut(event) { props.onMouseOut && props.onMouseOut(eventParameters(event)); setInternalHover(false); } }, /*#__PURE__*/React__default["default"].createElement(GeometryCollection, _objectSpread2(_objectSpread2(_objectSpread2({}, props), props.feature), {}, { svgAttributes: svgAttributes }))); } function GeoJson(props) { var _props$mapState = props.mapState, width = _props$mapState.width, height = _props$mapState.height; return /*#__PURE__*/React__default["default"].createElement("div", { style: _objectSpread2({ position: 'absolute', left: '0', top: '0', pointerEvents: 'none', cursor: 'pointer' }, props.style || {}), className: props.className ? props.className + " pigeon-click-block" : 'pigeon-click-block' }, /*#__PURE__*/React__default["default"].createElement("svg", { width: width, height: height, viewBox: "0 0 " + width + " " + height, fill: "none", xmlns: "http://www.w3.org/2000/svg" }, props.data && props.data.features.map(function (feature, i) { return /*#__PURE__*/React__default["default"].createElement(GeoJsonFeature, _objectSpread2(_objectSpread2({ key: i }, props), {}, { feature: feature })); }), React__default["default"].Children.map(props.children, function (child) { if (!child) { return null; } if (! /*#__PURE__*/React__default["default"].isValidElement(child)) { return child; } return /*#__PURE__*/React__default["default"].cloneElement(child, props); }))); } function GeoJsonLoader(props) { var _useState2 = React.useState(props.data ? props.data : null), data = _useState2[0], setData = _useState2[1]; React.useEffect(function () { fetch(props.link).then(function (response) { return response.json(); }).then(function (data) { return setData(data); }); }, [props.link]); return data ? /*#__PURE__*/React__default["default"].createElement(GeoJson, _objectSpread2({ data: data }, props)) : null; } function isDescendentOf(element, ancestor) { while (element) { if (element === ancestor) { return true; } element = element.parentElement; } return false; } var defaultState = { isDragging: false, startX: undefined, startY: undefined, startLeft: undefined, startTop: undefined, deltaX: 0, deltaY: 0 }; function Draggable(props) { var dragRef = React.useRef(); var propsRef = React.useRef(props); var stateRef = React.useRef(_objectSpread2({}, defaultState)); var _useState = React.useState(defaultState), _state = _useState[0], _setState = _useState[1]; propsRef.current = props; var setState = function setState(stateUpdate) { var newState = _objectSpread2(_objectSpread2({}, stateRef.current), stateUpdate); stateRef.current = newState; _setState(newState); }; var _props$mapProps = props.mapProps, mouseEvents = _props$mapProps.mouseEvents, touchEvents = _props$mapProps.touchEvents; React.useEffect(function () { var handleDragStart = function handleDragStart(event) { if (isDescendentOf(event.target, dragRef.current)) { event.preventDefault(); setState({ isDragging: true, startX: ('touches' in event ? event.touches[0] : event).clientX, startY: ('touches' in event ? event.touches[0] : event).clientY, startLeft: propsRef.current.left, startTop: propsRef.current.top, deltaX: 0, deltaY: 0 }); if (propsRef.current.onDragStart) { var _propsRef$current = propsRef.current, _left = _propsRef$current.left, _top = _propsRef$current.top, offset = _propsRef$current.offset, pixelToLatLng = _propsRef$current.pixelToLatLng; propsRef.current.onDragMove(pixelToLatLng([_left + (offset ? offset[0] : 0), _top + (offset ? offset[1] : 0)])); } } }; var handleDragMove = function handleDragMove(event) { if (!stateRef.current.isDragging) { return; } event.preventDefault(); var x = ('touches' in event ? event.touches[0] : event).clientX; var y = ('touches' in event ? event.touches[0] : event).clientY; var deltaX = x - stateRef.current.startX; var deltaY = y - stateRef.current.startY; setState({ deltaX: deltaX, deltaY: deltaY }); if (propsRef.current.onDragMove) { var _propsRef$current2 = propsRef.current, offset = _propsRef$current2.offset, pixelToLatLng = _propsRef$current2.pixelToLatLng; var _stateRef$current = stateRef.current, _startLeft = _stateRef$current.startLeft, _startTop = _stateRef$current.startTop; propsRef.current.onDragMove(pixelToLatLng([_startLeft + deltaX + (offset ? offset[0] : 0), _startTop + deltaY + (offset ? offset[1] : 0)])); } }; var handleDragEnd = function handleDragEnd(event) { var _propsRef$current$onD, _propsRef$current4; if (!stateRef.current.isDragging) { return; } event.preventDefault(); var _propsRef$current3 = propsRef.current, offset = _propsRef$current3.offset, pixelToLatLng = _propsRef$current3.pixelToLatLng; var _stateRef$current2 = stateRef.current, deltaX = _stateRef$current2.deltaX, deltaY = _stateRef$current2.deltaY, startLeft = _stateRef$current2.startLeft, startTop = _stateRef$current2.startTop; (_propsRef$current$onD = (_propsRef$current4 = propsRef.current).onDragEnd) === null || _propsRef$current$onD === void 0 ? void 0 : _propsRef$current$onD.call(_propsRef$current4, pixelToLatLng([startLeft + deltaX + (offset ? offset[0] : 0), startTop + deltaY + (offset ? offset[1] : 0)])); setState({ isDragging: false, startX: undefined, startY: undefined, startLeft: undefined, startTop: undefined, deltaX: 0, deltaY: 0 }); }; var wa = function wa(e, t, o) { return window.addEventListener(e, t, o); }; var wr = function wr(e, t) { return window.removeEventListener(e, t); }; if (mouseEvents) { wa('mousedown', handleDragStart); wa('mousemove', handleDragMove); wa('mouseup', handleDragEnd); } if (touchEvents) { wa('touchstart', handleDragStart, { passive: false }); wa('touchmove', handleDragMove, { passive: false }); wa('touchend', handleDragEnd, { passive: false }); } return function () { if (mouseEvents) { wr('mousedown', handleDragStart); wr('mousemove', handleDragMove); wr('mouseup', handleDragEnd); } if (touchEvents) { wr('touchstart', handleDragStart); wr('touchmove', handleDragMove); wr('touchend', handleDragEnd); } }; }, [mouseEvents, touchEvents]); var left = props.left, top = props.top, className = props.className, style = props.style; var deltaX = _state.deltaX, deltaY = _state.deltaY, startLeft = _state.startLeft, startTop = _state.startTop, isDragging = _state.isDragging; return /*#__PURE__*/React__default["default"].createElement("div", { style: _objectSpread2(_objectSpread2({ cursor: isDragging ? 'grabbing' : 'grab' }, style || {}), {}, { position: 'absolute', transform: "translate(" + (isDragging ? startLeft + deltaX : left) + "px, " + (isDragging ? startTop + deltaY : top) + "px)" }), ref: dragRef, className: "pigeon-drag-block" + (className ? " " + className : '') }, props.children); } var commonStyle = { position: 'absolute', top: 10, left: 10 }; var commonButtonStyle = { width: 28, height: 28, borderRadius: 2, boxShadow: '0 1px 4px -1px rgba(0,0,0,.3)', background: 'white', lineHeight: '26px', fontSize: '20px', fontWeight: 700, color: '#666', marginBottom: 1, cursor: 'pointer', border: 'none', display: 'block', outline: 'none' }; function ZoomControl(_ref) { var style = _ref.style, buttonStyle = _ref.buttonStyle, setCenterZoom = _ref.setCenterZoom, mapState = _ref.mapState, mapProps = _ref.mapProps; return /*#__PURE__*/React__default["default"].createElement("div", { className: "pigeon-zoom-buttons pigeon-drag-block", style: style ? _objectSpread2(_objectSpread2({}, commonStyle), style) : commonStyle }, /*#__PURE__*/React__default["default"].createElement("button", { className: "pigeon-zoom-in", type: "button", style: buttonStyle ? _objectSpread2(_objectSpread2({}, commonButtonStyle), buttonStyle) : commonButtonStyle, onClick: function onClick() { return setCenterZoom(mapState.center, Math.min(mapState.zoom + 1, mapProps.maxZoom)); } }, "+"), /*#__PURE__*/React__default["default"].createElement("button", { className: "pigeon-zoom-out", type: "button", style: buttonStyle ? _objectSpread2(_objectSpread2({}, commonButtonStyle), buttonStyle) : commonButtonStyle, onClick: function onClick() { return setCenterZoom(mapState.center, Math.max(mapState.zoom - 1, mapProps.minZoom)); } }, "\u2013")); } exports.Draggable = Draggable; exports.GeoJson = GeoJson; exports.GeoJsonFeature = GeoJsonFeature; exports.GeoJsonLoader = GeoJsonLoader; exports.Map = Map; exports.Marker = Marker; exports.Overlay = Overlay; exports.ZoomControl = ZoomControl;