diff --git a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx index 4e6be6662..aded14ec9 100644 --- a/web/src/components/player/dynamic/DynamicVideoPlayer.tsx +++ b/web/src/components/player/dynamic/DynamicVideoPlayer.tsx @@ -168,7 +168,10 @@ export default function DynamicVideoPlayer({ useEffect(() => { if (!controller || !recordings) { - setNoRecording(true); + if (recordings?.length == 0) { + setNoRecording(true); + } + return; } diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index ce646f5bd..0326fe3dc 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -101,7 +101,7 @@ export default function Events() { // review paging - const [beforeTs, setBeforeTs] = useState(Date.now() / 1000); + const [beforeTs, setBeforeTs] = useState(Math.ceil(Date.now() / 1000)); const last24Hours = useMemo(() => { return { before: beforeTs, after: getHoursAgo(24) }; }, [beforeTs]); @@ -455,5 +455,5 @@ export default function Events() { function getHoursAgo(hours: number): number { const now = new Date(); now.setHours(now.getHours() - hours); - return now.getTime() / 1000; + return Math.ceil(now.getTime() / 1000); } diff --git a/web/src/views/events/RecordingView.tsx b/web/src/views/events/RecordingView.tsx index c1b30b98e..9737ad31d 100644 --- a/web/src/views/events/RecordingView.tsx +++ b/web/src/views/events/RecordingView.tsx @@ -46,6 +46,7 @@ import { ASPECT_VERTICAL_LAYOUT, ASPECT_WIDE_LAYOUT } from "@/types/record"; import { useResizeObserver } from "@/hooks/resize-observer"; import { cn } from "@/lib/utils"; import { useFullscreen } from "@/hooks/use-fullscreen"; +import ActivityIndicator from "@/components/indicators/activity-indicator"; const SEGMENT_DURATION = 30; @@ -107,7 +108,7 @@ export function RecordingView({ return chunk.after <= startTime && chunk.before >= startTime; }), ); - const currentTimeRange = useMemo( + const currentTimeRange = useMemo( () => chunkedTimeRange[selectedRangeIdx], [selectedRangeIdx, chunkedTimeRange], ); @@ -171,6 +172,10 @@ export function RecordingView({ ); useEffect(() => { + if (!currentTimeRange) { + return; + } + if (scrubbing || exportRange) { if ( currentTime > currentTimeRange.before + 60 || @@ -198,6 +203,10 @@ export function RecordingView({ const manuallySetCurrentTime = useCallback( (time: number) => { + if (!currentTimeRange) { + return; + } + setCurrentTime(time); if (currentTimeRange.after <= time && currentTimeRange.before >= time) { @@ -210,6 +219,10 @@ export function RecordingView({ ); useEffect(() => { + if (!currentTimeRange) { + return; + } + if (!scrubbing) { if (Math.abs(currentTime - playerTime) > 10) { if ( @@ -471,143 +484,152 @@ export function RecordingView({ -
+ {currentTimeRange ? (
- { - setPlayerTime(timestamp); - setCurrentTime(timestamp); - Object.values(previewRefs.current ?? {}).forEach((prev) => - prev.scrubToTimestamp(Math.floor(timestamp)), - ); - }} - onClipEnded={onClipEnded} - onControllerReady={(controller) => { - mainControllerRef.current = controller; - }} - isScrubbing={scrubbing || exportMode == "timeline"} - setFullResolution={setFullResolution} - toggleFullscreen={toggleFullscreen} - containerRef={mainLayoutRef} - /> -
- {isDesktop && (
-
- {allCameras.map((cam) => { - if (cam == mainCamera || cam == "birdseye") { - return; - } - - return ( -
- { - previewRefs.current[cam] = controller; - controller.scrubToTimestamp(startTime); - }} - onClick={() => onSelectCamera(cam)} - /> -
- ); - })} -
+ { + setPlayerTime(timestamp); + setCurrentTime(timestamp); + Object.values(previewRefs.current ?? {}).forEach((prev) => + prev.scrubToTimestamp(Math.floor(timestamp)), + ); + }} + onClipEnded={onClipEnded} + onControllerReady={(controller) => { + mainControllerRef.current = controller; + }} + isScrubbing={scrubbing || exportMode == "timeline"} + setFullResolution={setFullResolution} + toggleFullscreen={toggleFullscreen} + containerRef={mainLayoutRef} + />
- )} + {isDesktop && ( +
+
+ {allCameras.map((cam) => { + if (cam == mainCamera || cam == "birdseye") { + return; + } + + return ( +
+ { + previewRefs.current[cam] = controller; + controller.scrubToTimestamp(startTime); + }} + onClick={() => onSelectCamera(cam)} + /> +
+ ); + })} +
+
+ )} +
+
+ +
+ ) : ( +
+
+ No recordings or previews found for this time
- -
+ )}
); }