diff --git a/packages/renderer/src/components/ArtistsInline.tsx b/packages/renderer/src/components/ArtistsInline.tsx index 9f725d7..333ec69 100644 --- a/packages/renderer/src/components/ArtistsInline.tsx +++ b/packages/renderer/src/components/ArtistsInline.tsx @@ -11,7 +11,9 @@ const ArtistInline = ({
{artists.map((artist, index) => ( - {artist.name} + + {artist.name} + {index < artists.length - 1 ? ', ' : ''}  ))} diff --git a/packages/renderer/src/components/TracksAlbum.tsx b/packages/renderer/src/components/TracksAlbum.tsx index 1c8ce57..1ea52fd 100644 --- a/packages/renderer/src/components/TracksAlbum.tsx +++ b/packages/renderer/src/components/TracksAlbum.tsx @@ -49,12 +49,14 @@ const Track = memo( isLiked = false, isSkeleton = false, isHighlight = false, + subtitle = undefined, onClick, }: { track: Track isLiked?: boolean isSkeleton?: boolean isHighlight?: boolean + subtitle?: string onClick: (e: React.MouseEvent, trackID: number) => void }) => { if (enableRenderLog) @@ -113,7 +115,17 @@ const Track = memo( isHighlight ? 'text-brand-500' : 'text-black dark:text-white' )} > - {track.name} + {track.name} + {subtitle && ( + + ({subtitle}) + + )}
)} @@ -238,6 +250,7 @@ const TracksAlbum = ({ isLiked={userLikedSongs?.ids?.includes(track.id) ?? false} isSkeleton={false} isHighlight={track.id === playingTrack?.id} + subtitle={track.tns?.at(0) ?? track.alia?.at(0)} /> ))} diff --git a/packages/renderer/src/components/TracksList.tsx b/packages/renderer/src/components/TracksList.tsx index 1a332f1..67b5d88 100644 --- a/packages/renderer/src/components/TracksList.tsx +++ b/packages/renderer/src/components/TracksList.tsx @@ -7,6 +7,7 @@ import { prefetchAlbum } from '@/hooks/useAlbum' import useUser from '@/hooks/useUser' import useUserLikedSongsIDs from '@/hooks/useUserLikedSongsIDs' import { formatDuration, resizeImage } from '@/utils/common' +import { player } from '@/store' const Track = memo( ({ @@ -14,12 +15,14 @@ const Track = memo( 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 ( @@ -28,8 +31,8 @@ const Track = memo( 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' + !isSkeleton && !isPlaying && 'btn-hover-animation after:bg-gray-100 dark:after:bg-white/[.08]', + !isSkeleton && isPlaying && 'bg-brand-100 dark:bg-gray-800' )} > {/* Track info */} @@ -51,12 +54,33 @@ const Track = memo( {isSkeleton ? ( PLACEHOLDER12345 ) : ( -
- {track.name} +
+ {track.name} + {subtitle && ( + + ({subtitle}) + + )}
)} -
+
{isSkeleton ? ( PLACE ) : ( @@ -75,7 +99,10 @@ const Track = memo( prefetchAlbum({ id: track.al.id })} - className='hover:underline' + className={classNames( + 'hover:underline', + isPlaying && 'text-brand-500' + )} > {track.al.name} @@ -107,7 +134,12 @@ const Track = memo( {isSkeleton ? ( 0:00 ) : ( -
+
{formatDuration(track.dt, 'en', 'hh:mm:ss')}
)} @@ -143,6 +175,12 @@ const TracksList = memo( if (e.detail === 2) onTrackDoubleClick?.(trackID) } + const playerSnapshot = useSnapshot(player) + const playingTrack = useMemo( + () => playerSnapshot.track, + [playerSnapshot.track] + ) + return ( {/* Tracks table header */} @@ -157,25 +195,26 @@ const TracksList = memo(
{/* Tracks */} - {!isSkeleton && - tracks.map(track => ( - - ))} - {isSkeleton && - skeletonTracks.map((track, index) => ( - null} - isSkeleton={true} - /> - ))} + {isSkeleton + ? skeletonTracks.map((track, index) => ( + null} + isSkeleton={true} + /> + )) + : tracks.map(track => ( + + ))}
) diff --git a/packages/renderer/src/interface.d.ts b/packages/renderer/src/interface.d.ts index 90f9944..1afc752 100644 --- a/packages/renderer/src/interface.d.ts +++ b/packages/renderer/src/interface.d.ts @@ -111,6 +111,7 @@ declare interface Track { tagPicList: null v: number version: number + tns: (string | null)[] } declare interface Artist { alias: unknown[]