import { useEffect, useRef, useState } from 'react' export const useFetchMore = (callback: () => void, delay = 500): void => { const [first, setFirst] = useState(true) const throttleTimeout = useRef(undefined) useEffect(() => { if (typeof window === 'undefined') { return } const callbackInternal = (): void => { const { scrollTop, scrollHeight, clientHeight } = window.document.documentElement; if (scrollTop + clientHeight >= scrollHeight - (scrollHeight / 3)) { callback() } throttleTimeout.current = undefined } const handleScroll = () => { if (first) { setFirst(false) callbackInternal() return } if (typeof throttleTimeout.current === 'undefined') { throttleTimeout.current = setTimeout(callbackInternal, delay) } } window.addEventListener('scroll', handleScroll) return () => { window.removeEventListener('scroll', handleScroll) } }, [callback, delay, first, setFirst]) }