import { average } from 'color.js' import { colord } from 'colord' import { player } from '@/store' import { resizeImage } from '@/utils/common' import SvgIcon from '@/components/SvgIcon' import ArtistInline from '@/components/ArtistsInline' import { State as PlayerState, Mode as PlayerMode } from '@/utils/player' const MediaControls = () => { const classes = 'btn-pressed-animation btn-hover-animation mr-1 cursor-default rounded-lg p-1.5 transition duration-200 after:bg-white/10' const playerSnapshot = useSnapshot(player) const state = useMemo(() => playerSnapshot.state, [playerSnapshot.state]) const playOrPause = () => { if (playerSnapshot.mode === PlayerMode.FM) { player.playOrPause() } else { player.playFM() } } return (
) } const FMCard = () => { const navigate = useNavigate() const [background, setBackground] = useState('') const playerSnapshot = useSnapshot(player) const track = useMemo(() => playerSnapshot.fmTrack, [playerSnapshot.fmTrack]) const coverUrl = useMemo( () => resizeImage(track?.al?.picUrl ?? '', 'md'), [track?.al?.picUrl] ) useEffect(() => { const cover = resizeImage(track?.al?.picUrl ?? '', 'xs') if (cover) { average(cover, { amount: 1, format: 'hex', sample: 1 }).then(color => { let c = colord(color as string) const hsl = c.toHsl() if (hsl.s > 50) c = colord({ ...hsl, s: 50 }) if (hsl.l > 50) c = colord({ ...c.toHsl(), l: 50 }) if (hsl.l < 30) c = colord({ ...c.toHsl(), l: 30 }) const to = c.darken(0.15).rotate(-5).toHex() setBackground(`linear-gradient(to bottom, ${c.toHex()}, ${to})`) }) } }, [track?.al?.picUrl]) return (
{coverUrl ? ( track?.al?.id && navigate(`/album/${track.al.id}`)} className='rounded-lg shadow-2xl' src={coverUrl} /> ) : (
)}
{/* Track info */}
{track ? (
{track?.name}
) : (
PLACEHOLDER12345
)} {track ? ( ) : (
PLACEHOLDER
)}
{track ? :
} {/* FM logo */}
私人FM
) } export default FMCard