'use client'; import React, { useState, useEffect } from 'react'; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { useNavidrome } from "@/app/components/NavidromeContext"; import { AlbumArtwork } from "@/app/components/album-artwork"; import { ArtistIcon } from "@/app/components/artist-icon"; import { Album, Artist, Song } from "@/lib/navidrome"; import { Heart, Music, Disc, Mic, Play } from "lucide-react"; import { useAudioPlayer, Track } from "@/app/components/AudioPlayerContext"; import Image from "next/image"; const FavoritesPage = () => { const { api, isConnected } = useNavidrome(); const { playTrack, addToQueue } = useAudioPlayer(); const [favoriteAlbums, setFavoriteAlbums] = useState([]); const [favoriteSongs, setFavoriteSongs] = useState([]); const [favoriteArtists, setFavoriteArtists] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const loadFavorites = async () => { if (!api || !isConnected) return; setLoading(true); try { const [albums, songs, artists] = await Promise.all([ api.getAlbums('starred', 100), api.getStarred2(), api.getArtists() ]); setFavoriteAlbums(albums); // Filter starred songs and artists from the starred2 response if (songs.starred2) { setFavoriteSongs(songs.starred2.song || []); setFavoriteArtists((songs.starred2.artist || []).filter((artist: Artist) => artist.starred)); } } catch (error) { console.error('Failed to load favorites:', error); } finally { setLoading(false); } }; loadFavorites(); }, [api, isConnected]); const handlePlaySong = (song: Song) => { playTrack({ id: song.id, name: song.title, artist: song.artist, album: song.album, albumId: song.albumId, artistId: song.artistId, url: api?.getStreamUrl(song.id) || '', duration: song.duration, coverArt: song.coverArt ? api?.getCoverArtUrl(song.coverArt) : undefined, starred: !!song.starred }); }; const handlePlayAlbum = async (album: Album) => { if (!api) return; try { const songs = await api.getAlbumSongs(album.id); if (songs.length > 0) { const tracks = songs.map((song: Song) => ({ id: song.id, name: song.title, artist: song.artist, album: song.album, albumId: song.albumId, artistId: song.artistId, url: api.getStreamUrl(song.id), duration: song.duration, coverArt: song.coverArt ? api.getCoverArtUrl(song.coverArt) : undefined, starred: !!song.starred })); playTrack(tracks[0]); tracks.slice(1).forEach((track: Track) => addToQueue(track)); } } catch (error) { console.error('Failed to play album:', error); } }; const toggleFavorite = async (id: string, type: 'song' | 'album' | 'artist', isStarred: boolean) => { if (!api) return; try { if (isStarred) { await api.unstar(id, type); } else { await api.star(id, type); } // Refresh favorites if (type === 'album') { const albums = await api.getAlbums('starred', 100); setFavoriteAlbums(albums); } else if (type === 'song') { const songs = await api.getStarred2(); setFavoriteSongs(songs.starred2?.song || []); } else if (type === 'artist') { const songs = await api.getStarred2(); setFavoriteArtists((songs.starred2?.artist || []).filter((artist: Artist) => artist.starred)); } } catch (error) { console.error('Failed to toggle favorite:', error); } }; if (!isConnected) { return (

Please connect to your Navidrome server to view favorites.

); } return (

Favorites

Your starred albums, songs, and artists

Albums ({favoriteAlbums.length}) Songs ({favoriteSongs.length}) Artists ({favoriteArtists.length}) {loading ? (

Loading favorite albums...

) : favoriteAlbums.length === 0 ? (

No favorite albums yet

Star albums to see them here

) : (
{favoriteAlbums.map((album) => (
{album.coverArt && api ? ( {album.name} ) : (
)}
handlePlayAlbum(album)}/>

{album.name}

{album.artist}

{album.songCount} songs • {Math.floor(album.duration / 60)} min

))}
)}
{loading ? (

Loading favorite songs...

) : favoriteSongs.length === 0 ? (

No favorite songs yet

Star songs to see them here

) : (
{favoriteSongs.map((song, index) => (
{index + 1}
{song.coverArt && api ? ( {song.album} ) : (
)}

{song.title}

{song.artist}

{song.album}
{Math.floor(song.duration / 60)}:{(song.duration % 60).toString().padStart(2, '0')}
))}
)}
{loading ? (

Loading favorite artists...

) : favoriteArtists.length === 0 ? (

No favorite artists yet

Star artists to see them here

) : (
{favoriteArtists.map((artist) => (
{artist.name}

{artist.name}

{artist.albumCount} albums

))}
)}
); }; export default FavoritesPage;