import { HeartFillIcon, HeartIcon } from '@primer/octicons-react' import { useEffect } from 'react' import { Link, useParams } from 'react-router-dom' import { MediaItem } from '../api/jellyfin' import { JellyImg } from '../components/JellyImg' import { Loader } from '../components/Loader' import { Squircle } from '../components/Squircle' import { MoreIcon } from '../components/SvgIcons' import { TrackList } from '../components/TrackList' import { useDropdownContext } from '../context/DropdownContext/DropdownContext' import { usePageTitle } from '../context/PageTitleContext/PageTitleContext' import { usePlaybackContext } from '../context/PlaybackContext/PlaybackContext' import { useJellyfinAlbumData } from '../hooks/Jellyfin/useJellyfinAlbumData' import { useFavorites } from '../hooks/useFavorites' import { formatDate } from '../utils/formatDate' import { formatDurationReadable } from '../utils/formatDurationReadable' import './Album.css' export const Album = () => { const playback = usePlaybackContext() const { albumId } = useParams<{ albumId: string }>() const { album, tracks, discCount, loading, error } = useJellyfinAlbumData(albumId!) const { setPageTitle } = usePageTitle() const { isOpen, selectedItem, onContextMenu } = useDropdownContext() const { addToFavorites, removeFromFavorites } = useFavorites() useEffect(() => { if (album) { setPageTitle(album.Name) } return () => { setPageTitle('') } }, [album, setPageTitle]) const totalPlaytime = tracks.reduce((total, track) => total + (track.RunTimeTicks || 0), 0) if (loading) { return } if (error || !album) { return
{error || 'Album not found'}
} const totalPlays = tracks.reduce((total, track) => total + (track.UserData?.PlayCount || 0), 0) const trackCount = album.ChildCount || tracks.length const tracksByDisc = tracks.reduce((acc, track) => { const discNumber = track.ParentIndexNumber || 1 if (!acc[discNumber]) { acc[discNumber] = [] } acc[discNumber].push(track) return acc }, {} as Record) const sortedTracks = Object.keys(tracksByDisc) .sort((a, b) => Number(a) - Number(b)) .flatMap(discNumber => tracksByDisc[Number(discNumber)].sort((a, b) => (a.IndexNumber || 0) - (b.IndexNumber || 0)) ) const handleMoreClick = (e: React.MouseEvent) => { e.stopPropagation() onContextMenu(e, { item: album }, true, { add_to_favorite: true, remove_from_favorite: true }) } return (
{album.AlbumArtists && album.AlbumArtists.length > 0 ? ( {album.AlbumArtist || 'Unknown Artist'} ) : ( album.AlbumArtist || 'Unknown Artist' )}
{formatDate(album.PremiereDate)}
{trackCount}{' '} {trackCount === 1 ? 'Track' : 'Tracks'}
{formatDurationReadable(totalPlaytime)} Total
{totalPlays > 0 && ( <>
{totalPlays} {totalPlays === 1 ? 'Play' : 'Plays'}
)}
{ playback.setCurrentPlaylistSimple({ playlist: sortedTracks, title: album.Name }) playback.playTrack(0) }} >
Play
{ if (album?.Id) { try { if (album.UserData?.IsFavorite) { await removeFromFavorites(album) } else { await addToFavorites(album) } } catch (error) { console.error('Failed to update favorite status:', error) } } }} > {album.UserData?.IsFavorite ? : }
{Object.keys(tracksByDisc) .sort((a, b) => Number(a) - Number(b)) .map((discNumber, index) => (
{discCount > 1 &&
Disc {discNumber}
}
))}
) }