11import { css , html , LitElement , nothing } from 'lit' ;
2- import { property } from 'lit/decorators.js' ;
2+ import { property , state } from 'lit/decorators.js' ;
33import MediaControlService from '../services/media-control-service' ;
44import Store from '../model/store' ;
55import { CardConfig } from '../types' ;
@@ -14,14 +14,16 @@ class Volume extends LitElement {
1414 @property ( { type : Boolean } ) updateMembers = true ;
1515 @property ( ) volumeClicked ?: ( ) => void ;
1616 @property ( ) slim : boolean = false ;
17+ @state ( ) private sliderMoving : boolean = false ;
18+ @state ( ) private startVolumeSliderMoving : number = 0 ;
1719 private togglePower = async ( ) => await this . mediaControlService . togglePower ( this . player ) ;
1820
1921 render ( ) {
2022 this . config = this . store . config ;
2123 this . mediaControlService = this . store . mediaControlService ;
2224
2325 const volume = this . player . getVolume ( ) ;
24- const max = this . getMax ( volume ) ;
26+ const max = this . getMax ( ) ;
2527
2628 const isMuted = this . updateMembers ? this . player . isGroupMuted ( ) : this . player . isMemberMuted ( ) ;
2729 const muteIcon = isMuted ? mdiVolumeMute : mdiVolumeHigh ;
@@ -35,7 +37,7 @@ class Volume extends LitElement {
3537 .value = ${ volume }
3638 max= ${ max }
3739 @value-changed = ${ this . volumeChanged }
38- @slider-moved = ${ this . volumeChanged }
40+ @slider-moved = ${ this . sliderMoved }
3941 .disabled = ${ disabled }
4042 class= ${ this . config . dynamicVolumeSlider && max === 100 ? 'over-threshold' : '' }
4143 > </ ha- control- slider>
@@ -51,13 +53,27 @@ class Volume extends LitElement {
5153 ` ;
5254 }
5355
54- private getMax ( volume : number ) {
56+ private getMax ( ) {
57+ const volume = this . sliderMoving ? this . startVolumeSliderMoving : this . player . getVolume ( ) ;
5558 const dynamicThreshold = Math . max ( 0 , Math . min ( this . config . dynamicVolumeSliderThreshold ?? 20 , 100 ) ) ;
5659 const dynamicMax = Math . max ( 0 , Math . min ( this . config . dynamicVolumeSliderMax ?? 30 , 100 ) ) ;
5760 return volume < dynamicThreshold && this . config . dynamicVolumeSlider ? dynamicMax : 100 ;
5861 }
5962
63+ private async sliderMoved ( e : Event ) {
64+ if ( ! this . sliderMoving ) {
65+ this . startVolumeSliderMoving = this . player . getVolume ( ) ;
66+ }
67+ this . sliderMoving = true ;
68+ return await this . setVolume ( e ) ;
69+ }
70+
6071 private async volumeChanged ( e : Event ) {
72+ this . sliderMoving = false ;
73+ return await this . setVolume ( e ) ;
74+ }
75+
76+ private async setVolume ( e : Event ) {
6177 const newVolume = numberFromEvent ( e ) ;
6278 return await this . mediaControlService . volumeSet ( this . player , newVolume , this . updateMembers ) ;
6379 }
0 commit comments