2022-05-29 17:53:27 +08:00
|
|
|
import { resizeImage } from '@/web/utils/common'
|
|
|
|
import { css, cx } from '@emotion/css'
|
2022-06-14 23:23:34 +08:00
|
|
|
import { memo } from 'react'
|
2022-05-29 17:53:27 +08:00
|
|
|
import Image from './Image'
|
|
|
|
|
2022-06-08 00:07:04 +08:00
|
|
|
const Artist = ({ artist }: { artist: Artist }) => {
|
|
|
|
return (
|
|
|
|
<div className='text-center'>
|
|
|
|
<Image
|
|
|
|
alt={artist.name}
|
|
|
|
src={resizeImage(artist.img1v1Url, 'md')}
|
|
|
|
className={cx(
|
|
|
|
'aspect-square rounded-full',
|
|
|
|
css`
|
|
|
|
min-width: 96px;
|
|
|
|
min-height: 96px;
|
|
|
|
`
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
<div className='line-clamp-1 mt-2.5 text-12 font-medium text-neutral-700 dark:text-neutral-600 lg:text-14 lg:font-bold'>
|
|
|
|
{artist.name}
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2022-05-29 17:53:27 +08:00
|
|
|
const ArtistRow = ({
|
|
|
|
artists,
|
|
|
|
title,
|
|
|
|
className,
|
2022-06-08 00:07:04 +08:00
|
|
|
placeholderRow,
|
2022-05-29 17:53:27 +08:00
|
|
|
}: {
|
|
|
|
artists: Artist[] | undefined
|
|
|
|
title?: string
|
|
|
|
className?: string
|
2022-06-08 00:07:04 +08:00
|
|
|
placeholderRow?: number
|
2022-05-29 17:53:27 +08:00
|
|
|
}) => {
|
|
|
|
return (
|
|
|
|
<div className={className}>
|
|
|
|
{/* Title */}
|
|
|
|
{title && (
|
2022-06-09 20:16:05 +08:00
|
|
|
<h4
|
|
|
|
className={cx(
|
|
|
|
'text-12 font-medium uppercase dark:text-neutral-300 lg:text-14',
|
|
|
|
'mx-2.5 mb-6 lg:mx-0 lg:font-bold'
|
|
|
|
)}
|
|
|
|
>
|
2022-05-29 17:53:27 +08:00
|
|
|
{title}
|
|
|
|
</h4>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{/* Artists */}
|
2022-06-08 00:07:04 +08:00
|
|
|
{artists && (
|
2022-06-09 20:16:05 +08:00
|
|
|
<div className='no-scrollbar flex snap-x overflow-x-scroll lg:grid lg:w-auto lg:grid-cols-5 lg:gap-10'>
|
2022-06-08 00:07:04 +08:00
|
|
|
{artists.map(artist => (
|
2022-06-09 20:16:05 +08:00
|
|
|
<div className='snap-start px-2.5 lg:px-0' key={artist.id}>
|
2022-06-08 00:07:04 +08:00
|
|
|
<Artist artist={artist} key={artist.id} />
|
2022-05-29 17:53:27 +08:00
|
|
|
</div>
|
2022-06-08 00:07:04 +08:00
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
|
|
|
|
{/* Placeholder */}
|
|
|
|
{placeholderRow && !artists && (
|
2022-06-09 20:16:05 +08:00
|
|
|
<div className='no-scrollbar flex snap-x overflow-x-scroll lg:grid lg:w-auto lg:grid-cols-5 lg:gap-10'>
|
2022-06-08 00:07:04 +08:00
|
|
|
{[...new Array(placeholderRow * 5).keys()].map(i => (
|
2022-06-09 20:16:05 +08:00
|
|
|
<div className='snap-start px-2.5 lg:px-0' key={i}>
|
2022-06-08 11:48:22 +08:00
|
|
|
<div
|
|
|
|
className='aspect-square w-full rounded-full bg-white dark:bg-neutral-800'
|
|
|
|
style={{
|
|
|
|
minHeight: '96px',
|
|
|
|
minWidth: '96px',
|
|
|
|
}}
|
|
|
|
/>
|
2022-06-11 00:19:07 +08:00
|
|
|
<div className='mt-2.5 text-12 font-medium text-transparent lg:text-14 lg:font-bold'>
|
2022-06-08 00:07:04 +08:00
|
|
|
PLACE
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)}
|
2022-05-29 17:53:27 +08:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
2022-06-14 23:23:34 +08:00
|
|
|
const memoizedArtistRow = memo(ArtistRow)
|
|
|
|
memoizedArtistRow.displayName = 'ArtistRow'
|
|
|
|
export default memoizedArtistRow
|