1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- "use strict";
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = useScrollTo;
- var _rcUtil = require("rc-util");
- var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
- var _isVisible = _interopRequireDefault(require("rc-util/lib/Dom/isVisible"));
- var React = _interopRequireWildcard(require("react"));
- var SPEED_PTG = 1 / 3;
- function useScrollTo(ulRef, value) {
- // ========================= Scroll =========================
- var scrollingRef = React.useRef(false);
- var scrollRafRef = React.useRef(null);
- var scrollDistRef = React.useRef(null);
- var isScrolling = function isScrolling() {
- return scrollingRef.current;
- };
- var stopScroll = function stopScroll() {
- _raf.default.cancel(scrollRafRef.current);
- scrollingRef.current = false;
- };
- var scrollRafTimesRef = React.useRef();
- var startScroll = function startScroll() {
- var ul = ulRef.current;
- scrollDistRef.current = null;
- scrollRafTimesRef.current = 0;
- if (ul) {
- var targetLi = ul.querySelector("[data-value=\"".concat(value, "\"]"));
- var firstLi = ul.querySelector("li");
- var doScroll = function doScroll() {
- stopScroll();
- scrollingRef.current = true;
- scrollRafTimesRef.current += 1;
- var currentTop = ul.scrollTop;
- var firstLiTop = firstLi.offsetTop;
- var targetLiTop = targetLi.offsetTop;
- var targetTop = targetLiTop - firstLiTop;
- // Wait for element exist. 5 frames is enough
- if (targetLiTop === 0 && targetLi !== firstLi || !(0, _isVisible.default)(ul)) {
- if (scrollRafTimesRef.current <= 5) {
- scrollRafRef.current = (0, _raf.default)(doScroll);
- }
- return;
- }
- var nextTop = currentTop + (targetTop - currentTop) * SPEED_PTG;
- var dist = Math.abs(targetTop - nextTop);
- // Break if dist get larger, which means user is scrolling
- if (scrollDistRef.current !== null && scrollDistRef.current < dist) {
- stopScroll();
- return;
- }
- scrollDistRef.current = dist;
- // Stop when dist is less than 1
- if (dist <= 1) {
- ul.scrollTop = targetTop;
- stopScroll();
- return;
- }
- // IE not support `scrollTo`
- ul.scrollTop = nextTop;
- scrollRafRef.current = (0, _raf.default)(doScroll);
- };
- if (targetLi && firstLi) {
- doScroll();
- }
- }
- };
- // ======================== Trigger =========================
- var syncScroll = (0, _rcUtil.useEvent)(startScroll);
- return [syncScroll, stopScroll, isScrolling];
- }
|