import Icon from '@/web/components/Icon' import Wave from '@/web/components/Wave' import { openContextMenu } from '@/web/states/contextMenus' import player from '@/web/states/player' import { formatDuration, resizeImage } from '@/web/utils/common' import { State as PlayerState } from '@/web/utils/player' import { css, cx } from '@emotion/css' import { Fragment } from 'react' import { NavLink } from 'react-router-dom' import { useSnapshot } from 'valtio' const Track = ({ track, index, playingTrackID, state, handleClick, }: { track?: Track index: number playingTrackID: number state: PlayerState handleClick: (e: React.MouseEvent, trackID: number) => void }) => { return (
track && handleClick(e, track.id)} onContextMenu={e => track && handleClick(e, track.id)} > {/* Right part */}
{/* Cover */} Cover {/* Track Name and Artists */}
{track?.name} {[1318912, 1310848].includes(track?.mark || 0) && ( )}
{track?.ar.map((a, index) => ( {index > 0 && ', '} {a.name} ))}
{/* Wave icon */} {playingTrackID === track?.id && (
)}
{/* Album Name */}
{track?.al?.name}
{/* Duration */}
{formatDuration(track?.dt || 0, 'en-US', 'hh:mm:ss')}
) } function TrackList({ tracks, onPlay, className, isLoading, placeholderRows = 12, }: { tracks?: Track[] onPlay: (id: number) => void className?: string isLoading?: boolean placeholderRows?: number }) { const { trackID, state } = useSnapshot(player) const playingTrack = tracks?.find(track => track.id === trackID) const handleClick = (e: React.MouseEvent, trackID: number) => { if (isLoading) return if (e.type === 'contextmenu') { e.preventDefault() openContextMenu({ event: e, type: 'track', dataSourceID: trackID, options: { useCursorPosition: true, }, }) return } if (e.detail === 2) onPlay?.(trackID) } return (
{tracks?.map((track, index) => ( ))}
) } export default TrackList