mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Add useIntersectionObserver() hook
Signed-off-by: alexfront <alex.andreev.email@gmail.com>
This commit is contained in:
parent
05a3ed0e57
commit
dadd69ef03
68
src/renderer/hooks/useIntersectionObserver.ts
Normal file
68
src/renderer/hooks/useIntersectionObserver.ts
Normal file
@ -0,0 +1,68 @@
|
||||
/**
|
||||
* Copyright (c) OpenLens Authors. All rights reserved.
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
/**
|
||||
* Intersection Observer configuratiopn options.
|
||||
*/
|
||||
interface IntersectionObserverOptions {
|
||||
/**
|
||||
* If `true`, check for intersection only once. Will
|
||||
* disconnect the IntersectionObserver instance after
|
||||
* intersection.
|
||||
*/
|
||||
triggerOnce: boolean;
|
||||
|
||||
/**
|
||||
* Number from 0 to 1 representing the percentage
|
||||
* of the element that needs to be visible to be
|
||||
* considered as visible. Can also be an array of
|
||||
* thresholds.
|
||||
*/
|
||||
threshold: number | number[];
|
||||
|
||||
/**
|
||||
* Element that is used as the viewport for checking visibility
|
||||
* of the provided `ref` or `element`.
|
||||
*/
|
||||
root?: Element;
|
||||
|
||||
/**
|
||||
* Margin around the root. Can have values similar to
|
||||
* the CSS margin property.
|
||||
*/
|
||||
rootMargin?: string;
|
||||
}
|
||||
|
||||
function useIntersectionObserver(
|
||||
element: Element,
|
||||
{
|
||||
threshold = 0,
|
||||
rootMargin = "0%",
|
||||
root,
|
||||
}: IntersectionObserverOptions,
|
||||
): IntersectionObserverEntry | undefined {
|
||||
const [entry, setEntry] = useState<IntersectionObserverEntry>();
|
||||
|
||||
const updateEntry = ([entry]: IntersectionObserverEntry[]): void => {
|
||||
setEntry(entry);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!element) return;
|
||||
|
||||
const observer = new IntersectionObserver(updateEntry, { threshold, root, rootMargin });
|
||||
|
||||
observer.observe(element);
|
||||
|
||||
return () => observer.disconnect();
|
||||
|
||||
}, [element, threshold, root, rootMargin]);
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
export default useIntersectionObserver;
|
||||
Loading…
Reference in New Issue
Block a user