Show message when no reordings found for time

This commit is contained in:
Nicolas Mowen 2024-04-19 15:13:29 -06:00
parent df1a10294c
commit 98cb723e49
3 changed files with 29 additions and 5 deletions

View File

@ -1,7 +1,7 @@
import { Recording } from "@/types/record"; import { Recording } from "@/types/record";
import { DynamicPlayback } from "@/types/playback"; import { DynamicPlayback } from "@/types/playback";
import { PreviewController } from "../PreviewPlayer"; import { PreviewController } from "../PreviewPlayer";
import { Timeline } from "@/types/timeline"; import { TimeRange, Timeline } from "@/types/timeline";
type PlayerMode = "playback" | "scrubbing"; type PlayerMode = "playback" | "scrubbing";
@ -10,11 +10,13 @@ export class DynamicVideoController {
public camera = ""; public camera = "";
private playerController: HTMLVideoElement; private playerController: HTMLVideoElement;
private previewController: PreviewController; private previewController: PreviewController;
private setNoRecording: (noRecs: boolean) => void;
private setFocusedItem: (timeline: Timeline) => void; private setFocusedItem: (timeline: Timeline) => void;
private playerMode: PlayerMode = "playback"; private playerMode: PlayerMode = "playback";
// playback // playback
private recordings: Recording[] = []; private recordings: Recording[] = [];
private timeRange: TimeRange = { after: 0, before: 0 };
private annotationOffset: number; private annotationOffset: number;
private timeToStart: number | undefined = undefined; private timeToStart: number | undefined = undefined;
@ -24,6 +26,7 @@ export class DynamicVideoController {
previewController: PreviewController, previewController: PreviewController,
annotationOffset: number, annotationOffset: number,
defaultMode: PlayerMode, defaultMode: PlayerMode,
setNoRecording: (noRecs: boolean) => void,
setFocusedItem: (timeline: Timeline) => void, setFocusedItem: (timeline: Timeline) => void,
) { ) {
this.camera = camera; this.camera = camera;
@ -31,11 +34,13 @@ export class DynamicVideoController {
this.previewController = previewController; this.previewController = previewController;
this.annotationOffset = annotationOffset; this.annotationOffset = annotationOffset;
this.playerMode = defaultMode; this.playerMode = defaultMode;
this.setNoRecording = setNoRecording;
this.setFocusedItem = setFocusedItem; this.setFocusedItem = setFocusedItem;
} }
newPlayback(newPlayback: DynamicPlayback) { newPlayback(newPlayback: DynamicPlayback) {
this.recordings = newPlayback.recordings; this.recordings = newPlayback.recordings;
this.timeRange = newPlayback.timeRange;
if (this.timeToStart) { if (this.timeToStart) {
this.seekToTimestamp(this.timeToStart); this.seekToTimestamp(this.timeToStart);
@ -52,12 +57,17 @@ export class DynamicVideoController {
} }
seekToTimestamp(time: number, play: boolean = false) { seekToTimestamp(time: number, play: boolean = false) {
if (time < this.timeRange.after || time > this.timeRange.before) {
this.timeToStart = time;
return;
}
if ( if (
this.recordings.length == 0 || this.recordings.length == 0 ||
time < this.recordings[0].start_time || time < this.recordings[0].start_time ||
time > this.recordings[this.recordings.length - 1].end_time time > this.recordings[this.recordings.length - 1].end_time
) { ) {
this.timeToStart = time; this.setNoRecording(true);
return; return;
} }
@ -90,6 +100,8 @@ export class DynamicVideoController {
} else { } else {
this.playerController.pause(); this.playerController.pause();
} }
} else {
console.log(`seek time is 0`);
} }
} }

View File

@ -45,6 +45,7 @@ export default function DynamicVideoPlayer({
const playerRef = useRef<HTMLVideoElement | null>(null); const playerRef = useRef<HTMLVideoElement | null>(null);
const [previewController, setPreviewController] = const [previewController, setPreviewController] =
useState<PreviewController | null>(null); useState<PreviewController | null>(null);
const [noRecording, setNoRecording] = useState(false);
const controller = useMemo(() => { const controller = useMemo(() => {
if (!config || !playerRef.current || !previewController) { if (!config || !playerRef.current || !previewController) {
return undefined; return undefined;
@ -56,6 +57,7 @@ export default function DynamicVideoPlayer({
previewController, previewController,
(config.cameras[camera]?.detect?.annotation_offset || 0) / 1000, (config.cameras[camera]?.detect?.annotation_offset || 0) / 1000,
isScrubbing ? "scrubbing" : "playback", isScrubbing ? "scrubbing" : "playback",
setNoRecording,
() => {}, () => {},
); );
// we only want to fire once when players are ready // we only want to fire once when players are ready
@ -92,9 +94,11 @@ export default function DynamicVideoPlayer({
return () => { return () => {
if (loadingTimeout) { if (loadingTimeout) {
clearTimeout(loadingTimeout) clearTimeout(loadingTimeout);
}
} }
};
// we only want trigger when scrubbing state changes
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [camera, isScrubbing]); }, [camera, isScrubbing]);
const onPlayerLoaded = useCallback(() => { const onPlayerLoaded = useCallback(() => {
@ -149,6 +153,7 @@ export default function DynamicVideoPlayer({
controller.newPlayback({ controller.newPlayback({
recordings: recordings ?? [], recordings: recordings ?? [],
timeRange,
}); });
// we only want this to change when recordings update // we only want this to change when recordings update
@ -175,6 +180,7 @@ export default function DynamicVideoPlayer({
} }
setIsLoading(false); setIsLoading(false);
setNoRecording(false);
}} }}
/> />
<PreviewPlayer <PreviewPlayer
@ -188,9 +194,14 @@ export default function DynamicVideoPlayer({
setPreviewController(previewController); setPreviewController(previewController);
}} }}
/> />
{isLoading && ( {isLoading && !noRecording && (
<ActivityIndicator className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" /> <ActivityIndicator className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2" />
)} )}
{noRecording && (
<div className="absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2">
No recordings found for this time
</div>
)}
</> </>
); );
} }

View File

@ -4,6 +4,7 @@ import { TimeRange } from "./timeline";
export type DynamicPlayback = { export type DynamicPlayback = {
recordings: Recording[]; recordings: Recording[];
timeRange: TimeRange;
}; };
export type PreviewPlayback = { export type PreviewPlayback = {