1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Observing section by IntersectionObserver

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
This commit is contained in:
Alex Andreev 2021-03-04 09:29:13 +03:00
parent 1e73769bc1
commit a2bb733e48

View File

@ -7,17 +7,22 @@ interface Props extends React.DOMAttributes<any> {
export function ScrollSpy(props: Props) { export function ScrollSpy(props: Props) {
const [tree, setTree] = useState<NavigationTree[]>([]); const [tree, setTree] = useState<NavigationTree[]>([]);
const [activeElementId, setActiveElementId] = useState("");
const updateNavigation = () => { const getContentParentElement = () => {
const firstSection = document.querySelector("section"); const firstSection = document.querySelector("section");
if (!firstSection) { if (!firstSection) {
throw new Error("No <section/> tag founded! Content should be placed inside <section></section> elements to activate navigation."); throw new Error("No <section/> tag founded! Content should be placed inside <section></section> elements to activate navigation.");
} }
return firstSection.parentElement;
};
const updateNavigation = () => {
setTree([ setTree([
...tree, ...tree,
...getNavigation(firstSection.parentElement) ...getNavigation(getContentParentElement())
]); ]);
}; };
@ -43,8 +48,28 @@ export function ScrollSpy(props: Props) {
return children; return children;
}; };
const handleIntersect = (entries: IntersectionObserverEntry[]) => {
if (entries[0].isIntersecting) {
setActiveElementId(entries[0].target.id);
}
};
const observeSections = () => {
const sections = getContentParentElement().querySelectorAll("section");
const options = {
rootMargin: "-50% 0px"
};
sections.forEach((section) => {
const observer = new IntersectionObserver(handleIntersect, options);
observer.observe(section);
});
};
useEffect(() => { useEffect(() => {
updateNavigation(); updateNavigation();
observeSections();
// element.current.addEventListener("scroll", updateActive); // element.current.addEventListener("scroll", updateActive);
// TODO: Attach on dom change event // TODO: Attach on dom change event
}, []); }, []);