diff --git a/src/components/lazy-shazam.jsx b/src/components/lazy-shazam.jsx new file mode 100644 index 00000000..dfd2db7b --- /dev/null +++ b/src/components/lazy-shazam.jsx @@ -0,0 +1,46 @@ +/* + Rendered but hidden. Only show when visible +*/ +import { useLayoutEffect, useRef, useState } from 'preact/hooks'; +import { useInView } from 'react-intersection-observer'; + +export default function LazyShazam({ children }) { + const containerRef = useRef(); + const [visible, setVisible] = useState(false); + const [visibleStart, setVisibleStart] = useState(false); + + const { ref } = useInView({ + root: null, + trackVisibility: true, + delay: 1000, + onChange: (inView) => { + if (inView) { + setVisible(true); + } + }, + triggerOnce: true, + skip: visibleStart || visible, + }); + + useLayoutEffect(() => { + if (!containerRef.current) return; + const rect = containerRef.current.getBoundingClientRect(); + if (rect.bottom > 0) { + setVisibleStart(true); + } + }, []); + + if (visibleStart) return children; + + return ( +