import { resizeImage } from '@/web/utils/common' import { cx } from '@emotion/css' import { useNavigate } from 'react-router-dom' import Image from './Image' import { prefetchAlbum } from '@/web/api/hooks/useAlbum' import { prefetchPlaylist } from '@/web/api/hooks/usePlaylist' import { memo, useCallback } from 'react' import dayjs from 'dayjs' import ArtistInline from './ArtistsInline' type ItemTitle = undefined | 'name' type ItemSubTitle = undefined | 'artist' | 'year' const Album = ({ album, itemTitle, itemSubtitle, }: { album: Album itemTitle?: ItemTitle itemSubtitle?: ItemSubTitle }) => { const navigate = useNavigate() const goTo = () => { navigate(`/album/${album.id}`) } const prefetch = () => { prefetchAlbum({ id: album.id }) } const title = itemTitle && { name: album.name, }[itemTitle] const subtitle = itemSubtitle && { artist: ( ), year: dayjs(album.publishTime || 0).year(), }[itemSubtitle] return (
{title && (
{title}
)} {subtitle &&
{subtitle}
}
) } const Playlist = ({ playlist }: { playlist: Playlist }) => { const navigate = useNavigate() const goTo = useCallback(() => { navigate(`/playlist/${playlist.id}`) }, [navigate, playlist.id]) const prefetch = useCallback(() => { prefetchPlaylist({ id: playlist.id }) }, [playlist.id]) return ( ) } const CoverRow = ({ albums, playlists, title, className, itemTitle, itemSubtitle, }: { title?: string className?: string albums?: Album[] playlists?: Playlist[] itemTitle?: ItemTitle itemSubtitle?: ItemSubTitle }) => { return (
{/* Title */} {title &&

{title}

} {/* Items */}
{albums?.map(album => ( ))} {playlists?.map(playlist => ( ))}
) } const memoizedCoverRow = memo(CoverRow) memoizedCoverRow.displayName = 'CoverRow' export default memoizedCoverRow