koel/resources/assets/js/components/ui/Volume.vue

112 lines
2.3 KiB
Vue
Raw Normal View History

2022-04-15 14:24:30 +00:00
<template>
2022-10-13 15:18:47 +00:00
<span id="volume" class="volume" :class="level">
<span
v-show="level === 'muted'"
v-koel-tooltip.top
2022-07-15 07:23:55 +00:00
role="button"
tabindex="0"
title="Unmute"
@click="unmute"
>
<icon :icon="faVolumeMute" fixed-width/>
</span>
<span
v-show="level !== 'muted'"
v-koel-tooltip.top
2022-07-15 07:23:55 +00:00
role="button"
tabindex="0"
title="Mute"
@click="mute"
>
<icon :icon="level === 'discreet' ? faVolumeLow : faVolumeHigh" fixed-width/>
</span>
2022-07-15 07:23:55 +00:00
2022-04-15 14:24:30 +00:00
<input
id="volumeInput"
class="plyr__volume"
2022-04-15 14:24:30 +00:00
max="10"
role="slider"
2022-04-15 14:24:30 +00:00
step="0.1"
title="Volume"
type="range"
@change="broadcastVolume"
@input="setVolume"
2022-04-15 14:24:30 +00:00
>
</span>
</template>
2022-04-15 17:00:08 +00:00
<script lang="ts" setup>
2022-07-15 07:23:55 +00:00
import { faVolumeHigh, faVolumeLow, faVolumeMute } from '@fortawesome/free-solid-svg-icons'
import { computed } from 'vue'
import { socketService, volumeManager } from '@/services'
2022-04-15 14:24:30 +00:00
const volume = volumeManager.volume
2022-04-15 14:24:30 +00:00
const level = computed(() => {
if (volume.value === 0) return 'muted'
if (volume.value < 3) return 'discreet'
return 'loud'
})
2022-04-15 14:24:30 +00:00
const mute = () => volumeManager.mute()
const unmute = () => volumeManager.unmute()
const setVolume = (e: InputEvent) => volumeManager.set(parseFloat((e.target as HTMLInputElement).value))
2022-07-15 07:23:55 +00:00
2022-04-15 17:00:08 +00:00
/**
* Broadcast the volume changed event to remote controller.
*/
const broadcastVolume = (e: InputEvent) => {
2022-04-24 08:50:45 +00:00
socketService.broadcast('SOCKET_VOLUME_CHANGED', parseFloat((e.target as HTMLInputElement).value))
2022-04-15 17:00:08 +00:00
}
2022-04-15 14:24:30 +00:00
</script>
<style lang="scss">
#volume {
position: relative;
2022-10-13 15:18:47 +00:00
display: flex;
align-items: center;
2022-04-15 14:24:30 +00:00
[type=range] {
2022-07-15 07:23:55 +00:00
margin: 0 0 0 8px;
2022-10-13 15:18:47 +00:00
width: 120px;
height: 4px;
2022-04-15 14:24:30 +00:00
border-radius: 4px;
2022-10-13 15:18:47 +00:00
position: relative;
// increase click area
&::before {
position: absolute;
content: ' ';
left: 0;
right: 0;
top: -12px;
bottom: -12px;
}
2022-04-15 14:24:30 +00:00
2022-10-13 15:18:47 +00:00
&::-webkit-slider-thumb {
background: var(--color-text-secondary);
}
&:hover {
&::-webkit-slider-thumb {
background: var(--color-text-primary);
}
}
2022-04-15 14:24:30 +00:00
}
2022-10-13 15:18:47 +00:00
&.muted {
[type=range] {
&::-webkit-slider-thumb {
background: transparent;
box-shadow: none;
}
}
2022-04-15 14:24:30 +00:00
}
@media only screen and (max-width: 768px) {
display: none !important;
}
}
</style>