diff --git a/web/src/components/player/DynamicVideoPlayer.tsx b/web/src/components/player/DynamicVideoPlayer.tsx index 4b669d360..4f693cdf1 100644 --- a/web/src/components/player/DynamicVideoPlayer.tsx +++ b/web/src/components/player/DynamicVideoPlayer.tsx @@ -63,9 +63,8 @@ export default function DynamicVideoPlayer({ // controlling playback const playerRef = useRef(undefined); - const previewRef = useRef(undefined); + const previewRef = useRef(null); const [isScrubbing, setIsScrubbing] = useState(previewOnly); - const [hasPreview, setHasPreview] = useState(false); const [focusedItem, setFocusedItem] = useState( undefined, ); @@ -155,13 +154,11 @@ export default function DynamicVideoPlayer({ ); if (preview) { - setHasPreview(true); return { src: preview.src, type: preview.type, }; } else { - setHasPreview(false); return undefined; } @@ -169,6 +166,8 @@ export default function DynamicVideoPlayer({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const [currentPreview, setCurrentPreview] = useState(initialPreviewSource); + // state of playback player const recordingParams = useMemo(() => { @@ -201,7 +200,7 @@ export default function DynamicVideoPlayer({ Math.round(preview.start) >= timeRange.start && Math.floor(preview.end) <= timeRange.end, ); - setHasPreview(preview != undefined); + setCurrentPreview(preview); controller.newPlayback({ recordings: recordings ?? [], @@ -222,7 +221,7 @@ export default function DynamicVideoPlayer({ {!previewOnly && (
)} -
controller.finishedSeeking()} + onLoadedData={() => controller.previewReady()} + onLoadStart={ + previewOnly && onControllerReady + ? () => { + onControllerReady(controller); + } + : undefined + } > - { - previewRef.current = player; - player.pause(); - player.on("seeked", () => controller.finishedSeeking()); - player.on("loadeddata", () => controller.previewReady()); - - if (previewOnly && onControllerReady) { - onControllerReady(controller); - } - }} - onDispose={() => { - previewRef.current = undefined; - }} - /> -
+ {currentPreview != undefined && ( + + )} + ); } @@ -302,7 +293,7 @@ export default function DynamicVideoPlayer({ export class DynamicVideoController { // main state private playerRef: MutableRefObject; - private previewRef: MutableRefObject; + private previewRef: MutableRefObject; private setScrubbing: (isScrubbing: boolean) => void; private setFocusedItem: (timeline: Timeline) => void; private playerMode: PlayerMode = "playback"; @@ -324,7 +315,7 @@ export class DynamicVideoController { constructor( playerRef: MutableRefObject, - previewRef: MutableRefObject, + previewRef: MutableRefObject, annotationOffset: number, defaultMode: PlayerMode, setScrubbing: (isScrubbing: boolean) => void, @@ -352,12 +343,6 @@ export class DynamicVideoController { } this.preview = newPlayback.preview; - if (this.preview && this.previewRef.current) { - this.previewRef.current.src({ - src: this.preview.src, - type: this.preview.type, - }); - } } seekToTimestamp(time: number, play: boolean = false) { @@ -487,15 +472,22 @@ export class DynamicVideoController { if (this.seeking) { this.timeToSeek = time; } else { - this.previewRef.current?.currentTime( - Math.max(0, time - this.preview.start), - ); - this.seeking = true; + if (this.previewRef.current) { + this.previewRef.current.currentTime = Math.max( + 0, + time - this.preview.start, + ); + this.seeking = true; + } } } finishedSeeking() { - if (!this.preview || this.playerMode == "playback") { + if ( + !this.previewRef.current || + !this.preview || + this.playerMode == "playback" + ) { return; } @@ -503,11 +495,10 @@ export class DynamicVideoController { if ( this.timeToSeek && - this.timeToSeek != this.previewRef.current?.currentTime() + this.timeToSeek != this.previewRef.current?.currentTime ) { - this.previewRef.current?.currentTime( - this.timeToSeek - this.preview.start, - ); + this.previewRef.current.currentTime = + this.timeToSeek - this.preview.start; } else { this.seeking = false; } diff --git a/web/src/views/events/EventView.tsx b/web/src/views/events/EventView.tsx index 3bd626e1e..e00a10a30 100644 --- a/web/src/views/events/EventView.tsx +++ b/web/src/views/events/EventView.tsx @@ -608,7 +608,7 @@ function MotionReview({ <>
{reviewCameras.map((camera) => { let grow;