import { HeartFillIcon } from '@primer/octicons-react'
import { MediaItem } from '../api/jellyfin'
import { useDropdownContext } from '../context/DropdownContext/DropdownContext'
import { IMenuItems } from '../context/DropdownContext/DropdownContextProvider'
import { usePlaybackContext } from '../context/PlaybackContext/PlaybackContext'
import { formatDuration } from '../utils/formatDuration'
import { DeletingIcon, DownloadedIcon, DownloadingIcon, PlaystateAnimationTracklist } from './SvgIcons'
import './TrackList.css'
export const TrackList = ({
tracks,
playlistItems,
showAlbum = false,
title,
hidden = {},
}: {
tracks: MediaItem[]
playlistItems?: MediaItem[]
showAlbum?: boolean
title: string
hidden?: IMenuItems
}) => {
const playback = usePlaybackContext()
const MIN_PLAY_COUNT = 5
const mostPlayedTracks = tracks
.map(track => ({
...track,
playCount: track.UserData?.PlayCount || 0,
}))
.filter(track => track.playCount >= MIN_PLAY_COUNT)
.sort((a, b) => b.playCount - a.playCount)
.slice(0, 3)
.map(track => track.Id)
const dropdown = useDropdownContext()
return (
{tracks.map((track, index) => {
const isCurrentTrack = playback.currentTrack?.Id === track.Id
const isMostPlayed = mostPlayedTracks.includes(track.Id)
const isActive = dropdown.selectedItem?.Id === track.Id && dropdown.isOpen
const itemClass = [
isCurrentTrack ? (playback.isPlaying ? 'playing' : 'paused') : '',
isMostPlayed ? 'most-played' : '',
isActive ? 'active' : '',
]
.filter(Boolean)
.join(' ')
return (
- {
if (isCurrentTrack) {
playback.togglePlayPause()
} else {
playback.setCurrentPlaylistSimple({ playlist: playlistItems || tracks || [], title })
const playIndex = playlistItems
? playlistItems.findIndex(t => t.Id === track.Id)
: index
playback.playTrack(playIndex)
}
}}
onContextMenu={e => dropdown.onContextMenu(e, { item: track }, false, hidden)}
onTouchStart={e => dropdown.onTouchStart(e, { item: track }, false, hidden)}
onTouchMove={dropdown.onTouchClear}
onTouchEnd={dropdown.onTouchClear}
>
{showAlbum ? (
{track.Album || 'Unknown Album'}
) : (
{track.Artists && track.Artists.length > 0
? track.Artists.join(', ')
: 'Unknown Artist'}
)}
{track.offlineState && (
{track.offlineState === 'downloading' && (
)}
{track.offlineState === 'downloaded' && (
)}
{track.offlineState === 'deleting' && (
)}
)}
{track.UserData?.IsFavorite && (
)}
{formatDuration(track.RunTimeTicks)}
)
})}
)
}