{"version":3,"file":"EventBusPlugin.mjs","sources":["../../../../../src/components/uPlot/plugins/EventBusPlugin.tsx"],"sourcesContent":["import { throttle } from 'lodash';\nimport { useLayoutEffect, useRef } from 'react';\nimport { Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\n\nimport {\n  DataFrame,\n  DataHoverClearEvent,\n  DataHoverEvent,\n  DataHoverPayload,\n  EventBus,\n  LegacyGraphHoverEvent,\n} from '@grafana/data';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\ninterface EventBusPluginProps {\n  config: UPlotConfigBuilder;\n  eventBus: EventBus;\n  frame?: DataFrame;\n}\n\n/**\n * @alpha\n */\nexport const EventBusPlugin = ({ config, eventBus, frame }: EventBusPluginProps) => {\n  const frameRef = useRef<DataFrame | undefined>(frame);\n  frameRef.current = frame;\n\n  useLayoutEffect(() => {\n    let u: uPlot | null = null;\n\n    const payload: DataHoverPayload = {\n      point: {\n        time: null,\n      },\n      data: frameRef.current,\n    };\n\n    config.addHook('init', (_u) => {\n      u = _u;\n    });\n\n    let closestSeriesIdx: number | null = null;\n\n    config.addHook('setSeries', (u, seriesIdx) => {\n      closestSeriesIdx = seriesIdx;\n    });\n\n    config.addHook('setLegend', () => {\n      let viaSync = u!.cursor.event == null;\n\n      if (!viaSync) {\n        let dataIdx = u!.cursor.idxs!.find((v) => v != null);\n\n        if (dataIdx == null) {\n          throttledClear();\n        } else {\n          let rowIdx = dataIdx;\n          let colIdx = closestSeriesIdx;\n\n          let xData = u!.data[0] ?? u!.data[1][0];\n\n          payload.point.time = xData[rowIdx];\n          payload.rowIndex = rowIdx ?? undefined;\n          payload.columnIndex = colIdx ?? undefined;\n          payload.data = frameRef.current;\n\n          // used by old graph panel to position tooltip\n          let top = u!.cursor.top!;\n          payload.point.panelRelY = top === 0 ? 0.001 : top > 0 ? top / u!.rect.height : 1;\n\n          throttledHover();\n        }\n      }\n    });\n\n    function handleCursorUpdate(evt: DataHoverEvent | LegacyGraphHoverEvent) {\n      const time = evt.payload?.point?.time;\n\n      if (time) {\n        // Try finding left position on time axis\n        const left = u!.valToPos(time, 'x');\n\n        // let top;\n\n        // if (left) {\n        //   top = findMidPointYPosition(u!, u!.posToIdx(left));\n        // }\n\n        // if (!top || !left) {\n        //   return;\n        // }\n\n        u!.setCursor({\n          left,\n          top: u!.rect.height / 2,\n        });\n      }\n    }\n\n    const subscription = new Subscription();\n\n    const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);\n    const clearEvent = new DataHoverClearEvent().setTags(['uplot']);\n\n    let throttledHover = throttle(() => {\n      eventBus.publish(hoverEvent);\n    }, 100);\n\n    let throttledClear = throttle(() => {\n      eventBus.publish(clearEvent);\n    }, 100);\n\n    subscription.add(\n      eventBus.getStream(DataHoverEvent).subscribe({\n        next: (evt) => {\n          // ignore uplot-emitted events, since we already use uPlot's sync\n          if (eventBus === evt.origin || evt.tags?.has('uplot')) {\n            return;\n          }\n\n          handleCursorUpdate(evt);\n        },\n      })\n    );\n\n    // Legacy events (from flot graph)\n    subscription.add(\n      eventBus.getStream(LegacyGraphHoverEvent).subscribe({\n        next: (evt) => handleCursorUpdate(evt),\n      })\n    );\n\n    subscription.add(\n      eventBus\n        .getStream(DataHoverClearEvent)\n        .pipe(throttleTime(50)) // dont throttle here, throttle on emission\n        .subscribe({\n          next: (evt) => {\n            // ignore uplot-emitted events, since we already use uPlot's sync\n            if (eventBus === evt.origin || evt.tags?.has('uplot')) {\n              return;\n            }\n\n            // @ts-ignore\n            if (!u!.cursor._lock) {\n              u!.setCursor({\n                left: -10,\n                top: -10,\n              });\n            }\n          },\n        })\n    );\n\n    return () => {\n      subscription.unsubscribe();\n    };\n  }, [config]);\n\n  return null;\n};\n"],"names":["u"],"mappings":"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"}