mirror of
https://github.com/markuryy/shark.git
synced 2025-12-12 11:41:02 +00:00
refactor(ui): housekeeping
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ function createPlaybackStore(): PlaybackStore {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
subscribe,
|
subscribe,
|
||||||
|
set,
|
||||||
|
update,
|
||||||
|
|
||||||
// Queue management
|
// Queue management
|
||||||
playTrack(track: Track) {
|
playTrack(track: Track) {
|
||||||
|
|||||||
@@ -98,24 +98,29 @@
|
|||||||
// 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) {
|
||||||
// Fetch album data from API to get cover
|
// Get the track ID - handle both DeezerTrack (has 'id') and DeezerPlaylistTrack (has 'track_id')
|
||||||
try {
|
const trackId = 'track_id' in cachedTracks[0] ? cachedTracks[0].track_id : cachedTracks[0].id;
|
||||||
deezerAPI.setArl($deezerAuth.arl);
|
|
||||||
const trackData = await deezerAPI.getTrackData(cachedTracks[0].track_id);
|
|
||||||
if (trackData && trackData.ALB_PICTURE) {
|
|
||||||
const albumCoverUrl = `https://e-cdns-images.dzcdn.net/images/cover/${trackData.ALB_PICTURE}/500x500-000000-80-0-0.jpg`;
|
|
||||||
playlistPicture = albumCoverUrl;
|
|
||||||
|
|
||||||
// Update cache with the album picture
|
if (trackId) {
|
||||||
const database = await import('$lib/library/deezer-database').then(m => m.initDeezerDatabase());
|
// Fetch album data from API to get cover
|
||||||
await database.execute(
|
try {
|
||||||
'UPDATE deezer_playlist_tracks SET album_picture = $1 WHERE track_id = $2',
|
deezerAPI.setArl($deezerAuth.arl);
|
||||||
[albumCoverUrl, cachedTracks[0].track_id]
|
const trackData = await deezerAPI.getTrack(trackId);
|
||||||
);
|
if (trackData && trackData.ALB_PICTURE) {
|
||||||
|
const albumCoverUrl = `https://e-cdns-images.dzcdn.net/images/cover/${trackData.ALB_PICTURE}/500x500-000000-80-0-0.jpg`;
|
||||||
|
playlistPicture = albumCoverUrl;
|
||||||
|
|
||||||
|
// Update cache with the album picture
|
||||||
|
const database = await import('$lib/library/deezer-database').then(m => m.initDeezerDatabase());
|
||||||
|
await database.execute(
|
||||||
|
'UPDATE deezer_playlist_tracks SET album_picture = $1 WHERE track_id = $2',
|
||||||
|
[albumCoverUrl, trackId]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Failed to fetch album cover:', err);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
|
||||||
console.error('Failed to fetch album cover:', err);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user