import ArtistInline from '@/web/components/ArtistsInline' import Skeleton from '@/web/components/Skeleton' import { player } from '@/web/store' import { resizeImage } from '@/web/utils/common' import Icon from './Icon' import { cx } from '@emotion/css' import { useMemo } from 'react' import { useSnapshot } from 'valtio' const Track = ({ track, isSkeleton = false, isHighlight = false, onClick, }: { track: Track isSkeleton?: boolean isHighlight?: boolean onClick: (e: React.MouseEvent, trackID: number) => void }) => { return (
onClick(e, track.id)} className={cx( 'group grid w-full rounded-xl after:scale-[.98] after:rounded-xl ', 'grid-cols-1 py-1.5 px-2', !isSkeleton && { 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/10': !isHighlight, 'bg-brand-50 dark:bg-gray-800': isHighlight, } )} >
{/* Cover */}
{isSkeleton ? ( ) : ( )}
{/* Track name & Artists */}
{isSkeleton ? ( PLACEHOLDER12345 ) : (
{track.name}
)}
{isSkeleton ? ( PLACE ) : ( {track.mark === 1318912 && ( )} )}
) } const TrackGrid = ({ tracks, isSkeleton = false, onTrackDoubleClick, cols = 2, }: { tracks: Track[] isSkeleton?: boolean onTrackDoubleClick?: (trackID: number) => void cols?: number }) => { 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.map((track, index) => ( ))}
) } export default TrackGrid