import { Fragment, memo } from 'react' import { NavLink } from 'react-router-dom' import ArtistInline from '@/components/ArtistsInline' import Skeleton from '@/components/Skeleton' import SvgIcon from '@/components/SvgIcon' import { prefetchAlbum } from '@/hooks/useAlbum' import useUser from '@/hooks/useUser' import useUserLikedSongsIDs from '@/hooks/useUserLikedSongsIDs' import { formatDuration, resizeImage } from '@/utils/common' const Track = memo( ({ track, isLiked = false, isSkeleton = false, isPlaying = false, onClick, }: { track: Track isLiked?: boolean isSkeleton?: boolean isPlaying?: boolean onClick: (e: React.MouseEvent, trackID: number) => void }) => { return (
onClick(e, track.id)} className={classNames( 'group grid w-full rounded-xl after:scale-[.98] after:rounded-xl dark:after:bg-white/[.08]', 'grid-cols-12 p-2 pr-4', !isSkeleton && !isPlaying && 'btn-hover-animation after:bg-gray-100', !isSkeleton && isPlaying && 'bg-brand-100' )} > {/* Track info */}
{/* Cover */}
{isSkeleton ? ( ) : ( )}
{/* Track name & Artists */}
{isSkeleton ? ( PLACEHOLDER12345 ) : (
{track.name}
)}
{isSkeleton ? ( PLACE ) : ( )}
{/* Album name */}
{isSkeleton ? ( PLACEHOLDER1234567890 ) : ( prefetchAlbum({ id: track.al.id })} className="hover:underline" > {track.al.name} )}
{/* Actions & Track duration */}
{/* Like button */} {!isSkeleton && ( )} {/* Track duration */} {isSkeleton ? ( 0:00 ) : (
{formatDuration(track.dt, 'en', 'hh:mm:ss')}
)}
) } ) Track.displayName = 'Track' const TracksList = memo( ({ tracks, isSkeleton = false, onTrackDoubleClick, }: { tracks: Track[] isSkeleton?: boolean onTrackDoubleClick?: (trackID: number) => void }) => { console.debug('Rendering TrackList.tsx TrackList') // Fake data when isLoading is true const skeletonTracks: Track[] = new Array(12).fill({}) // Liked songs ids const { data: user } = useUser() const { data: userLikedSongs } = useUserLikedSongsIDs({ uid: user?.account?.id ?? 0, }) const handleClick = (e: React.MouseEvent, trackID: number) => { if (e.detail === 2) onTrackDoubleClick?.(trackID) } return ( {/* Tracks table header */}
TITLE
ALBUM
TIME
{/* Tracks */} {!isSkeleton && tracks.map(track => ( ))} {isSkeleton && skeletonTracks.map((track, index) => ( null} isSkeleton={true} /> ))}
) } ) TracksList.displayName = 'TracksList' export default TracksList