Use intersection observer for timeline segments

This commit is contained in:
Josh Hawkins 2024-06-19 17:10:46 -05:00
parent e9cdef9f25
commit 753d05189a

View File

@ -8,6 +8,7 @@ import React, {
useEffect, useEffect,
useMemo, useMemo,
useRef, useRef,
useState,
} from "react"; } from "react";
import { import {
HoverCard, HoverCard,
@ -195,14 +196,41 @@ export function EventSegment({
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [startTimestamp]); }, [startTimestamp]);
const [segmentVisible, setSegmentVisible] = useState(false);
const segmentObserverRef = useRef<IntersectionObserver | null>(null);
const segmentRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const segmentObserver = new IntersectionObserver(
([entry]) => {
setSegmentVisible(entry.isIntersecting);
},
{ threshold: 0 },
);
if (segmentRef.current) {
segmentObserver.observe(segmentRef.current);
}
segmentObserverRef.current = segmentObserver;
return () => {
if (segmentObserverRef.current) {
segmentObserverRef.current.disconnect();
}
};
}, []);
return ( return (
<div <div
key={segmentKey} key={segmentKey}
ref={segmentRef}
data-segment-id={segmentKey} data-segment-id={segmentKey}
className={`segment ${segmentClasses}`} className={`segment ${segmentClasses}`}
onClick={segmentClick} onClick={segmentClick}
onTouchEnd={(event) => handleTouchStart(event, segmentClick)} onTouchEnd={(event) => handleTouchStart(event, segmentClick)}
> >
{segmentVisible && (
<>
{showMinimap && ( {showMinimap && (
<MinimapBounds <MinimapBounds
isFirstSegmentInMinimap={isFirstSegmentInMinimap} isFirstSegmentInMinimap={isFirstSegmentInMinimap}
@ -260,6 +288,8 @@ export function EventSegment({
)} )}
</React.Fragment> </React.Fragment>
))} ))}
</>
)}
</div> </div>
); );
} }