import {useCallback} from 'react' import {View} from 'react-native' import Animated, {FadeIn, FadeOut} from 'react-native-reanimated' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {isSafari, isTouchDevice} from '#/lib/browser' import {atoms as a} from '#/alf' import {Mute_Stroke2_Corner0_Rounded as MuteIcon} from '#/components/icons/Mute' import {SpeakerVolumeFull_Stroke2_Corner0_Rounded as UnmuteIcon} from '#/components/icons/Speaker' import {useVideoVolumeState} from '#/components/Post/Embed/VideoEmbed/VideoVolumeContext' import {ControlButton} from './ControlButton' export function VolumeControl({ muted, changeMuted, hovered, onHover, onEndHover, drawFocus, }: { muted: boolean changeMuted: (muted: boolean | ((prev: boolean) => boolean)) => void hovered: boolean onHover: () => void onEndHover: () => void drawFocus: () => void }) { const {_} = useLingui() const [volume, setVolume] = useVideoVolumeState() const onVolumeChange = useCallback( (evt: React.ChangeEvent) => { drawFocus() const vol = sliderVolumeToVideoVolume(Number(evt.target.value)) setVolume(vol) changeMuted(vol === 0) }, [setVolume, drawFocus, changeMuted], ) const sliderVolume = muted ? 0 : videoVolumeToSliderVolume(volume) const isZeroVolume = volume === 0 const onPressMute = useCallback(() => { drawFocus() if (isZeroVolume) { setVolume(1) changeMuted(false) } else { changeMuted(prevMuted => !prevMuted) } }, [drawFocus, setVolume, isZeroVolume, changeMuted]) return ( {hovered && !isTouchDevice && ( )} ) } function sliderVolumeToVideoVolume(value: number) { return Math.pow(value / 100, 4) } function videoVolumeToSliderVolume(value: number) { return Math.round(Math.pow(value, 1 / 4) * 100) }