feat: recover scrolled position after Library re-opening (#6624)
Co-authored-by: dwelle <luzar.david@gmail.com>pull/6634/head
parent
a91e401554
commit
1e3c94a37a
@ -0,0 +1,32 @@
|
|||||||
|
import { useEffect } from "react";
|
||||||
|
import { atom, useAtom } from "jotai";
|
||||||
|
import throttle from "lodash.throttle";
|
||||||
|
|
||||||
|
const scrollPositionAtom = atom<number>(0);
|
||||||
|
|
||||||
|
export const useScrollPosition = <T extends HTMLElement>(
|
||||||
|
elementRef: React.RefObject<T>,
|
||||||
|
) => {
|
||||||
|
const [scrollPosition, setScrollPosition] = useAtom(scrollPositionAtom);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const { current: element } = elementRef;
|
||||||
|
if (!element) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleScroll = throttle(() => {
|
||||||
|
const { scrollTop } = element;
|
||||||
|
setScrollPosition(scrollTop);
|
||||||
|
}, 200);
|
||||||
|
|
||||||
|
element.addEventListener("scroll", handleScroll);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
handleScroll.cancel();
|
||||||
|
element.removeEventListener("scroll", handleScroll);
|
||||||
|
};
|
||||||
|
}, [elementRef, setScrollPosition]);
|
||||||
|
|
||||||
|
return scrollPosition;
|
||||||
|
};
|
Loading…
Reference in New Issue