Fix scrolling behavior

This commit is contained in:
Nick Mowen 2023-12-15 09:37:49 -07:00
parent ac83da09ea
commit 2db3ea61ea
2 changed files with 38 additions and 29 deletions

View File

@ -27,9 +27,9 @@ function App() {
<BrowserRouter> <BrowserRouter>
<Wrapper> <Wrapper>
<Header onToggleNavbar={toggleNavbar} /> <Header onToggleNavbar={toggleNavbar} />
<div className="grid grid-cols-[auto,1fr] flex-grow-1 md:overflow-auto"> <div className="grid grid-cols-[auto,1fr] flex-grow-1 overflow-auto">
<Sidebar sheetOpen={sheetOpen} setSheetOpen={setSheetOpen} /> <Sidebar sheetOpen={sheetOpen} setSheetOpen={setSheetOpen} />
<div className="overflow-x-hidden px-4 py-2 w-screen md:w-full"> <div id="pageRoot" className="overflow-x-hidden px-4 py-2 md:w-full">
<Routes> <Routes>
<Route path="/" element={<Dashboard />} /> <Route path="/" element={<Dashboard />} />
<Route path="/live" element={<Live />} /> <Route path="/live" element={<Live />} />

View File

@ -48,43 +48,52 @@ export default function PreviewThumbnailPlayer({
playerRef.current.currentTime(startTs - relevantPreview.start); playerRef.current.currentTime(startTs - relevantPreview.start);
} }
}, },
[relevantPreview, startTs] [relevantPreview, startTs, playerRef]
); );
const observer = useRef<IntersectionObserver | null>(); const autoPlayObserver = useRef<IntersectionObserver | null>();
const preloadObserver = useRef<IntersectionObserver | null>();
const inViewRef = useCallback( const inViewRef = useCallback(
(node: HTMLElement | null) => { (node: HTMLElement | null) => {
if (observer.current) { if (!preloadObserver.current) {
return;
}
try { try {
observer.current = new IntersectionObserver( preloadObserver.current = new IntersectionObserver(
(entries) => { (entries) => {
if (entries[0].isIntersecting) { const [{ isIntersecting }] = entries;
if (entries[0].intersectionRatio == 1.0) { setVisible(isIntersecting);
if (shouldAutoPlay) {
onPlayback(true);
}
} else {
setVisible(true);
}
} else {
if (shouldAutoPlay) {
onPlayback(false);
}
setVisible(false);
}
}, },
{ threshold: [0.0, 1.0], rootMargin: "10% 0% 25% 0%" } {
threshold: 0,
root: document.getElementById("pageRoot"),
rootMargin: "10% 0px 25% 0px",
}
); );
if (node) observer.current.observe(node); if (node) preloadObserver.current.observe(node);
} catch (e) { } catch (e) {
// no op // no op
} }
}
if (shouldAutoPlay && !autoPlayObserver.current) {
try {
autoPlayObserver.current = new IntersectionObserver(
(entries) => {
const [{ isIntersecting }] = entries;
if (isIntersecting) {
onPlayback(true);
} else {
onPlayback(false);
}
}, },
[observer, onPlayback] { threshold: 1.0 }
);
if (node) autoPlayObserver.current.observe(node);
} catch (e) {
// no op
}
}
},
[preloadObserver, autoPlayObserver, onPlayback]
); );
let content; let content;
@ -137,7 +146,7 @@ export default function PreviewThumbnailPlayer({
return ( return (
<AspectRatio <AspectRatio
ref={inViewRef} ref={relevantPreview ? inViewRef : null}
ratio={16 / 9} ratio={16 / 9}
className="bg-black flex justify-center items-center" className="bg-black flex justify-center items-center"
onMouseEnter={() => onPlayback(true)} onMouseEnter={() => onPlayback(true)}