diff --git a/web/index.html b/web/index.html index f08474a..1ceb0e7 100644 --- a/web/index.html +++ b/web/index.html @@ -32,7 +32,7 @@

0 person tuned in

-
+
100%
diff --git a/web/script.js b/web/script.js index e349e6f..f931f58 100644 --- a/web/script.js +++ b/web/script.js @@ -1,6 +1,7 @@ const CROSSFADE_DURATION_MS = 5000; const CROSSFADE_INTERVAL_MS = 20; const AUDIO_DURATION_MS = 60000; +const SAVE_VOLUME_TIMEOUT_MS = 200; const playBtn = document.getElementById("play-btn"); const catImg = document.getElementById("cat"); @@ -17,6 +18,7 @@ let isFading = false; let currentAudio; let maxVolume = 100; let currentVolume = 0; +let saveVolumeTimeout = null; let ws = connectToWebSocket(); function playAudio() { @@ -156,6 +158,37 @@ function connectToWebSocket() { 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 = () => { clickAudio.play(); document.addEventListener( @@ -167,7 +200,6 @@ playBtn.onmousedown = () => { ); }; -// Cat audio sound function catImg.onmousedown = () => { meowAudio.play(); }; @@ -181,15 +213,14 @@ playBtn.onclick = () => { }; volumeSlider.oninput = () => { - maxVolume = volumeSlider.value; - currentVolumeLabel.textContent = `${maxVolume}%`; - if (!isFading && currentAudio) { - currentAudio.volume = maxVolume / 100; - currentVolume = maxVolume; + const volume = volumeSlider.value; + changeVolume(volume); + if (saveVolumeTimeout) { + clearTimeout(saveVolumeTimeout); } - clickAudio.volume = volumeSlider.value / 100; - clickReleaseAudio.volume = volumeSlider.value / 100; - meowAudio.volume = volumeSlider.value / 100; + saveVolumeTimeout = setTimeout(() => { + localStorage.setItem("volume", `${volume}`); + }, SAVE_VOLUME_TIMEOUT_MS); }; volumeSlider.value = 100; @@ -210,5 +241,6 @@ window.addEventListener("online", () => { ws = connectToWebSocket(); }); +loadInitialVolume(); animateCat(); enableSpaceBarControl(); diff --git a/web/style.css b/web/style.css index 9385fe0..c9383c1 100644 --- a/web/style.css +++ b/web/style.css @@ -149,13 +149,13 @@ a { display: flex; } -.volume-slider-container { - display: flex; +#volume-slider-container { + display: none; justify-content: start; align-items: center; } -.volume-slider-container > output { +#volume-slider-container > output { color: var(--text); margin-right: 1rem; }