useFrameWheel.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = useFrameWheel;
  7. var _raf = _interopRequireDefault(require("../../_util/raf"));
  8. var _isFirefox = _interopRequireDefault(require("../utils/isFirefox"));
  9. var _useOriginScroll = _interopRequireDefault(require("./useOriginScroll"));
  10. function useFrameWheel(inVirtual, isScrollAtTop, isScrollAtBottom, onWheelDelta) {
  11. let offsetRef = 0;
  12. let nextFrame = null;
  13. // Firefox patch
  14. let wheelValue = null;
  15. let isMouseScroll = false;
  16. // Scroll status sync
  17. const originScroll = (0, _useOriginScroll.default)(isScrollAtTop, isScrollAtBottom);
  18. function onWheel(event) {
  19. if (!inVirtual.value) return;
  20. _raf.default.cancel(nextFrame);
  21. const {
  22. deltaY
  23. } = event;
  24. offsetRef += deltaY;
  25. wheelValue = deltaY;
  26. // Do nothing when scroll at the edge, Skip check when is in scroll
  27. if (originScroll(deltaY)) return;
  28. // Proxy of scroll events
  29. if (!_isFirefox.default) {
  30. event.preventDefault();
  31. }
  32. nextFrame = (0, _raf.default)(() => {
  33. // Patch a multiple for Firefox to fix wheel number too small
  34. // ref: https://github.com/ant-design/ant-design/issues/26372#issuecomment-679460266
  35. const patchMultiple = isMouseScroll ? 10 : 1;
  36. onWheelDelta(offsetRef * patchMultiple);
  37. offsetRef = 0;
  38. });
  39. }
  40. // A patch for firefox
  41. function onFireFoxScroll(event) {
  42. if (!inVirtual.value) return;
  43. isMouseScroll = event.detail === wheelValue;
  44. }
  45. return [onWheel, onFireFoxScroll];
  46. }