71 lines
2.3 KiB
TypeScript
Raw Normal View History

2022-05-29 17:53:27 +08:00
import { formatDuration } from '@/web/utils/common'
import { css, cx } from '@emotion/css'
import { useMemo } from 'react'
import { player } from '@/web/store'
import { useSnapshot } from 'valtio'
2022-06-06 01:00:25 +08:00
import Wave from './Wave'
2022-06-08 00:07:04 +08:00
import Icon from '@/web/components/Icon'
2022-05-29 17:53:27 +08:00
const TrackList = ({
tracks,
onPlay,
className,
}: {
tracks?: Track[]
onPlay: (id: number) => void
className?: string
}) => {
const playerSnapshot = useSnapshot(player)
const playingTrack = useMemo(
() => playerSnapshot.track,
[playerSnapshot.track]
)
const handleClick = (e: React.MouseEvent<HTMLElement>, trackID: number) => {
if (e.detail === 2) onPlay?.(trackID)
}
2022-06-06 01:00:25 +08:00
const playing = useMemo(
() => playerSnapshot.state === 'playing',
[playerSnapshot.state]
)
2022-05-29 17:53:27 +08:00
return (
<div className={className}>
{tracks?.map(track => (
<div
key={track.id}
onClick={e => handleClick(e, track.id)}
2022-06-08 00:07:04 +08:00
className='group relative flex items-center py-2 text-16 font-medium text-neutral-200 transition duration-300 ease-in-out'
2022-05-29 17:53:27 +08:00
>
<div className='mr-6'>{String(track.no).padStart(2, '0')}</div>
2022-06-08 00:07:04 +08:00
<div className='flex flex-grow items-center'>
{track.name}
{playingTrack?.id === track.id && playing && (
<div className='ml-4'>
<Wave playing={playing} />
</div>
)}
</div>
<div className='mr-12 flex opacity-0 transition-opacity group-hover:opacity-100'>
<div className='mr-3 flex h-10 w-10 items-center justify-center rounded-full bg-brand-600 text-white/80'>
{/* <Icon name='play' className='h-7 w-7' /> */}
</div>
<div className='mr-3 flex h-10 w-10 items-center justify-center rounded-full bg-night-900 text-white/80'>
{/* <Icon name='play' className='h-7 w-7' /> */}
</div>
<div className='flex h-10 w-10 items-center justify-center rounded-full bg-night-900 text-white/80'>
{/* <Icon name='play' className='h-7 w-7' /> */}
</div>
</div>
2022-05-29 17:53:27 +08:00
<div className='text-right'>
{formatDuration(track.dt, 'en', 'hh:mm:ss')}
</div>
</div>
))}
</div>
)
}
export default TrackList