Test this lazy shazam

This commit is contained in:
Lim Chee Aun 2024-03-26 16:35:02 +08:00
parent 438b520970
commit 67a05450cf
2 changed files with 63 additions and 14 deletions

View file

@ -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 (
<div
ref={containerRef}
class="shazam-container no-animation"
hidden={!visible}
>
<div ref={ref} class="shazam-container-inner">
{children}
</div>
</div>
);
}

View file

@ -26,6 +26,7 @@ import { useSnapshot } from 'valtio';
import CustomEmoji from '../components/custom-emoji'; import CustomEmoji from '../components/custom-emoji';
import EmojiText from '../components/emoji-text'; import EmojiText from '../components/emoji-text';
import LazyShazam from '../components/lazy-shazam';
import Loader from '../components/loader'; import Loader from '../components/loader';
import Menu2 from '../components/menu2'; import Menu2 from '../components/menu2';
import MenuConfirm from '../components/menu-confirm'; import MenuConfirm from '../components/menu-confirm';
@ -3128,20 +3129,22 @@ const QuoteStatuses = memo(({ id, instance, level = 0 }) => {
return uniqueQuotes.map((q) => { return uniqueQuotes.map((q) => {
return ( return (
<Link <LazyShazam>
key={q.instance + q.id} <Link
to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`} key={q.instance + q.id}
class="status-card-link" to={`${q.instance ? `/${q.instance}` : ''}/s/${q.id}`}
data-read-more="Read more →" class="status-card-link"
> data-read-more="Read more →"
<Status >
statusID={q.id} <Status
instance={q.instance} statusID={q.id}
size="s" instance={q.instance}
quoted={level + 1} size="s"
enableCommentHint quoted={level + 1}
/> enableCommentHint
</Link> />
</Link>
</LazyShazam>
); );
}); });
}); });