no need to duplicate observer

This commit is contained in:
Josh Hawkins 2024-03-21 12:13:21 -05:00
parent e4ae1112ef
commit f236ba62e0
2 changed files with 21 additions and 47 deletions

View File

@ -30,6 +30,7 @@ export type EventReviewTimelineProps = {
setExportStartTime?: React.Dispatch<React.SetStateAction<number>>;
setExportEndTime?: React.Dispatch<React.SetStateAction<number>>;
events: ReviewSegment[];
visibleTimestamps?: number[];
severityType: ReviewSeverity;
timelineRef?: RefObject<HTMLDivElement>;
contentRef: RefObject<HTMLDivElement>;
@ -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<number[]>([]);
const internalTimelineRef = useRef<HTMLDivElement>(null);
const handlebarRef = useRef<HTMLDivElement>(null);
@ -72,8 +73,6 @@ export function EventReviewTimeline({
const exportEndTimeRef = useRef<HTMLDivElement>(null);
const selectedTimelineRef = timelineRef || internalTimelineRef;
const observer = useRef<IntersectionObserver | null>(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 (
<ReviewTimeline

View File

@ -470,6 +470,11 @@ function DetectionReview({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [contentRef.current?.scrollHeight, minimapBounds]);
const visibleTimestamps = useMemo(
() => minimap.map((str) => parseFloat(str)),
[minimap],
);
return (
<>
<div
@ -559,6 +564,7 @@ function DetectionReview({
minimapEndTime={minimapBounds.end}
showHandlebar={previewTime != undefined}
handlebarTime={previewTime}
visibleTimestamps={visibleTimestamps}
events={reviewItems?.all ?? []}
severityType={severity}
contentRef={contentRef}