@owaiswiz/use-in-view
Version:
Check if your component is in viewport using this simple hook!
42 lines (34 loc) • 864 B
JavaScript
;
import {useEffect, useState} from 'react';
import throttle from 'lodash.throttle';
const useInView = (offset = 0) => {
const [ref, setRef] = useState(null);
const [inView, setInView] = useState(false);
useEffect(() => {
const elementYPos = () => {
return (
ref.getBoundingClientRect().top +
window.pageYOffset -
window.innerHeight +
offset
);
};
if (!ref) {
return;
}
const handleScroll = throttle(() => {
if (!ref) {
return;
}
if (window.pageYOffset >= elementYPos()) {
window.removeEventListener('scroll', handleScroll);
setInView(true);
}
}, 200);
window.addEventListener('scroll', handleScroll, {passive: true});
handleScroll();
return () => window.removeEventListener('scroll', handleScroll);
}, [ref, offset]);
return [setRef, inView];
};
export default useInView;