From c9189b5d5b01c29b6515ecfecabc8d0cf0daf3a0 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Thu, 22 Feb 2024 14:49:14 -0700 Subject: [PATCH] Implement scrubbing --- .../timeline/EventReviewTimeline.tsx | 8 +++++ web/src/pages/Events.tsx | 17 +++++---- web/src/views/events/DesktopRecordingView.tsx | 36 +++++++++++++++++-- 3 files changed, 52 insertions(+), 9 deletions(-) diff --git a/web/src/components/timeline/EventReviewTimeline.tsx b/web/src/components/timeline/EventReviewTimeline.tsx index aeedd89a5..7240934c0 100644 --- a/web/src/components/timeline/EventReviewTimeline.tsx +++ b/web/src/components/timeline/EventReviewTimeline.tsx @@ -25,6 +25,7 @@ export type EventReviewTimelineProps = { events: ReviewSegment[]; severityType: ReviewSeverity; contentRef: RefObject; + onHandlebarDraggingChange?: (isDragging: boolean) => void; }; export function EventReviewTimeline({ @@ -41,6 +42,7 @@ export function EventReviewTimeline({ events, severityType, contentRef, + onHandlebarDraggingChange, }: EventReviewTimelineProps) { const [isDragging, setIsDragging] = useState(false); const [currentTimeSegment, setCurrentTimeSegment] = useState(0); @@ -152,6 +154,12 @@ export function EventReviewTimeline({ } }, [currentTimeSegment, showHandlebar]); + useEffect(() => { + if (onHandlebarDraggingChange) { + onHandlebarDraggingChange(isDragging); + } + }, [isDragging, onHandlebarDraggingChange]); + useEffect(() => { if (timelineRef.current && handlebarTime && showHandlebar) { const { scrollHeight: timelineHeight } = timelineRef.current; diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index 10ac0265c..1d5846a2b 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -139,7 +139,7 @@ export default function Events() { // selected items - const selectedReviews = useMemo(() => { + const selectedData = useMemo(() => { if (!selectedReviewId) { return undefined; } @@ -159,18 +159,21 @@ export default function Events() { return { selected: selectedReview, - cameraReviews: allReviews.filter( - (seg) => seg.camera == selectedReview?.camera + cameraSegments: allReviews.filter( + (seg) => seg.camera == selectedReview.camera + ), + cameraPreviews: allPreviews?.filter( + (seg) => seg.camera == selectedReview.camera ), }; }, [selectedReviewId, reviewPages]); - if (selectedReviews) { + if (selectedData) { return ( ); } else { diff --git a/web/src/views/events/DesktopRecordingView.tsx b/web/src/views/events/DesktopRecordingView.tsx index 22b11c16f..7fe0cbc10 100644 --- a/web/src/views/events/DesktopRecordingView.tsx +++ b/web/src/views/events/DesktopRecordingView.tsx @@ -5,7 +5,7 @@ import EventReviewTimeline from "@/components/timeline/EventReviewTimeline"; import { Button } from "@/components/ui/button"; import { ReviewSegment } from "@/types/review"; import { getChunkedTimeRange } from "@/utils/timelineUtil"; -import { useMemo, useRef, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { IoMdArrowRoundBack } from "react-icons/io"; import { useNavigate } from "react-router-dom"; @@ -24,6 +24,7 @@ export default function DesktopRecordingView({ const contentRef = useRef(null); // timeline time + const timeRange = useMemo( () => getChunkedTimeRange(selectedReview.start_time), [] @@ -37,10 +38,40 @@ export default function DesktopRecordingView({ }) ); + // move to next clip + useEffect(() => { + if (!controllerRef.current) { + return; + } + + console.log("current index and moving to "); + + if (selectedRangeIdx < timeRange.ranges.length - 1) { + controllerRef.current.onClipEndedEvent(() => { + setSelectedRangeIdx(selectedRangeIdx + 1); + }); + } + }, [controllerRef, selectedRangeIdx]); + + // scrubbing and timeline state + + const [scrubbing, setScrubbing] = useState(false); const [currentTime, setCurrentTime] = useState( selectedReview?.start_time || Date.now() / 1000 ); + useEffect(() => { + if (scrubbing) { + controllerRef.current?.scrubToTimestamp(currentTime); + } + }, [controllerRef, currentTime, scrubbing]); + + useEffect(() => { + if (!scrubbing) { + controllerRef.current?.seekToTimestamp(currentTime, true); + } + }, [controllerRef, scrubbing]); + return (