{"version":3,"file":"ZoomPlugin.mjs","sources":["../../../../../src/graveyard/uPlot/plugins/ZoomPlugin.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\n\nimport { UPlotConfigBuilder } from '../../../components/uPlot/config/UPlotConfigBuilder';\n\ninterface ZoomPluginProps {\n  onZoom: (range: { from: number; to: number }) => void;\n  withZoomY?: boolean;\n  config: UPlotConfigBuilder;\n}\n\n// min px width that triggers zoom\nconst MIN_ZOOM_DIST = 5;\n\nconst maybeZoomAction = (e?: MouseEvent | null) => e != null && !e.ctrlKey && !e.metaKey;\n\n/**\n * @alpha\n */\nexport const ZoomPlugin = ({ onZoom, config, withZoomY = false }: ZoomPluginProps) => {\n  useLayoutEffect(() => {\n    let yZoomed = false;\n    let yDrag = false;\n\n    if (withZoomY) {\n      config.addHook('init', (u) => {\n        u.over!.addEventListener(\n          'mousedown',\n          (e) => {\n            if (!maybeZoomAction(e)) {\n              return;\n            }\n\n            if (e.button === 0 && e.shiftKey) {\n              yDrag = true;\n\n              u.cursor!.drag!.x = false;\n              u.cursor!.drag!.y = true;\n\n              let onUp = (e: MouseEvent) => {\n                u.cursor!.drag!.x = true;\n                u.cursor!.drag!.y = false;\n                document.removeEventListener('mouseup', onUp, true);\n              };\n\n              document.addEventListener('mouseup', onUp, true);\n            }\n          },\n          true\n        );\n      });\n    }\n\n    config.addHook('setSelect', (u) => {\n      const isXAxisHorizontal = u.scales.x.ori === 0;\n      if (maybeZoomAction(u.cursor!.event)) {\n        if (withZoomY && yDrag) {\n          if (u.select.height >= MIN_ZOOM_DIST) {\n            for (let key in u.scales!) {\n              if (key !== 'x') {\n                const maxY = isXAxisHorizontal\n                  ? u.posToVal(u.select.top, key)\n                  : u.posToVal(u.select.left + u.select.width, key);\n                const minY = isXAxisHorizontal\n                  ? u.posToVal(u.select.top + u.select.height, key)\n                  : u.posToVal(u.select.left, key);\n                u.setScale(key, { min: minY, max: maxY });\n              }\n            }\n\n            yZoomed = true;\n          }\n\n          yDrag = false;\n        } else {\n          if (u.select.width >= MIN_ZOOM_DIST) {\n            const minX = isXAxisHorizontal\n              ? u.posToVal(u.select.left, 'x')\n              : u.posToVal(u.select.top + u.select.height, 'x');\n            const maxX = isXAxisHorizontal\n              ? u.posToVal(u.select.left + u.select.width, 'x')\n              : u.posToVal(u.select.top, 'x');\n\n            onZoom({ from: minX, to: maxX });\n\n            yZoomed = false;\n          }\n        }\n      }\n\n      // manually hide selected region (since cursor.drag.setScale = false)\n      u.setSelect({ left: 0, width: 0, top: 0, height: 0 }, false);\n    });\n\n    config.setCursor({\n      bind: {\n        dblclick: (u) => () => {\n          if (!maybeZoomAction(u.cursor!.event)) {\n            return null;\n          }\n\n          if (withZoomY && yZoomed) {\n            for (let key in u.scales!) {\n              if (key !== 'x') {\n                // @ts-ignore (this is not typed correctly in uPlot, assigning nulls means auto-scale / reset)\n                u.setScale(key, { min: null, max: null });\n              }\n            }\n\n            yZoomed = false;\n          } else {\n            let xScale = u.scales.x;\n\n            const frTs = xScale.min!;\n            const toTs = xScale.max!;\n            const pad = (toTs - frTs) / 2;\n\n            onZoom({ from: frTs - pad, to: toTs + pad });\n          }\n\n          return null;\n        },\n      },\n    });\n  }, [config, onZoom, withZoomY]);\n\n  return null;\n};\n"],"names":["e"],"mappings":"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"}