import type Player from '@oplayer/core' import { $ } from '@oplayer/core' import { DRAG_EVENT_MAP } from '../utils' import { line, slider, sliderWrap, thumb, track, volumeValue, wrap } from './VolumeBar.style' const render = (player: Player, el: HTMLElement) => { const $dom = $.create( `div.${wrap}`, {}, `
100
` ) const $track = $dom.querySelector(`.${track}`)! const $thumb = $dom.querySelector(`.${thumb}`)! const $volumeSlider = $dom.querySelector(`.${line}`)! const $volumeValue = $dom.querySelector(`.${volumeValue}`)! const getSlidingValue = (event: MouseEvent | TouchEvent) => { const rect = $track.getBoundingClientRect() const value = (rect.bottom - ((event).clientY || (event).changedTouches[0]!.clientY)) / rect.height return value >= 1 ? 1 : value <= 0 ? 0 : value } const sync = (e: MouseEvent | TouchEvent) => { e.preventDefault() player.setVolume(setter(getSlidingValue(e))) } const setter = (value: number) => { $volumeValue.innerText = `${~~(value * 100)}` $volumeSlider.style.transform = `scaleY(${value})` $thumb.style.bottom = `calc(${~~(value * 100)}% - 6px)` return value } setter(player.volume) player.on('volumechange', () => { setter(player.isMuted ? 0 : player.volume) }) $track.addEventListener(DRAG_EVENT_MAP.dragStart, (e: MouseEvent | TouchEvent) => { sync(e) document.addEventListener(DRAG_EVENT_MAP.dragMove, sync, { passive: false }) document.addEventListener( DRAG_EVENT_MAP.dragEnd, () => { document.removeEventListener(DRAG_EVENT_MAP.dragMove, sync) }, { once: true } ) }) $.render($dom, el) } export default render