'use client'; import Image from 'next/image'; import { Song } from '@/lib/navidrome'; import { useAudioPlayer } from '@/app/components/AudioPlayerContext'; import { Button } from '@/components/ui/button'; import { Play, Heart } from 'lucide-react'; import { useState } from 'react'; import { useNavidrome } from '@/app/components/NavidromeContext'; import { getNavidromeAPI } from '@/lib/navidrome'; interface PopularSongsProps { songs: Song[]; artistName: string; } export function PopularSongs({ songs, artistName }: PopularSongsProps) { const { playTrack } = useAudioPlayer(); const { starItem, unstarItem } = useNavidrome(); const [songStates, setSongStates] = useState>(() => { const initial: Record = {}; songs.forEach(song => { initial[song.id] = !!song.starred; }); return initial; }); const api = getNavidromeAPI(); const songToTrack = (song: Song) => { if (!api) { throw new Error('Navidrome API not configured'); } return { id: song.id, name: song.title, url: api.getStreamUrl(song.id), artist: song.artist, album: song.album, duration: song.duration, coverArt: song.coverArt ? api.getCoverArtUrl(song.coverArt, 1200) : undefined, albumId: song.albumId, artistId: song.artistId, starred: !!song.starred }; }; const handlePlaySong = async (song: Song) => { try { const track = songToTrack(song); playTrack(track, true); } catch (error) { console.error('Failed to play song:', error); } }; const handleToggleStar = async (song: Song) => { try { const isStarred = songStates[song.id]; if (isStarred) { await unstarItem(song.id, 'song'); setSongStates(prev => ({ ...prev, [song.id]: false })); } else { await starItem(song.id, 'song'); setSongStates(prev => ({ ...prev, [song.id]: true })); } } catch (error) { console.error('Failed to star/unstar song:', error); } }; const formatDuration = (seconds: number): string => { const minutes = Math.floor(seconds / 60); const remainingSeconds = seconds % 60; return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`; }; if (songs.length === 0) { return null; } return (

Popular Songs

{songs.map((song, index) => (
{/* Rank */}
{index + 1}
{/* Album Art */}
{song.coverArt && api && ( {song.album} )}
{/* Song Info */}
{song.title}
{song.album}
{/* Play Count */} {song.playCount && song.playCount > 0 && (
{song.playCount.toLocaleString()} plays
)} {/* Duration */}
{formatDuration(song.duration)}
{/* Star Button */}
))}
); }