126 lines
3.7 KiB
TypeScript
Raw Normal View History

2022-06-25 13:47:07 +08:00
import { resizeImage } from '@/web/utils/common'
import dayjs from 'dayjs'
import { cx, css } from '@emotion/css'
import { useNavigate, useParams } from 'react-router-dom'
2022-10-28 20:29:04 +08:00
import Image from '@/web/components/Image'
2022-06-25 13:47:07 +08:00
import useArtistAlbums from '@/web/api/hooks/useArtistAlbums'
import { useMemo } from 'react'
2022-08-03 23:48:39 +08:00
import useArtistMV from '@/web/api/hooks/useArtistMV'
2022-08-22 16:51:23 +08:00
import { motion } from 'framer-motion'
2022-10-28 20:29:04 +08:00
import { useTranslation } from 'react-i18next'
2022-06-25 13:47:07 +08:00
2022-08-22 16:51:23 +08:00
const Album = ({ album }: { album?: Album }) => {
2022-06-25 13:47:07 +08:00
const navigate = useNavigate()
if (!album) {
return <></>
}
return (
<div
onClick={() => navigate(`/album/${album.id}`)}
2022-08-22 16:51:23 +08:00
className='group flex rounded-24 bg-white/10 p-2.5 transition-colors duration-400 hover:bg-white/20'
2022-06-25 13:47:07 +08:00
>
<Image
src={resizeImage(album.picUrl, 'sm')}
className={cx(
2022-06-30 00:02:21 +08:00
'aspect-square shrink-0',
2022-06-25 13:47:07 +08:00
css`
height: 60px;
width: 60px;
border-radius: 16px;
`
)}
/>
2022-07-11 11:06:41 +08:00
<div className='flex-shrink-1 ml-2'>
2022-08-22 16:51:23 +08:00
<div className='line-clamp-1 text-16 font-medium text-night-100 transition-colors duration-400 group-hover:text-night-50'>
2022-06-25 13:47:07 +08:00
{album.name}
</div>
2022-08-22 16:51:23 +08:00
<div className='mt-1 text-14 font-bold text-night-500 transition-colors duration-400 group-hover:text-night-200'>
2022-06-25 13:47:07 +08:00
{album.type}
{album.size > 1 ? `· ${album.size} Tracks` : ''}
</div>
2022-08-22 16:51:23 +08:00
<div className='mt-1.5 text-12 font-medium text-night-500 transition-colors duration-400 group-hover:text-night-200'>
2022-06-25 13:47:07 +08:00
{dayjs(album?.publishTime || 0).format('MMM DD, YYYY')}
</div>
</div>
</div>
)
}
2022-08-22 16:51:23 +08:00
const Video = ({ video }: { video?: any }) => {
2022-08-03 23:48:39 +08:00
const navigate = useNavigate()
2022-06-25 13:47:07 +08:00
return (
2022-08-03 23:48:39 +08:00
<>
{video && (
<div
2022-08-22 16:51:23 +08:00
className='group mt-4 flex rounded-24 bg-white/10 p-2.5 transition-colors duration-400 hover:bg-white/20'
2022-08-03 23:48:39 +08:00
onClick={() => navigate(`/mv/${video.id}`)}
>
<img
src={video.imgurl16v9}
className={cx(
'object-contain',
css`
height: 60px;
border-radius: 16px;
`
)}
/>
<div className='flex-shrink-1 ml-2'>
2022-08-22 16:51:23 +08:00
<div className='line-clamp-1 text-16 font-medium text-night-100 transition-colors duration-400 group-hover:text-night-50'>
2022-08-03 23:48:39 +08:00
{video.name}
</div>
2022-08-22 16:51:23 +08:00
<div className='mt-1 text-14 font-bold text-night-500 transition-colors duration-400 group-hover:text-night-200'>
MV
</div>
<div className='mt-1.5 text-12 font-medium text-night-500 transition-colors duration-400 group-hover:text-night-200'>
2022-08-03 23:48:39 +08:00
{dayjs(video.publishTime).format('MMM DD, YYYY')}
</div>
</div>
2022-06-25 13:47:07 +08:00
</div>
2022-08-03 23:48:39 +08:00
)}
</>
2022-06-25 13:47:07 +08:00
)
}
const LatestRelease = () => {
2022-10-28 20:29:04 +08:00
const { t } = useTranslation()
2022-08-22 16:51:23 +08:00
const params = useParams()
const { data: albumsRaw, isLoading: isLoadingAlbums } = useArtistAlbums({
id: Number(params.id) || 0,
limit: 1000,
})
const album = useMemo(() => albumsRaw?.hotAlbums?.[0], [albumsRaw?.hotAlbums])
const { data: videos, isLoading: isLoadingVideos } = useArtistMV({
id: Number(params.id) || 0,
})
const video = videos?.mvs?.[0]
2022-06-25 13:47:07 +08:00
return (
2022-08-22 16:51:23 +08:00
<>
{!isLoadingVideos && !isLoadingAlbums && (
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
className='mx-2.5 lg:mx-0'
>
<div className='mb-3 mt-7 text-14 font-bold text-neutral-300'>
2022-10-28 20:29:04 +08:00
{t`artist.latest-releases`}
2022-08-22 16:51:23 +08:00
</div>
2022-06-25 13:47:07 +08:00
2022-08-22 16:51:23 +08:00
<Album album={album} />
<Video video={video} />
</motion.div>
)}
</>
2022-06-25 13:47:07 +08:00
)
}
export default LatestRelease