mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
feat: recover scrolled position after Library re-opening (#6624)
Co-authored-by: dwelle <luzar.david@gmail.com>
This commit is contained in:
parent
a91e401554
commit
1e3c94a37a
6 changed files with 129 additions and 49 deletions
32
src/hooks/useScrollPosition.ts
Normal file
32
src/hooks/useScrollPosition.ts
Normal file
|
@ -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…
Add table
Add a link
Reference in a new issue