diff --git a/src/player/Player.vue b/src/player/Player.vue index 390c04b..570281e 100644 --- a/src/player/Player.vue +++ b/src/player/Player.vue @@ -48,12 +48,12 @@
- - + + + :value="muteActive ? 0.0 : volume" @input="setVolume" />
state.currentTime, repeatActive: (state: any) => state.repeat, shuffleActive: (state: any) => state.shuffle, + muteActive: (state: any) => state.mute, visible: (state: any) => state.queue.length > 0, volume: (state: any) => state.volume, }), @@ -145,6 +146,7 @@ 'previous', 'toggleRepeat', 'toggleShuffle', + 'toggleMute', ]), seek(event: any) { if (event.target) { diff --git a/src/player/store.ts b/src/player/store.ts index 4abd690..0ce7c57 100644 --- a/src/player/store.ts +++ b/src/player/store.ts @@ -5,11 +5,12 @@ import { API } from '@/shared/api' const audio = new Audio() const storedQueue = JSON.parse(localStorage.getItem('queue') || '[]') const storedQueueIndex = parseInt(localStorage.getItem('queueIndex') || '-1') -const storedVolume = parseFloat(localStorage.getItem('player.volume') || '1.0') if (storedQueueIndex > -1 && storedQueueIndex < storedQueue.length) { audio.src = storedQueue[storedQueueIndex].url } -audio.volume = storedVolume +const storedVolume = parseFloat(localStorage.getItem('player.volume') || '1.0') +const storedMuteState = localStorage.getItem('player.mute') === 'true' +audio.volume = storedMuteState ? 0.0 : storedVolume const mediaSession: MediaSession | undefined = navigator.mediaSession interface State { @@ -21,6 +22,7 @@ interface State { currentTime: number; // position of current track in seconds repeat: boolean; shuffle: boolean; + mute: boolean; volume: number; // integer between 0 and 1 representing the volume of the player } @@ -35,6 +37,7 @@ export const playerModule: Module = { currentTime: 0, repeat: localStorage.getItem('player.repeat') !== 'false', shuffle: localStorage.getItem('player.shuffle') === 'true', + mute: storedMuteState, volume: storedVolume, }, @@ -59,6 +62,10 @@ export const playerModule: Module = { state.shuffle = enable localStorage.setItem('player.shuffle', enable) }, + setMute(state, enable) { + state.mute = enable + localStorage.setItem('player.mute', enable) + }, setQueue(state, queue) { state.queue = queue state.queueIndex = -1 @@ -106,10 +113,11 @@ export const playerModule: Module = { setScrobbled(state) { state.scrobbled = true }, - setVolume(state, value: any) { + setVolume(state, value: number) { state.volume = value + state.mute = value <= 0.0 localStorage.setItem('player.volume', String(value)) - } + }, }, actions: { @@ -178,6 +186,10 @@ export const playerModule: Module = { toggleShuffle({ commit, state }) { commit('setShuffle', !state.shuffle) }, + toggleMute({ commit, state }) { + commit('setMute', !state.mute) + audio.volume = state.mute ? 0.0 : state.volume + }, addToQueue({ commit }, track) { commit('addToQueue', track) }, diff --git a/src/shared/components/Icon.vue b/src/shared/components/Icon.vue index 69d3f6f..f2394a9 100644 --- a/src/shared/components/Icon.vue +++ b/src/shared/components/Icon.vue @@ -29,6 +29,7 @@ BIconRss, BIconX, BIconVolumeUpFill, + BIconVolumeMuteFill, } from 'bootstrap-vue' export default Vue.extend({ @@ -58,6 +59,7 @@ BIconRss, BIconX, BIconVolumeUpFill, + BIconVolumeMuteFill, }, props: { icon: { type: String, required: true }