Skip to content

Commit 3d359df

Browse files
committed
fix: sliding volume overrides dynamic volume slider
1 parent 875260e commit 3d359df

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

src/components/volume.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { css, html, LitElement, nothing } from 'lit';
2-
import { property } from 'lit/decorators.js';
2+
import { property, state } from 'lit/decorators.js';
33
import MediaControlService from '../services/media-control-service';
44
import Store from '../model/store';
55
import { 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

Comments
 (0)