import {useEffect, useRef, useState} from 'react' import {useEvent} from 'web/hooks/use-event' export function VisibilityObserver(props: { className?: string onVisibilityUpdated: (visible: boolean) => void }) { const {className} = props const [elem, setElem] = useState(null) const onVisibilityUpdated = useEvent(props.onVisibilityUpdated) useEffect(() => { if (elem) { const observer = new IntersectionObserver(([entry]) => { onVisibilityUpdated(entry.isIntersecting) }, {}) observer.observe(elem) return () => observer.unobserve(elem) } }, [elem, onVisibilityUpdated]) return
} export function LoadMoreUntilNotVisible(props: { // Returns true if there are more results. loadMore: () => Promise }) { const {loadMore} = props const isVisibleRef = useRef(false) const loadMoreIfVisible = useEvent(async () => { // debug('loadMoreIfVisible called') if (isVisibleRef.current && loadMore) { // debug('loadMore calling') await loadMore() // const hasMoreResults = await loadMore() // if (hasMoreResults) { // setTimeout(() => { // if (isVisibleRef.current) { // loadMoreIfVisible() // } // }, 500) // } } }) const onVisibilityUpdated = useEvent((visible: boolean) => { isVisibleRef.current = visible loadMoreIfVisible() }) return (
) }