import { useCallback, useEffect, useRef, useState } from "react"; import { MouseActivity, makePercentage, makePercentageString, useProgressBar, } from "@/hooks/useProgressBar"; import { getPlayerState } from "@/video/state/cache"; import { useVideoPlayerDescriptor } from "@/video/state/hooks"; import { useControls } from "@/video/state/logic/controls"; import { useProgress } from "@/video/state/logic/progress"; import ThumbnailAction from "./ThumbnailAction"; export function ProgressAction() { const descriptor = useVideoPlayerDescriptor(); const controls = useControls(descriptor); const videoTime = useProgress(descriptor); const ref = useRef(null); const dragRef = useRef(false); const controlRef = useRef(controls); const [hoverPosition, setHoverPosition] = useState(0); const [isThumbnailVisible, setIsThumbnailVisible] = useState(false); const isCasting = getPlayerState(descriptor).casting.isCasting; const onMouseOver = useCallback((e: MouseActivity) => { setHoverPosition(e.clientX); setIsThumbnailVisible(true); }, []); const onMouseLeave = useCallback(() => { setIsThumbnailVisible(false); }, []); useEffect(() => { controlRef.current = controls; }, [controls]); const commitTime = useCallback( (percentage) => { controls.setTime(percentage * videoTime.duration); }, [controls, videoTime] ); const { dragging, dragPercentage, dragMouseDown } = useProgressBar( ref, commitTime ); useEffect(() => { if (dragRef.current === dragging) return; dragRef.current = dragging; controls.setSeeking(dragging); }, [dragRef, dragging, controls]); useEffect(() => { if (dragging) { const state = getPlayerState(descriptor); controlRef.current.setDraggingTime( state.progress.duration * (dragPercentage / 100) ); } }, [descriptor, dragging, dragPercentage]); let watchProgress = makePercentageString( makePercentage((videoTime.time / videoTime.duration) * 100) ); if (dragging) watchProgress = makePercentageString(makePercentage(dragPercentage)); const bufferProgress = makePercentageString( makePercentage((videoTime.buffered / videoTime.duration) * 100) ); return (
{isThumbnailVisible && !isCasting ? ( ) : null}
); }