diff --git a/apps/client/src/widgets/type_widgets/file/Video.tsx b/apps/client/src/widgets/type_widgets/file/Video.tsx index a950f6ab42..5eac6ca68e 100644 --- a/apps/client/src/widgets/type_widgets/file/Video.tsx +++ b/apps/client/src/widgets/type_widgets/file/Video.tsx @@ -15,48 +15,16 @@ function formatTime(seconds: number): string { return `${mins}:${secs.toString().padStart(2, "0")}`; } +const AUTO_HIDE_DELAY = 3000; + export default function VideoPreview({ note }: { note: FNote }) { const wrapperRef = useRef(null); const videoRef = useRef(null); const [playing, setPlaying] = useState(false); - const [controlsVisible, setControlsVisible] = useState(true); - const hideTimerRef = useRef>(); - - const showControlsTemporarily = useCallback(() => { - setControlsVisible(true); - clearTimeout(hideTimerRef.current); - if (videoRef.current && !videoRef.current.paused) { - hideTimerRef.current = setTimeout(() => setControlsVisible(false), 3000); - } - }, []); - - // Auto-hide when playback starts, show when paused. - useEffect(() => { - if (playing) { - hideTimerRef.current = setTimeout(() => setControlsVisible(false), 3000); - } else { - clearTimeout(hideTimerRef.current); - setControlsVisible(true); - } - return () => clearTimeout(hideTimerRef.current); - }, [playing]); - - const onWrapperClick = useCallback((e: MouseEvent) => { - // Don't toggle if clicking on controls themselves. - const target = e.target as HTMLElement; - if (target.closest(".video-preview-controls")) return; - setControlsVisible((prev) => { - const next = !prev; - clearTimeout(hideTimerRef.current); - if (next && playing) { - hideTimerRef.current = setTimeout(() => setControlsVisible(false), 3000); - } - return next; - }); - }, [playing]); + const { visible: controlsVisible, onMouseMove, onClick: onWrapperClick } = useAutoHideControls(videoRef, playing); return ( -
+