import { useEffect, useState } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { libraryService } from '../services/library'; import { usePlayer } from '../context/PlayerContext'; import { Play } from 'lucide-react'; import { Track } from '../types'; import CoverImage from './CoverImage'; interface RecommendationData { tracks: Track[]; albums: Array<{ id: string; title: string; artist: string; cover_url: string }>; playlists: Array<{ id: string; title: string; cover_url: string; track_count: number }>; artists: Array<{ id: string; name: string; photo_url: string; cover_url?: string }>; } interface RecommendationsProps { seed: string; seedType?: string; limit?: number; title?: string; showTracks?: boolean; showAlbums?: boolean; showPlaylists?: boolean; showArtists?: boolean; } export default function Recommendations({ seed, seedType = 'track', limit = 10, title = 'You might also like', showTracks = true, showAlbums = true, showPlaylists = true, showArtists = true }: RecommendationsProps) { const navigate = useNavigate(); const { playTrack } = usePlayer(); const [data, setData] = useState({ tracks: [], albums: [], playlists: [], artists: [] }); const [loading, setLoading] = useState(false); useEffect(() => { if (!seed) return; const fetchRecommendations = async () => { try { const result = await libraryService.getRelatedContent(seed, seedType, limit); const artistsWithPhotos = await Promise.all( result.artists.map(async (artist) => { try { const tracks = await libraryService.search(artist.name); if (tracks.length > 0) { return { ...artist, cover_url: tracks[0].cover_url }; } } catch (e) {} try { const info = await libraryService.getArtistInfo(artist.name); if (info.photo) { return { ...artist, cover_url: info.photo }; } } catch (e) {} return artist; }) ); setData({ ...result, artists: artistsWithPhotos }); } catch (error) { console.error('Failed to fetch recommendations:', error); } }; fetchRecommendations(); }, [seed, seedType, limit]); const hasContent = (showTracks && data.tracks.length > 0) || (showAlbums && data.albums.length > 0) || (showPlaylists && data.playlists.length > 0) || (showArtists && data.artists.length > 0); const hasAnyContent = hasContent || loading; if (!hasAnyContent) return null; const isLoading = !hasContent; return (

{title}

{isLoading && (
{[1, 2, 3, 4, 5].map(i => (
))}
)}
{/* Tracks */} {showTracks && data.tracks.slice(0, 8).map((track) => (
playTrack(track, data.tracks)} >

{track.title}

{track.artist}

))} {/* Albums */} {showAlbums && data.albums.slice(0, 8).map((album) => (

{album.title}

{album.artist}

))} {/* Playlists */} {showPlaylists && data.playlists.slice(0, 8).map((playlist) => (

{playlist.title}

{playlist.track_count} songs

))} {/* Artists */} {showArtists && data.artists.slice(0, 8).map((artist) => (

{artist.name}

Artist

))}
); }