{"version":3,"sources":["../src/index.jsx","../src/util.js","../src/ScrollingMonitor.js"],"sourcesContent":["import React, { useEffect, useRef, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { DndContext } from 'react-dnd';\nimport hoist from 'hoist-non-react-statics';\nimport { noop } from './util';\nimport ScrollingMonitor from './ScrollingMonitor';\n\nconst DEFAULT_BUFFER = 150;\n\nconst getDisplayName = PassedComponent =>\n  PassedComponent.displayName ||\n  PassedComponent.name ||\n  (typeof PassedComponent === 'string' && PassedComponent.length > 0\n    ? PassedComponent\n    : 'Unknown');\n\nexport function createHorizontalStrength(_buffer) {\n  return function defaultHorizontalStrength({ x, w, y, h }, point) {\n    const buffer = Math.min(w / 2, _buffer);\n    const inRange = point.x >= x && point.x <= x + w;\n    const inBox = inRange && point.y >= y && point.y <= y + h;\n\n    if (inBox) {\n      if (point.x < x + buffer) {\n        return (point.x - x - buffer) / buffer;\n      } else if (point.x > x + w - buffer) {\n        return -(x + w - point.x - buffer) / buffer;\n      }\n    }\n\n    return 0;\n  };\n}\n\nexport function createVerticalStrength(_buffer) {\n  return function defaultVerticalStrength({ y, h, x, w }, point) {\n    const buffer = Math.min(h / 2, _buffer);\n    const inRange = point.y >= y && point.y <= y + h;\n    const inBox = inRange && point.x >= x && point.x <= x + w;\n\n    if (inBox) {\n      if (point.y < y + buffer) {\n        return (point.y - y - buffer) / buffer;\n      } else if (point.y > y + h - buffer) {\n        return -(y + h - point.y - buffer) / buffer;\n      }\n    }\n\n    return 0;\n  };\n}\n\nexport const defaultHorizontalStrength = createHorizontalStrength(DEFAULT_BUFFER);\n\nexport const defaultVerticalStrength = createVerticalStrength(DEFAULT_BUFFER);\n\nconst defaultOptions = {\n  onScrollChange: noop,\n  verticalStrength: defaultVerticalStrength,\n  horizontalStrength: defaultHorizontalStrength,\n  strengthMultiplier: 30\n};\n\nexport function useDndScrolling(componentRef, scrollingOptions) {\n  const { dragDropManager } = useContext(DndContext);\n  if (!dragDropManager) {\n    throw new Error(\n      'Unable to get dragDropManager from context. Wrap this in <DndProvider>.'\n    );\n  }\n\n  useEffect(() => {\n    if (!componentRef.current) {\n      return () => {};\n    }\n    const options = { ...defaultOptions, ...scrollingOptions };\n    const monitor = new ScrollingMonitor(dragDropManager, componentRef.current, options);\n    monitor.start();\n    return () => {\n      monitor.stop();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [componentRef.current, dragDropManager, scrollingOptions]);\n}\n\nexport default function withScrolling(WrappedComponent) {\n  function ScrollingComponent({\n    onScrollChange = defaultOptions.onScrollChange,\n    verticalStrength = defaultOptions.verticalStrength,\n    horizontalStrength = defaultOptions.horizontalStrength,\n    strengthMultiplier = defaultOptions.strengthMultiplier,\n\n    ...restProps\n  }) {\n    const ref = useRef(null);\n    useDndScrolling(ref, {\n      strengthMultiplier,\n      verticalStrength,\n      horizontalStrength,\n      onScrollChange\n    });\n\n    return <WrappedComponent {...restProps} ref={ref} />;\n  }\n\n  ScrollingComponent.displayName = `Scrolling(${getDisplayName(WrappedComponent)})`;\n  ScrollingComponent.propTypes = {\n    onScrollChange: PropTypes.func,\n    verticalStrength: PropTypes.func,\n    horizontalStrength: PropTypes.func,\n    strengthMultiplier: PropTypes.number\n  };\n\n  return hoist(ScrollingComponent, WrappedComponent);\n}\n","export function noop() {}\n\nexport function intBetween(min, max, val) {\n  return Math.floor(Math.min(max, Math.max(min, val)));\n}\n\nexport function getCoords(evt) {\n  if (evt.type === 'touchmove') {\n    return { x: evt.changedTouches[0].clientX, y: evt.changedTouches[0].clientY };\n  }\n\n  return { x: evt.clientX, y: evt.clientY };\n}\n","import throttle from 'lodash.throttle';\nimport raf from 'raf';\nimport { intBetween, getCoords } from './util';\n\nexport default class ScrollingMonitor {\n  constructor(dragDropManager, container, options) {\n    this.dragDropManager = dragDropManager;\n    this.container = container;\n    this.eventBody = container.ownerDocument.body;\n    this.options = options;\n\n    this.scaleX = 0;\n    this.scaleY = 0;\n    this.frame = null;\n\n    this.attached = false;\n    this.dragging = false;\n  }\n\n  start() {\n    this.container.addEventListener('dragover', this.handleEvent);\n    // touchmove events don't seem to work across siblings, so we unfortunately\n    // have to attach the listeners to the body\n    this.eventBody.addEventListener('touchmove', this.handleEvent);\n\n    this.clearMonitorSubscription = this.dragDropManager\n      .getMonitor()\n      .subscribeToStateChange(() => this.handleMonitorChange());\n  }\n\n  stop() {\n    this.container.removeEventListener('dragover', this.handleEvent);\n    this.eventBody.removeEventListener('touchmove', this.handleEvent);\n    this.clearMonitorSubscription();\n    this.stopScrolling();\n  }\n\n  handleEvent = evt => {\n    if (this.dragging && !this.attached) {\n      this.attach();\n      this.updateScrolling(evt);\n    }\n  };\n\n  handleMonitorChange() {\n    const isDragging = this.dragDropManager.getMonitor().isDragging();\n\n    if (!this.dragging && isDragging) {\n      this.dragging = true;\n    } else if (this.dragging && !isDragging) {\n      this.dragging = false;\n      this.stopScrolling();\n    }\n  }\n\n  attach() {\n    this.attached = true;\n    this.eventBody.addEventListener('dragover', this.updateScrolling);\n    this.eventBody.addEventListener('touchmove', this.updateScrolling);\n  }\n\n  detach() {\n    this.attached = false;\n    this.eventBody.removeEventListener('dragover', this.updateScrolling);\n    this.eventBody.removeEventListener('touchmove', this.updateScrolling);\n  }\n\n  // Update scaleX and scaleY every 100ms or so\n  // and start scrolling if necessary\n  updateScrolling = throttle(\n    evt => {\n      const {\n        left: x,\n        top: y,\n        width: w,\n        height: h\n      } = this.container.getBoundingClientRect();\n      const box = { x, y, w, h };\n      const coords = getCoords(evt);\n\n      // calculate strength\n      this.scaleX = this.options.horizontalStrength(box, coords);\n      this.scaleY = this.options.verticalStrength(box, coords);\n\n      // start scrolling if we need to\n      if (!this.frame && (this.scaleX || this.scaleY)) {\n        this.startScrolling();\n      }\n    },\n    100,\n    { trailing: false }\n  );\n\n  startScrolling() {\n    let i = 0;\n    const tick = () => {\n      const { scaleX, scaleY, container } = this;\n      const { strengthMultiplier, onScrollChange } = this.options;\n\n      // stop scrolling if there's nothing to do\n      if (strengthMultiplier === 0 || scaleX + scaleY === 0) {\n        this.stopScrolling();\n        return;\n      }\n\n      // there's a bug in safari where it seems like we can't get\n      // mousemove events from a container that also emits a scroll\n      // event that same frame. So we double the strengthMultiplier and only adjust\n      // the scroll position at 30fps\n      if (i++ % 2) {\n        const {\n          scrollLeft,\n          scrollTop,\n          scrollWidth,\n          scrollHeight,\n          clientWidth,\n          clientHeight\n        } = container;\n\n        const newLeft = scaleX\n          ? (container.scrollLeft = intBetween(\n              0,\n              scrollWidth - clientWidth,\n              scrollLeft + scaleX * strengthMultiplier\n            ))\n          : scrollLeft;\n\n        const newTop = scaleY\n          ? (container.scrollTop = intBetween(\n              0,\n              scrollHeight - clientHeight,\n              scrollTop + scaleY * strengthMultiplier\n            ))\n          : scrollTop;\n\n        onScrollChange(newLeft, newTop);\n      }\n      this.frame = raf(tick);\n    };\n\n    tick();\n  }\n\n  stopScrolling() {\n    this.detach();\n    this.scaleX = 0;\n    this.scaleY = 0;\n\n    if (this.frame) {\n      raf.cancel(this.frame);\n      this.frame = null;\n    }\n  }\n}\n"],"mappings":"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","names":["throttle","raf","defaultHorizontalStrength","defaultVerticalStrength","React","PropTypes","hoist"]}