@trap_stevo/legendarybuilderproreact-ui
Version:
The legendary UI & utility API that makes your application a legendary application. ~ Created by Steven Compton
57 lines (54 loc) • 1.88 kB
JavaScript
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
/*
Created by Hassan Steven Compton.
March 7, 2024.
*/
import { useEffect, useState, useRef } from 'react';
var useSmoothScroll = function useSmoothScroll(targetPosition) {
var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
var smoothness = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 20;
var _useState = useState(0),
_useState2 = _slicedToArray(_useState, 2),
progress = _useState2[0],
setProgress = _useState2[1];
var scrollInProgress = useRef(false);
var setCurrentProgress = function setCurrentProgress(inputProgress) {
setProgress(inputProgress);
};
var smoothScrollTo = function smoothScrollTo() {
if (scrollInProgress.current) {
return;
}
scrollInProgress.current = true;
var start = window.pageYOffset;
var steps = duration / smoothness;
var step = 0;
var scroll = function scroll() {
var currentTime = step * smoothness;
var currentProgress = Math.min(currentTime / duration, 1);
var ease = easeOutQuad(currentProgress);
var newPosition = start + (targetPosition - start) * ease;
window.scrollTo(0, newPosition);
setProgress(currentProgress);
step += 1;
if (currentProgress < 1 && newPosition !== targetPosition) {
requestAnimationFrame(scroll);
} else {
scrollInProgress.current = false;
}
};
setTimeout(function () {
scroll();
}, delay);
};
var easeOutQuad = function easeOutQuad(t) {
return t * (2 - t);
};
return {
smoothScrollTo: smoothScrollTo,
progress: progress,
setCurrentProgress: setCurrentProgress
};
};
export default useSmoothScroll;