useFrameWheel.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useFrameWheel;
  7. var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
  8. var _react = require("react");
  9. var _isFirefox = _interopRequireDefault(require("../utils/isFirefox"));
  10. var _useOriginScroll = _interopRequireDefault(require("./useOriginScroll"));
  11. function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight, horizontalScroll,
  12. /***
  13. * Return `true` when you need to prevent default event
  14. */
  15. onWheelDelta) {
  16. var offsetRef = (0, _react.useRef)(0);
  17. var nextFrameRef = (0, _react.useRef)(null);
  18. // Firefox patch
  19. var wheelValueRef = (0, _react.useRef)(null);
  20. var isMouseScrollRef = (0, _react.useRef)(false);
  21. // Scroll status sync
  22. var originScroll = (0, _useOriginScroll.default)(isScrollAtTop, isScrollAtBottom, isScrollAtLeft, isScrollAtRight);
  23. function onWheelY(e, deltaY) {
  24. _raf.default.cancel(nextFrameRef.current);
  25. // Do nothing when scroll at the edge, Skip check when is in scroll
  26. if (originScroll(false, deltaY)) return;
  27. // Skip if nest List has handled this event
  28. var event = e;
  29. if (!event._virtualHandled) {
  30. event._virtualHandled = true;
  31. } else {
  32. return;
  33. }
  34. offsetRef.current += deltaY;
  35. wheelValueRef.current = deltaY;
  36. // Proxy of scroll events
  37. if (!_isFirefox.default) {
  38. event.preventDefault();
  39. }
  40. nextFrameRef.current = (0, _raf.default)(function () {
  41. // Patch a multiple for Firefox to fix wheel number too small
  42. // ref: https://github.com/ant-design/ant-design/issues/26372#issuecomment-679460266
  43. var patchMultiple = isMouseScrollRef.current ? 10 : 1;
  44. onWheelDelta(offsetRef.current * patchMultiple, false);
  45. offsetRef.current = 0;
  46. });
  47. }
  48. function onWheelX(event, deltaX) {
  49. onWheelDelta(deltaX, true);
  50. if (!_isFirefox.default) {
  51. event.preventDefault();
  52. }
  53. }
  54. // Check for which direction does wheel do. `sx` means `shift + wheel`
  55. var wheelDirectionRef = (0, _react.useRef)(null);
  56. var wheelDirectionCleanRef = (0, _react.useRef)(null);
  57. function onWheel(event) {
  58. if (!inVirtual) return;
  59. // Wait for 2 frame to clean direction
  60. _raf.default.cancel(wheelDirectionCleanRef.current);
  61. wheelDirectionCleanRef.current = (0, _raf.default)(function () {
  62. wheelDirectionRef.current = null;
  63. }, 2);
  64. var deltaX = event.deltaX,
  65. deltaY = event.deltaY,
  66. shiftKey = event.shiftKey;
  67. var mergedDeltaX = deltaX;
  68. var mergedDeltaY = deltaY;
  69. if (wheelDirectionRef.current === 'sx' || !wheelDirectionRef.current && (shiftKey || false) && deltaY && !deltaX) {
  70. mergedDeltaX = deltaY;
  71. mergedDeltaY = 0;
  72. wheelDirectionRef.current = 'sx';
  73. }
  74. var absX = Math.abs(mergedDeltaX);
  75. var absY = Math.abs(mergedDeltaY);
  76. if (wheelDirectionRef.current === null) {
  77. wheelDirectionRef.current = horizontalScroll && absX > absY ? 'x' : 'y';
  78. }
  79. if (wheelDirectionRef.current === 'y') {
  80. onWheelY(event, mergedDeltaY);
  81. } else {
  82. onWheelX(event, mergedDeltaX);
  83. }
  84. }
  85. // A patch for firefox
  86. function onFireFoxScroll(event) {
  87. if (!inVirtual) return;
  88. isMouseScrollRef.current = event.detail === wheelValueRef.current;
  89. }
  90. return [onWheel, onFireFoxScroll];
  91. }