From 5dbdabeaeef725b4617b239b5a699acde837cf87 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Thu, 7 Mar 2024 06:23:13 -0700 Subject: [PATCH] Fix hover logic --- .../player/PreviewThumbnailPlayer.tsx | 58 +++++++++---------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/web/src/components/player/PreviewThumbnailPlayer.tsx b/web/src/components/player/PreviewThumbnailPlayer.tsx index d0f84899b..fc65d04cf 100644 --- a/web/src/components/player/PreviewThumbnailPlayer.tsx +++ b/web/src/components/player/PreviewThumbnailPlayer.tsx @@ -47,14 +47,11 @@ export default function PreviewThumbnailPlayer({ }: PreviewPlayerProps) { const apiHost = useApiHost(); const { data: config } = useSWR("config"); - - const [hoverTimeout, setHoverTimeout] = useState(); - const [playback, setPlayback] = useState(false); - const [ignoreClick, setIgnoreClick] = useState(false); const [imgRef, imgLoaded, onImgLoad] = useImageLoaded(); // interaction + const [ignoreClick, setIgnoreClick] = useState(false); const handleOnClick = useCallback( (e: React.MouseEvent) => { if (!ignoreClick) { @@ -120,38 +117,39 @@ export default function PreviewThumbnailPlayer({ } }, [allPreviews, review]); + // Hover Playback + + const [hoverTimeout, setHoverTimeout] = useState(); + const [playback, setPlayback] = useState(false); const playingBack = useMemo(() => playback, [playback]); + const [isHovered, setIsHovered] = useState(false); - const onPlayback = useCallback( - (isHovered: boolean) => { - if (isHovered && scrollLock) { - return; + useEffect(() => { + if (isHovered && scrollLock) { + return; + } + + if (isHovered) { + setHoverTimeout( + setTimeout(() => { + setPlayback(true); + setHoverTimeout(null); + }, 500), + ); + } else { + if (hoverTimeout) { + clearTimeout(hoverTimeout); } - if (isHovered) { - setHoverTimeout( - setTimeout(() => { - setPlayback(true); - setHoverTimeout(null); - }, 500), - ); - } else { - if (hoverTimeout) { - clearTimeout(hoverTimeout); - } + setPlayback(false); - setPlayback(false); - - if (onTimeUpdate) { - onTimeUpdate(undefined); - } + if (onTimeUpdate) { + onTimeUpdate(undefined); } - }, - + } // we know that these deps are correct // eslint-disable-next-line react-hooks/exhaustive-deps - [hoverTimeout, scrollLock, review], - ); + }, [isHovered, scrollLock]); // date @@ -163,8 +161,8 @@ export default function PreviewThumbnailPlayer({ return (
onPlayback(true)} - onMouseLeave={isMobile ? undefined : () => onPlayback(false)} + onMouseEnter={isMobile ? undefined : () => setIsHovered(true)} + onMouseLeave={isMobile ? undefined : () => setIsHovered(false)} onContextMenu={(e) => { e.preventDefault(); onClick(review.id, true);