import React, { useEffect, useState } from 'react'; import AlbumRow from '../components/AlbumRow'; import ArtistRow from '../components/ArtistRow'; import { getStarred, SubsonicAlbum, SubsonicArtist, SubsonicSong } from '../api/subsonic'; import { usePlayerStore } from '../store/playerStore'; import { Play, ListPlus } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; export default function Favorites() { const { t } = useTranslation(); const [albums, setAlbums] = useState([]); const [artists, setArtists] = useState([]); const [songs, setSongs] = useState([]); const [loading, setLoading] = useState(true); const { playTrack, enqueue } = usePlayerStore(); const openContextMenu = usePlayerStore(s => s.openContextMenu); const navigate = useNavigate(); useEffect(() => { getStarred() .then(res => { setAlbums(res.albums); setArtists(res.artists); setSongs(res.songs); setLoading(false); }) .catch(() => setLoading(false)); }, []); if (loading) { return (
); } const hasAnyFavorites = albums.length > 0 || artists.length > 0 || songs.length > 0; return (

{t('favorites.title')}

{!hasAnyFavorites ? (
{t('favorites.empty')}
) : ( <> {artists.length > 0 && ( )} {albums.length > 0 && ( )} {songs.length > 0 && (

{t('favorites.songs')}

#
{t('albumDetail.trackTitle')}
{t('albumDetail.trackArtist')}
{t('albumDetail.trackDuration')}
{songs.map((song, i) => { const track = { id: song.id, title: song.title, artist: song.artist, album: song.album, albumId: song.albumId, artistId: song.artistId, duration: song.duration, coverArt: song.coverArt, track: song.track, year: song.year, bitRate: song.bitRate, suffix: song.suffix, userRating: song.userRating, starred: song.starred, genre: song.genre, }; return (
playTrack(song, songs)} onContextMenu={e => { e.preventDefault(); openContextMenu(e.clientX, e.clientY, track, 'song'); }} role="row" draggable onDragStart={e => { e.dataTransfer.effectAllowed = 'copy'; e.dataTransfer.setData('text/plain', JSON.stringify({ type: 'song', track })); }} >
playTrack(song, songs)} style={{ cursor: 'pointer' }}> {i + 1}
{song.title}
song.artistId && navigate(`/artist/${song.artistId}`)} >{song.artist}
{Math.floor(song.duration / 60)}:{(song.duration % 60).toString().padStart(2, '0')}
); })}
)} )}
); }