import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import axiosInstance from "../api/axiosInstance"; import LoadingSpinner from "../components/LoadingSpinner"; import type { Song, Album, Playlist } from "../utils/types"; import { handleError } from "../utils/error"; interface CollectionView { id: number; title: string; genre?: string; type: string; releasedBy: string; isLikedByCurrentUser?: boolean; songs: Song[]; } const MusicalCollection = () => { const { type, id } = useParams(); const navigate = useNavigate(); const [collection, setCollection] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const normalizeCollection = ( data: Album | Playlist, type: string, ): CollectionView => { if (type === "album") { const album = data as Album; return { id: album.id, title: album.title, genre: album.genre, type: album.type, releasedBy: album.releasedBy, isLikedByCurrentUser: album.isLikedByCurrentUser, songs: album.songs, }; } else { const playlist = data as Playlist; return { id: playlist.id, title: playlist.name, genre: undefined, type: "PLAYLIST", releasedBy: playlist.creatorName, isLikedByCurrentUser: undefined, songs: playlist.songsInPlaylist, }; } }; useEffect(() => { const fetchData = async () => { setIsLoading(true); setError(null); try { const endpoint = type === "album" ? `/albums/${id}` : `/playlists/${id}`; const response = await axiosInstance.get(endpoint); const normalized = normalizeCollection(response.data, type!); setCollection(normalized); } catch (err: any) { setError(handleError(err)); } finally { setIsLoading(false); } }; fetchData(); }, [id, type]); if (isLoading) { return ; } if (error) { return (

Error

{error}

); } if (!collection) return null; return (
{collection.title.charAt(0).toUpperCase()}
{collection.type}

{collection.title}

{collection.releasedBy} {collection.genre && ( <> {collection.genre} )} {collection.songs && ( <> {collection.songs.length} song {collection.songs.length !== 1 ? "s" : ""} )}
{type === "album" && ( )}

Songs

{collection.songs && collection.songs.length > 0 ? (
{collection.songs.map((song, index) => (
{index + 1}

{song.title}

{song.releasedBy}

{song.genre}
))}
) : (

No songs available

)}
); }; export default MusicalCollection;