import { useCallback, useEffect, useRef, useState } from "react"; import { useVideoPlayerState } from "../VideoContext"; export function ProgressControl() { const { videoState } = useVideoPlayerState(); const ref = useRef(null); const [mouseDown, setMouseDown] = useState(false); const [progress, setProgress] = useState(0); let watchProgress = `${( (videoState.time / videoState.duration) * 100 ).toFixed(2)}%`; if (mouseDown) watchProgress = `${progress}%`; const bufferProgress = `${( (videoState.buffered / videoState.duration) * 100 ).toFixed(2)}%`; useEffect(() => { function mouseMove(ev: MouseEvent) { if (!mouseDown || !ref.current) return; const rect = ref.current.getBoundingClientRect(); const pos = ((ev.pageX - rect.left) / ref.current.offsetWidth) * 100; setProgress(pos); } function mouseUp(ev: MouseEvent) { if (!mouseDown) return; setMouseDown(false); document.body.removeAttribute("data-no-select"); if (!ref.current) return; const rect = ref.current.getBoundingClientRect(); const pos = (ev.pageX - rect.left) / ref.current.offsetWidth; videoState.setTime(pos * videoState.duration); } document.addEventListener("mousemove", mouseMove); document.addEventListener("mouseup", mouseUp); return () => { document.removeEventListener("mousemove", mouseMove); document.removeEventListener("mouseup", mouseUp); }; }, [mouseDown, videoState]); const handleMouseDown = useCallback(() => { setMouseDown(true); document.body.setAttribute("data-no-select", "true"); }, []); return (
); }