feat: persist volume level across reloads

This commit is contained in:
2024-07-27 11:46:02 +01:00
parent dca52b26c4
commit 9f43cbdf61
3 changed files with 45 additions and 13 deletions

View File

@@ -32,7 +32,7 @@
<div class="status-bar"> <div class="status-bar">
<p id="listener-count">0 person tuned in</p> <p id="listener-count">0 person tuned in</p>
<div class="volume-slider-container"> <div id="volume-slider-container">
<output id="current-volume-label" for="volume-slider">100%</output> <output id="current-volume-label" for="volume-slider">100%</output>
<input id="volume-slider" type="range" min="0" max="100" step="1" /> <input id="volume-slider" type="range" min="0" max="100" step="1" />
</div> </div>

View File

@@ -1,6 +1,7 @@
const CROSSFADE_DURATION_MS = 5000; const CROSSFADE_DURATION_MS = 5000;
const CROSSFADE_INTERVAL_MS = 20; const CROSSFADE_INTERVAL_MS = 20;
const AUDIO_DURATION_MS = 60000; const AUDIO_DURATION_MS = 60000;
const SAVE_VOLUME_TIMEOUT_MS = 200;
const playBtn = document.getElementById("play-btn"); const playBtn = document.getElementById("play-btn");
const catImg = document.getElementById("cat"); const catImg = document.getElementById("cat");
@@ -17,6 +18,7 @@ let isFading = false;
let currentAudio; let currentAudio;
let maxVolume = 100; let maxVolume = 100;
let currentVolume = 0; let currentVolume = 0;
let saveVolumeTimeout = null;
let ws = connectToWebSocket(); let ws = connectToWebSocket();
function playAudio() { function playAudio() {
@@ -156,6 +158,37 @@ function connectToWebSocket() {
return ws; return ws;
} }
function changeVolume(volume) {
maxVolume = volume;
const v = maxVolume / 100;
currentVolumeLabel.textContent = `${maxVolume}%`;
if (!isFading && currentAudio) {
currentAudio.volume = v;
currentVolume = maxVolume;
}
clickAudio.volume = v;
clickReleaseAudio.volume = v;
meowAudio.volume = v;
}
function loadInitialVolume() {
const savedVolume = localStorage.getItem("volume");
let volume = 100;
if (savedVolume) {
volume = Number.parseInt(savedVolume);
if (Number.isNaN(volume)) {
volume = 100;
}
}
volumeSlider.value = volume;
changeVolume(volume);
document.getElementById("volume-slider-container").style.display = "flex";
}
playBtn.onmousedown = () => { playBtn.onmousedown = () => {
clickAudio.play(); clickAudio.play();
document.addEventListener( document.addEventListener(
@@ -167,7 +200,6 @@ playBtn.onmousedown = () => {
); );
}; };
// Cat audio sound function
catImg.onmousedown = () => { catImg.onmousedown = () => {
meowAudio.play(); meowAudio.play();
}; };
@@ -181,15 +213,14 @@ playBtn.onclick = () => {
}; };
volumeSlider.oninput = () => { volumeSlider.oninput = () => {
maxVolume = volumeSlider.value; const volume = volumeSlider.value;
currentVolumeLabel.textContent = `${maxVolume}%`; changeVolume(volume);
if (!isFading && currentAudio) { if (saveVolumeTimeout) {
currentAudio.volume = maxVolume / 100; clearTimeout(saveVolumeTimeout);
currentVolume = maxVolume;
} }
clickAudio.volume = volumeSlider.value / 100; saveVolumeTimeout = setTimeout(() => {
clickReleaseAudio.volume = volumeSlider.value / 100; localStorage.setItem("volume", `${volume}`);
meowAudio.volume = volumeSlider.value / 100; }, SAVE_VOLUME_TIMEOUT_MS);
}; };
volumeSlider.value = 100; volumeSlider.value = 100;
@@ -210,5 +241,6 @@ window.addEventListener("online", () => {
ws = connectToWebSocket(); ws = connectToWebSocket();
}); });
loadInitialVolume();
animateCat(); animateCat();
enableSpaceBarControl(); enableSpaceBarControl();

View File

@@ -149,13 +149,13 @@ a {
display: flex; display: flex;
} }
.volume-slider-container { #volume-slider-container {
display: flex; display: none;
justify-content: start; justify-content: start;
align-items: center; align-items: center;
} }
.volume-slider-container > output { #volume-slider-container > output {
color: var(--text); color: var(--text);
margin-right: 1rem; margin-right: 1rem;
} }