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 useUser from '@/hooks/useUser' import useUserLikedSongsIDs from '@/hooks/useUserLikedSongsIDs' import { formatDuration, resizeImage } from '@/utils/common' import { player } from '@/store' const Track = memo( ({ track, isLiked = false, isSkeleton = false, isPlaying = false, subtitle = undefined, onClick, }: { track: Track isLiked?: boolean isSkeleton?: boolean isPlaying?: boolean subtitle?: string 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 ', 'grid-cols-12 p-2 pr-4', !isSkeleton && !isPlaying && 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/10', !isSkeleton && isPlaying && 'bg-brand-50 dark:bg-gray-800' )} > {/* Track info */}
{/* Cover */}
{isSkeleton ? ( ) : ( )}
{/* Track name & Artists */}
{isSkeleton ? ( PLACEHOLDER12345 ) : (
{track.name} {subtitle && ( ({subtitle}) )}
)}
{isSkeleton ? ( PLACE ) : ( {track.mark === 1318912 && ( )} )}
{/* Album name */}
{isSkeleton ? ( PLACEHOLDER1234567890 ) : ( {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) } const playerSnapshot = useSnapshot(player) const playingTrack = useMemo( () => playerSnapshot.track, [playerSnapshot.track] ) return ( {/* Tracks table header */}
标题
专辑
时长
{/* Tracks */} {isSkeleton ? skeletonTracks.map((track, index) => ( null} isSkeleton={true} /> )) : tracks.map(track => ( ))}
) } ) TracksList.displayName = 'TracksList' export default TracksList