From 753d05189a1de3754e511177d189bb13da2ec130 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:10:46 -0500 Subject: [PATCH] Use intersection observer for timeline segments --- web/src/components/timeline/EventSegment.tsx | 134 ++++++++++++------- 1 file changed, 82 insertions(+), 52 deletions(-) diff --git a/web/src/components/timeline/EventSegment.tsx b/web/src/components/timeline/EventSegment.tsx index 23d5c5f44..67adda5b8 100644 --- a/web/src/components/timeline/EventSegment.tsx +++ b/web/src/components/timeline/EventSegment.tsx @@ -8,6 +8,7 @@ import React, { useEffect, useMemo, useRef, + useState, } from "react"; import { HoverCard, @@ -195,71 +196,100 @@ export function EventSegment({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [startTimestamp]); + const [segmentVisible, setSegmentVisible] = useState(false); + const segmentObserverRef = useRef(null); + const segmentRef = useRef(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 (
handleTouchStart(event, segmentClick)} > - {showMinimap && ( - - )} + {segmentVisible && ( + <> + {showMinimap && ( + + )} - + - + - {severity.map((severityValue: number, index: number) => ( - - {severityValue === displaySeverityType && ( - - -
-
-
-
-
+ {severity.map((severityValue: number, index: number) => ( + + {severityValue === displaySeverityType && ( + + +
+
+
+
+
+
+
-
-
- - - - - - - - )} - - ))} + + + + + + + + )} + + ))} + + )}
); }