UNPKG

@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
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;