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