diff --git a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx index bc40f0506ba..8702a784a9a 100644 --- a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx +++ b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx @@ -312,8 +312,10 @@ export const TooltipPlugin2 = ({ } // only pinnable tooltip is visible *and* is within proximity to series/point else if (_isHovering && closestSeriesIdx != null && !_isPinned) { - _isPinned = true; - scheduleRender(true); + setTimeout(() => { + _isPinned = true; + scheduleRender(true); + }, 0); } } }); @@ -604,14 +606,29 @@ export const TooltipPlugin2 = ({ size.width = width; size.height = height; - const event = plot!.cursor.event; + let event = plot!.cursor.event; // if not viaSync, re-dispatch real event if (event != null) { + // we expect to re-dispatch mousemove, but on mobile we'll get mouseup or click + const isMobile = event.type !== 'mousemove'; + + if (isMobile) { + event = new MouseEvent('mousemove', { + view: window, + bubbles: true, + cancelable: true, + clientX: event.clientX, + clientY: event.clientY, + screenX: event.screenX, + screenY: event.screenY, + }); + } + // this works around the fact that uPlot does not unset cursor.event (for perf reasons) // so if the last real mouse event was mouseleave and you manually trigger u.setCursor() // it would end up re-dispatching mouseleave - const isStaleEvent = performance.now() - event.timeStamp > 16; + const isStaleEvent = isMobile ? false : performance.now() - event.timeStamp > 16; !isStaleEvent && plot!.over.dispatchEvent(event); } else {