import Button, { Color as ButtonColor } from '@/web/components/Button' import Icon from '@/web/components/Icon' import Cover from '@/web/components/Cover' import useArtist from '@/web/api/hooks/useArtist' import useArtistAlbums from '@/web/api/hooks/useArtistAlbums' import { resizeImage } from '@/web/utils/common' import dayjs from 'dayjs' import TracksGrid from '@/web/components/TracksGrid' import CoverRow, { Subtitle } from '@/web/components/CoverRow' import Skeleton from '@/web/components/Skeleton' import useTracks from '@/web/api/hooks/useTracks' import { player } from '@/web/store' import { cx } from '@emotion/css' import { useCallback, useMemo } from 'react' import toast from 'react-hot-toast' import { useNavigate, useParams } from 'react-router-dom' const Header = ({ artist }: { artist: Artist | undefined }) => { const coverImage = resizeImage(artist?.img1v1Url || '', 'md') return ( <>
{coverImage && ( <> )}
{artist?.name}
) } const LatestRelease = ({ album, isLoading, }: { album: Album | undefined isLoading: boolean }) => { const navigate = useNavigate() const toAlbum = () => navigate(`/album/${album?.id}`) return (
最新发行
{isLoading ? ( ) : ( )}
{album?.name}
{album?.type} · {dayjs(album?.publishTime || 0).year()}
) } const PopularTracks = ({ tracks, isLoadingArtist, }: { tracks: Track[] | undefined isLoadingArtist: boolean }) => { const { data: tracksWithExtraInfo } = useTracks({ ids: tracks?.slice(0, 10)?.map(t => t.id) ?? [], }) const handlePlay = useCallback( (trackID: number | null = null) => { if (!tracks?.length) { toast('无法播放歌单') return } player.playAList( tracks.map(t => t.id), trackID ) }, [tracks] ) return (
热门歌曲
) } const Artist = () => { const params = useParams() const { data: artist, isLoading: isLoadingArtist } = useArtist({ id: Number(params.id) || 0, }) const { data: albumsRaw, isLoading: isLoadingAlbums } = useArtistAlbums({ id: Number(params.id) || 0, limit: 1000, }) const albums = useMemo(() => { if (!albumsRaw?.hotAlbums) return [] const albums: Album[] = [] albumsRaw.hotAlbums.forEach(album => { if (album.type !== '专辑') return false if (['混音版', '精选集', 'Remix'].includes(album.subType)) return false // No singles if (album.size <= 1) return false // No remixes if ( /(\(|\[)(.*)(Remix|remix)(.*)(\)|\])/.test( album.name.toLocaleLowerCase() ) ) { return false } // If have same name album only keep the Explicit version const sameNameAlbumIndex = albums.findIndex(a => a.name === album.name) if (sameNameAlbumIndex !== -1) { if (album.mark === 1056768) albums[sameNameAlbumIndex] = album return } albums.push(album) }) return albums }, [albumsRaw?.hotAlbums]) const singles = useMemo(() => { if (!albumsRaw?.hotAlbums) return [] const albumsIds = albums.map(album => album.id) return albumsRaw.hotAlbums.filter( album => albumsIds.includes(album.id) === false ) }, [albums, albumsRaw?.hotAlbums]) return (
{albumsRaw?.hotAlbums?.length !== 0 && ( )}
{/* Albums */} {albums.length !== 0 && (
专辑
)} {/* Singles/EP */} {singles.length !== 0 && (
单曲和EP
)}
) } export default Artist