refactor(ui): housekeeping

This commit is contained in:
2025-10-04 16:21:33 -04:00
parent 8b3989e71f
commit e535fdb4bc
5 changed files with 46 additions and 19 deletions

View File

@@ -48,6 +48,13 @@
onClose(); onClose();
} }
} }
function handleKeyDown(e: KeyboardEvent, item: MenuItem) {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
handleItemClick(item);
}
}
</script> </script>
<div <div
@@ -61,6 +68,8 @@
role="menuitem" role="menuitem"
class:disabled={item.disabled} class:disabled={item.disabled}
onclick={() => handleItemClick(item)} onclick={() => handleItemClick(item)}
onkeydown={(e) => handleKeyDown(e, item)}
tabindex="0"
> >
{item.label} {item.label}
</li> </li>

View File

@@ -4,6 +4,14 @@
import LyricsDisplay from '$lib/components/LyricsDisplay.svelte'; import LyricsDisplay from '$lib/components/LyricsDisplay.svelte';
import TriangleVolumeSlider from '$lib/components/TriangleVolumeSlider.svelte'; import TriangleVolumeSlider from '$lib/components/TriangleVolumeSlider.svelte';
// Local volume state that syncs with the store
let volume = $state($playback.volume);
// Sync local volume with store volume
$effect(() => {
volume = $playback.volume;
});
function handlePlayPause() { function handlePlayPause() {
playback.togglePlayPause(); playback.togglePlayPause();
} }
@@ -23,8 +31,8 @@
playback.setCurrentTime(time); playback.setCurrentTime(time);
} }
function handleVolumeChange(volume: number) { function handleVolumeChange(newVolume: number) {
playback.setVolume(volume); playback.setVolume(newVolume);
} }
function formatTime(seconds: number): string { function formatTime(seconds: number): string {
@@ -127,7 +135,7 @@
</div> </div>
<div class="volume-section"> <div class="volume-section">
<TriangleVolumeSlider bind:value={$playback.volume} onchange={handleVolumeChange} /> <TriangleVolumeSlider bind:value={volume} onchange={handleVolumeChange} />
</div> </div>
</div> </div>
</div> </div>

View File

@@ -148,6 +148,9 @@
bind:this={volumeThumb} bind:this={volumeThumb}
onmousedown={handleThumbMouseDown} onmousedown={handleThumbMouseDown}
ontouchstart={handleThumbTouchStart} ontouchstart={handleThumbTouchStart}
role="button"
tabindex="-1"
aria-label="Volume slider thumb"
> >
<div class="volume-thumb-inner"></div> <div class="volume-thumb-inner"></div>
</div> </div>

View File

@@ -46,6 +46,8 @@ function createPlaybackStore(): PlaybackStore {
return { return {
subscribe, subscribe,
set,
update,
// Queue management // Queue management
playTrack(track: Track) { playTrack(track: Track) {

View File

@@ -98,11 +98,15 @@
// If we have cached album picture, use it // If we have cached album picture, use it
if (cachedTracks[0].album_picture) { if (cachedTracks[0].album_picture) {
playlistPicture = cachedTracks[0].album_picture; playlistPicture = cachedTracks[0].album_picture;
} else if ($deezerAuth.arl && cachedTracks[0].track_id) { } else if ($deezerAuth.arl) {
// Get the track ID - handle both DeezerTrack (has 'id') and DeezerPlaylistTrack (has 'track_id')
const trackId = 'track_id' in cachedTracks[0] ? cachedTracks[0].track_id : cachedTracks[0].id;
if (trackId) {
// Fetch album data from API to get cover // Fetch album data from API to get cover
try { try {
deezerAPI.setArl($deezerAuth.arl); deezerAPI.setArl($deezerAuth.arl);
const trackData = await deezerAPI.getTrackData(cachedTracks[0].track_id); const trackData = await deezerAPI.getTrack(trackId);
if (trackData && trackData.ALB_PICTURE) { if (trackData && trackData.ALB_PICTURE) {
const albumCoverUrl = `https://e-cdns-images.dzcdn.net/images/cover/${trackData.ALB_PICTURE}/500x500-000000-80-0-0.jpg`; const albumCoverUrl = `https://e-cdns-images.dzcdn.net/images/cover/${trackData.ALB_PICTURE}/500x500-000000-80-0-0.jpg`;
playlistPicture = albumCoverUrl; playlistPicture = albumCoverUrl;
@@ -111,7 +115,7 @@
const database = await import('$lib/library/deezer-database').then(m => m.initDeezerDatabase()); const database = await import('$lib/library/deezer-database').then(m => m.initDeezerDatabase());
await database.execute( await database.execute(
'UPDATE deezer_playlist_tracks SET album_picture = $1 WHERE track_id = $2', 'UPDATE deezer_playlist_tracks SET album_picture = $1 WHERE track_id = $2',
[albumCoverUrl, cachedTracks[0].track_id] [albumCoverUrl, trackId]
); );
} }
} catch (err) { } catch (err) {
@@ -119,6 +123,7 @@
} }
} }
} }
}
// Final fallback to local files // Final fallback to local files
if ((!playlistPicture || !playlistPicture.startsWith('http')) && $settings.musicFolder) { if ((!playlistPicture || !playlistPicture.startsWith('http')) && $settings.musicFolder) {