diff --git a/web/src/components/player/PreviewThumbnailPlayer.tsx b/web/src/components/player/PreviewThumbnailPlayer.tsx index f5829f777..28e4acce8 100644 --- a/web/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web/src/components/player/PreviewThumbnailPlayer.tsx @@ -39,6 +39,7 @@ export default function PreviewThumbnailPlayer({ const playerRef = useRef(null); const [visible, setVisible] = useState(false); + const [hoverTimeout, setHoverTimeout] = useState(); const [hover, setHover] = useState(false); const [progress, setProgress] = useState(0); @@ -49,8 +50,17 @@ export default function PreviewThumbnailPlayer({ } if (isHovered) { - setHover(true); + setHoverTimeout( + setTimeout(() => { + setHover(true); + setHoverTimeout(null); + }, 500) + ); } else { + if (hoverTimeout) { + clearTimeout(hoverTimeout); + } + setHover(false); setProgress(0); @@ -62,7 +72,7 @@ export default function PreviewThumbnailPlayer({ } } }, - [relevantPreview, review, playerRef] + [hoverTimeout, relevantPreview, review, playerRef] ); const autoPlayObserver = useRef(); @@ -234,7 +244,7 @@ function PreviewContent({ controls: false, muted: true, fluid: true, - aspectRatio: '16:9', + aspectRatio: "16:9", loadingSpinner: false, sources: relevantPreview ? [ @@ -253,7 +263,11 @@ function PreviewContent({ return; } - const playerStartTime = review.start_time - relevantPreview.start; + // start with a bit of padding + const playerStartTime = Math.max( + 0, + review.start_time - relevantPreview.start - 8 + ); player.playbackRate(slowPlayack ? 2 : 8); player.currentTime(playerStartTime); diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index 3fe65dd5a..0e8d2bfe2 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -19,7 +19,7 @@ import { MdCircle } from "react-icons/md"; import useSWR from "swr"; import useSWRInfinite from "swr/infinite"; -const API_LIMIT = 100; +const API_LIMIT = 250; export default function Events() { const { data: config } = useSWR("config"); @@ -245,7 +245,7 @@ export default function Events() { value="alert" aria-label="Select alerts" > - + Alerts - + Detections - + Motion @@ -314,7 +314,7 @@ export default function Events() { ); })} -
+