Skip to content

Commit

Permalink
fix(hooks): optimize useScrollPosition with useCallback and useRef (#…
Browse files Browse the repository at this point in the history
…3049)

* fix(hooks): optimize useScrollPosition with useCallback and useRef

* Update .changeset/lucky-cobras-jog.md

* Update packages/hooks/use-scroll-position/src/index.ts

* Update packages/hooks/use-scroll-position/src/index.ts

---------

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
  • Loading branch information
Gaic4o and jrgarciadev authored May 24, 2024
1 parent 39bc460 commit fa26ce0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
5 changes: 5 additions & 0 deletions .changeset/lucky-cobras-jog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@nextui-org/use-scroll-position": patch
---

WHAT: Refactored the useScrollPosition hook to improve performance and stability by using useCallback for the handler function and useRef for throttleTimeout.
25 changes: 15 additions & 10 deletions packages/hooks/use-scroll-position/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {useRef, useEffect} from "react";
import {useRef, useEffect, useCallback} from "react";

const isBrowser = typeof window !== "undefined";

export type ScrollValue = {x: any; y: any};
export type ScrollValue = {x: number; y: number};

function getScrollPosition(element: HTMLElement | undefined | null): ScrollValue {
if (!isBrowser) return {x: 0, y: 0};
Expand Down Expand Up @@ -41,26 +41,26 @@ export const useScrollPosition = (props: UseScrollPositionOptions): ScrollValue
isEnabled ? getScrollPosition(elementRef?.current) : {x: 0, y: 0},
);

let throttleTimeout: ReturnType<typeof setTimeout> | null = null;
const throttleTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);

const handler = () => {
const handler = useCallback(() => {
const currPos = getScrollPosition(elementRef?.current);

if (typeof callback === "function") {
callback({prevPos: position.current, currPos});
}

position.current = currPos;
throttleTimeout = null;
};
throttleTimeout.current = null;
}, [callback, elementRef]);

useEffect(() => {
if (!isEnabled) return;

const handleScroll = () => {
if (delay) {
if (throttleTimeout === null) {
throttleTimeout = setTimeout(handler, delay);
if (throttleTimeout.current === null) {
throttleTimeout.current = setTimeout(handler, delay);
}
} else {
handler();
Expand All @@ -71,8 +71,13 @@ export const useScrollPosition = (props: UseScrollPositionOptions): ScrollValue

target.addEventListener("scroll", handleScroll);

return () => target.removeEventListener("scroll", handleScroll);
}, [elementRef?.current, delay, isEnabled]);
return () => {
target.removeEventListener("scroll", handleScroll);
if (throttleTimeout.current) {
clearTimeout(throttleTimeout.current);
}
};
}, [elementRef?.current, delay, handler, isEnabled]);

return position.current;
};

0 comments on commit fa26ce0

Please sign in to comment.