diff --git a/web-new/src/components/player/PreviewThumbnailPlayer.tsx b/web-new/src/components/player/PreviewThumbnailPlayer.tsx index 3c71d73dc..b74321ec9 100644 --- a/web-new/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web-new/src/components/player/PreviewThumbnailPlayer.tsx @@ -1,7 +1,7 @@ import { FrigateConfig } from "@/types/frigateConfig"; import VideoPlayer from "./VideoPlayer"; import useSWR from "swr"; -import { useCallback, useRef } from "react"; +import { useCallback, useRef, useState } from "react"; import { useApiHost } from "@/api"; import Player from "video.js/dist/types/player"; import { AspectRatio } from "../ui/aspect-ratio"; @@ -33,6 +33,8 @@ export default function PreviewThumbnailPlayer({ const playerRef = useRef(null); const apiHost = useApiHost(); + const [visible, setVisible] = useState(false); + const onPlayback = useCallback( (isHovered: Boolean) => { if (!relevantPreview || !playerRef.current) { @@ -52,7 +54,7 @@ export default function PreviewThumbnailPlayer({ const observer = useRef(); const inViewRef = useCallback( (node: HTMLElement | null) => { - if (!shouldAutoPlay || observer.current) { + if (observer.current) { return; } @@ -60,12 +62,22 @@ export default function PreviewThumbnailPlayer({ observer.current = new IntersectionObserver( (entries) => { if (entries[0].isIntersecting) { - onPlayback(true); + if (entries[0].intersectionRatio == 1.0) { + if (shouldAutoPlay) { + onPlayback(true); + } + } else { + setVisible(true); + } } else { - onPlayback(false); + if (shouldAutoPlay) { + onPlayback(false); + } + + setVisible(false); } }, - { threshold: 1.0 } + { threshold: [0.0, 1.0], rootMargin: "25% 0% 25% 0%" } ); if (node) observer.current.observe(node); } catch (e) { @@ -75,44 +87,27 @@ export default function PreviewThumbnailPlayer({ [observer, onPlayback] ); - if (!relevantPreview) { + let content; + if (!relevantPreview || !visible) { if (isCurrentHour(startTs)) { - return ( - - - + content = ( + ); } - return ( - - - + content = ( + ); - } - - return ( - onPlayback(true)} - onMouseLeave={() => onPlayback(false)} - > + } else { + content = (
+ ); + } + + return ( + onPlayback(true)} + onMouseLeave={() => onPlayback(false)} + > + {content} ); }