mirror of
https://github.com/glitch-soc/mastodon.git
synced 2026-03-29 11:11:11 +02:00
46 lines
1002 B
TypeScript
46 lines
1002 B
TypeScript
import type { RefCallback } from 'react';
|
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
|
|
export function useVisibility({
|
|
observerOptions,
|
|
}: {
|
|
observerOptions?: IntersectionObserverInit;
|
|
} = {}) {
|
|
const [isIntersecting, setIsIntersecting] = useState(false);
|
|
const handleIntersect: IntersectionObserverCallback = useCallback(
|
|
(entries) => {
|
|
const entry = entries.at(0);
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
|
|
setIsIntersecting(entry.isIntersecting);
|
|
},
|
|
[],
|
|
);
|
|
const observer = useMemo(
|
|
() => new IntersectionObserver(handleIntersect, observerOptions),
|
|
[handleIntersect, observerOptions],
|
|
);
|
|
|
|
const handleObserverRef: RefCallback<HTMLElement> = useCallback(
|
|
(node) => {
|
|
if (node) {
|
|
observer.observe(node);
|
|
}
|
|
},
|
|
[observer],
|
|
);
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
observer.disconnect();
|
|
};
|
|
}, [observer]);
|
|
|
|
return {
|
|
isIntersecting,
|
|
observedRef: handleObserverRef,
|
|
};
|
|
}
|