useScrollDrag.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = useScrollDrag;
  8. exports.getPageXY = getPageXY;
  9. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  10. var React = _interopRequireWildcard(require("react"));
  11. function smoothScrollOffset(offset) {
  12. return Math.floor(Math.pow(offset, 0.5));
  13. }
  14. function getPageXY(e, horizontal) {
  15. var obj = 'touches' in e ? e.touches[0] : e;
  16. return obj[horizontal ? 'pageX' : 'pageY'] - window[horizontal ? 'scrollX' : 'scrollY'];
  17. }
  18. function useScrollDrag(inVirtual, componentRef, onScrollOffset) {
  19. React.useEffect(function () {
  20. var ele = componentRef.current;
  21. if (inVirtual && ele) {
  22. var mouseDownLock = false;
  23. var rafId;
  24. var _offset;
  25. var stopScroll = function stopScroll() {
  26. _raf.default.cancel(rafId);
  27. };
  28. var continueScroll = function continueScroll() {
  29. stopScroll();
  30. rafId = (0, _raf.default)(function () {
  31. onScrollOffset(_offset);
  32. continueScroll();
  33. });
  34. };
  35. var clearDragState = function clearDragState() {
  36. mouseDownLock = false;
  37. stopScroll();
  38. };
  39. var onMouseDown = function onMouseDown(e) {
  40. // Skip if element set draggable
  41. if (e.target.draggable || e.button !== 0) {
  42. return;
  43. }
  44. // Skip if nest List has handled this event
  45. var event = e;
  46. if (!event._virtualHandled) {
  47. event._virtualHandled = true;
  48. mouseDownLock = true;
  49. }
  50. };
  51. var onMouseMove = function onMouseMove(e) {
  52. if (mouseDownLock) {
  53. var mouseY = getPageXY(e, false);
  54. var _ele$getBoundingClien = ele.getBoundingClientRect(),
  55. top = _ele$getBoundingClien.top,
  56. bottom = _ele$getBoundingClien.bottom;
  57. if (mouseY <= top) {
  58. var diff = top - mouseY;
  59. _offset = -smoothScrollOffset(diff);
  60. continueScroll();
  61. } else if (mouseY >= bottom) {
  62. var _diff = mouseY - bottom;
  63. _offset = smoothScrollOffset(_diff);
  64. continueScroll();
  65. } else {
  66. stopScroll();
  67. }
  68. }
  69. };
  70. ele.addEventListener('mousedown', onMouseDown);
  71. ele.ownerDocument.addEventListener('mouseup', clearDragState);
  72. ele.ownerDocument.addEventListener('mousemove', onMouseMove);
  73. ele.ownerDocument.addEventListener('dragend', clearDragState);
  74. return function () {
  75. ele.removeEventListener('mousedown', onMouseDown);
  76. ele.ownerDocument.removeEventListener('mouseup', clearDragState);
  77. ele.ownerDocument.removeEventListener('mousemove', onMouseMove);
  78. ele.ownerDocument.removeEventListener('dragend', clearDragState);
  79. stopScroll();
  80. };
  81. }
  82. }, [inVirtual]);
  83. }