Bilibili-Evolved/registry/lib/components/video/player/invert-scroll-volume/index.ts
2023-04-22 17:17:14 +08:00

61 lines
1.6 KiB
TypeScript

import {
OptionsOfMetadata,
defineComponentMetadata,
defineOptionsMetadata,
} from '@/components/define'
import { disableScrollVolume } from '../disable-scroll-volume'
import { playerAgent } from '@/components/video/player-agent'
import { getComponentSettings } from '@/core/settings'
import { allVideoUrls } from '@/core/utils/urls'
let cancel: () => void
const MaxDeltaFactor = 30
const options = defineOptionsMetadata({
deltaFactor: {
defaultValue: 15,
slider: {
min: 1,
max: MaxDeltaFactor,
step: 1,
},
displayName: '灵敏度',
},
})
const invertScrollVolume = () => {
cancel?.()
const settings = getComponentSettings<OptionsOfMetadata<typeof options>>('invertScrollVolume')
const handleWheel = (e: WheelEvent) => {
const isFullscreen = [
'player-mode-webfullscreen',
'player-fullscreen-fix',
'player-full-win',
].some(token => document.body.classList.contains(token))
if (isFullscreen) {
playerAgent.changeVolume(e.deltaY / ((MaxDeltaFactor - settings.options.deltaFactor + 1) / 2))
}
}
unsafeWindow.addEventListener('wheel', handleWheel)
const cancelPrevent = disableScrollVolume()
return () => {
unsafeWindow.removeEventListener('wheel', handleWheel)
cancelPrevent()
}
}
export const component = defineComponentMetadata({
name: 'invertScrollVolume',
displayName: '反转滚轮调音量',
tags: [componentsTags.video],
options,
entry: () => {
cancel?.()
cancel = invertScrollVolume()
},
reload: () => {
cancel?.()
cancel = invertScrollVolume()
},
unload: () => cancel?.(),
urlInclude: allVideoUrls,
})