{"version":3,"file":"ZoomPlugin.mjs","sources":["../../../../../src/graveyard/uPlot/plugins/ZoomPlugin.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\n\nimport { UPlotConfigBuilder } from '../../../components';\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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"}