85 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-06-25 13:47:07 +08:00
import { resizeImage } from '@/web/utils/common'
2022-07-11 11:06:41 +08:00
import player from '@/web/states/player'
2022-06-25 13:47:07 +08:00
import { State as PlayerState } from '@/web/utils/player'
import useTracks from '@/web/api/hooks/useTracks'
import { css, cx } from '@emotion/css'
import Image from '@/web/components/New/Image'
2022-08-22 16:51:23 +08:00
import useArtist from '@/web/api/hooks/useArtist'
import { useParams } from 'react-router-dom'
2022-06-25 13:47:07 +08:00
const Track = ({
track,
isPlaying,
onPlay,
}: {
track?: Track
isPlaying?: boolean
onPlay: (id: number) => void
}) => {
return (
<div
className='flex items-center justify-between'
onClick={e => {
if (e.detail === 2 && track?.id) onPlay(track.id)
}}
>
{/* Cover */}
<Image
className='mr-4 aspect-square h-14 w-14 flex-shrink-0 rounded-12'
src={resizeImage(track?.al?.picUrl || '', 'sm')}
animation={false}
placeholder={false}
/>
{/* Track info */}
<div className='mr-3 flex-grow'>
<div
className={cx(
'line-clamp-1 text-16 font-medium ',
isPlaying
? 'text-brand-700'
: 'text-neutral-700 dark:text-neutral-200'
)}
>
{track?.name}
</div>
<div className='line-clamp-1 mt-1 text-14 font-bold text-neutral-200 dark:text-neutral-700'>
{track?.ar.map(a => a.name).join(', ')}
</div>
</div>
</div>
)
}
2022-08-22 16:51:23 +08:00
const Popular = () => {
const params = useParams()
const { data: artist, isLoading: isLoadingArtist } = useArtist({
id: Number(params.id) || 0,
})
const tracks = artist?.hotSongs || []
2022-06-25 13:47:07 +08:00
const onPlay = (id: number) => {
if (!tracks) return
player.playAList(
tracks.map(t => t.id),
id
)
}
return (
<div>
<div className='mb-4 text-12 font-medium uppercase text-neutral-300'>
Popular
</div>
<div className='grid grid-cols-3 grid-rows-3 gap-4 overflow-hidden'>
{tracks?.slice(0, 9)?.map(t => (
<Track key={t.id} track={t} onPlay={onPlay} />
))}
</div>
</div>
)
}
export default Popular