import { useCallback, useRef } from "react"; import { Icon, Icons } from "@/components/Icon"; import { makePercentage, makePercentageString, useProgressBar, } from "@/hooks/useProgressBar"; import { usePlayerStore } from "@/stores/player/store"; import { canChangeVolume } from "@/utils/detectFeatures"; import { useVolume } from "../hooks/useVolume"; interface Props { className?: string; } export function Volume(props: Props) { const ref = useRef(null); const setHovering = usePlayerStore((s) => s.setHoveringLeftControls); const hovering = usePlayerStore((s) => s.interface.leftControlHovering); const volume = usePlayerStore((s) => s.mediaPlaying.volume); const { setVolume, toggleMute } = useVolume(); const commitVolume = useCallback( (percentage: number) => { setVolume(percentage); }, [setVolume], ); const { dragging, dragPercentage, dragMouseDown } = useProgressBar( ref, commitVolume, true, ); const handleClick = useCallback(() => { toggleMute(); }, [toggleMute]); const handleMouseEnter = useCallback(async () => { if (await canChangeVolume()) setHovering(true); }, [setHovering]); let percentage = makePercentage(volume * 100); if (dragging) percentage = makePercentage(dragPercentage); const percentageString = makePercentageString(percentage); const handleWheel = useCallback( (event: React.WheelEvent) => { event.preventDefault(); let newVolume = volume - event.deltaY / 1000; newVolume = Math.max(0, Math.min(newVolume, 1)); setVolume(newVolume); }, [volume, setVolume], ); return (
0 ? Icons.VOLUME : Icons.VOLUME_X} />
); }