import { useCallback, useEffect, useRef, useState } from "react"; import { useVideoPlayerDescriptor } from "@/_oldvideo/state/hooks"; import { useControls } from "@/_oldvideo/state/logic/controls"; import { useInterface } from "@/_oldvideo/state/logic/interface"; import { useMediaPlaying } from "@/_oldvideo/state/logic/mediaplaying"; import { Icon, Icons } from "@/components/Icon"; import { makePercentage, makePercentageString, useProgressBar, } from "@/hooks/useProgressBar"; import { useVolumeControl } from "@/hooks/useVolumeToggle"; import { canChangeVolume } from "@/utils/detectFeatures"; interface Props { className?: string; } export function VolumeAction(props: Props) { const descriptor = useVideoPlayerDescriptor(); const controls = useControls(descriptor); const mediaPlaying = useMediaPlaying(descriptor); const videoInterface = useInterface(descriptor); const { setStoredVolume, toggleVolume } = useVolumeControl(descriptor); const ref = useRef(null); const [hoveredOnce, setHoveredOnce] = useState(false); const commitVolume = useCallback( (percentage) => { controls.setVolume(percentage); setStoredVolume(percentage); }, [controls, setStoredVolume] ); const { dragging, dragPercentage, dragMouseDown } = useProgressBar( ref, commitVolume, true ); useEffect(() => { if (!videoInterface.leftControlHovering) setHoveredOnce(false); }, [videoInterface]); const handleClick = useCallback(() => { toggleVolume(); }, [toggleVolume]); const handleMouseEnter = useCallback(async () => { if (await canChangeVolume()) setHoveredOnce(true); }, [setHoveredOnce]); let percentage = makePercentage(mediaPlaying.volume * 100); if (dragging) percentage = makePercentage(dragPercentage); const percentageString = makePercentageString(percentage); return (
0 ? Icons.VOLUME : Icons.VOLUME_X} />
); }