From f236ba62e056329334765b0c3681057f3c740e20 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:13:21 -0500 Subject: [PATCH] no need to duplicate observer --- .../timeline/EventReviewTimeline.tsx | 62 +++++-------------- web/src/views/events/EventView.tsx | 6 ++ 2 files changed, 21 insertions(+), 47 deletions(-) diff --git a/web/src/components/timeline/EventReviewTimeline.tsx b/web/src/components/timeline/EventReviewTimeline.tsx index 6c175daf8..6c6a8c8df 100644 --- a/web/src/components/timeline/EventReviewTimeline.tsx +++ b/web/src/components/timeline/EventReviewTimeline.tsx @@ -30,6 +30,7 @@ export type EventReviewTimelineProps = { setExportStartTime?: React.Dispatch>; setExportEndTime?: React.Dispatch>; events: ReviewSegment[]; + visibleTimestamps?: number[]; severityType: ReviewSeverity; timelineRef?: RefObject; contentRef: RefObject; @@ -53,6 +54,7 @@ export function EventReviewTimeline({ setExportStartTime, setExportEndTime, events, + visibleTimestamps, severityType, timelineRef, contentRef, @@ -61,7 +63,6 @@ export function EventReviewTimeline({ const [isDragging, setIsDragging] = useState(false); const [exportStartPosition, setExportStartPosition] = useState(0); const [exportEndPosition, setExportEndPosition] = useState(0); - const [visibleThumbnails, setVisibleThumbnails] = useState([]); const internalTimelineRef = useRef(null); const handlebarRef = useRef(null); @@ -72,8 +73,6 @@ export function EventReviewTimeline({ const exportEndTimeRef = useRef(null); const selectedTimelineRef = timelineRef || internalTimelineRef; - const observer = useRef(null); - const timelineDuration = useMemo( () => timelineStart - timelineEnd, [timelineEnd, timelineStart], @@ -221,63 +220,32 @@ export function EventReviewTimeline({ } }, [isDragging, onHandlebarDraggingChange]); - useEffect(() => { - if (contentRef.current && segments && !showMinimap) { - observer.current = new IntersectionObserver( - (entries) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - const segmentStartId = - entry.target.getAttribute("data-segment-start"); - if (segmentStartId) { - setVisibleThumbnails((prevState) => [ - ...prevState, - parseInt(segmentStartId), - ]); - } - } else { - const segmentStartId = - entry.target.getAttribute("data-segment-start"); - if (segmentStartId) { - setVisibleThumbnails((prevState) => - prevState.filter( - (timestamp) => timestamp !== parseInt(segmentStartId), - ), - ); - } - } - }); - }, - { threshold: 0.5 }, - ); - - const reviewItems = contentRef.current.querySelectorAll(".review-item"); - reviewItems.forEach((item) => { - observer.current?.observe(item); - }); - } - - return () => { - observer.current?.disconnect(); - }; - }, [contentRef, segments, showMinimap]); - useEffect(() => { if ( selectedTimelineRef.current && segments && - visibleThumbnails?.length > 0 && + visibleTimestamps && + visibleTimestamps?.length > 0 && !showMinimap ) { + const alignedVisibleTimestamps = visibleTimestamps.map( + alignStartDateToTimeline, + ); const element = selectedTimelineRef.current?.querySelector( - `[data-segment-id="${Math.max(...visibleThumbnails)}"]`, + `[data-segment-id="${Math.max(...alignedVisibleTimestamps)}"]`, ); scrollIntoView(element as HTMLDivElement, { scrollMode: "if-needed", behavior: "smooth", }); } - }, [visibleThumbnails, selectedTimelineRef, segments, showMinimap]); + }, [ + selectedTimelineRef, + segments, + showMinimap, + alignStartDateToTimeline, + visibleTimestamps, + ]); return ( minimap.map((str) => parseFloat(str)), + [minimap], + ); + return ( <>