import useLyric from '@/web/api/hooks/useLyric' import usePlaylist from '@/web/api/hooks/usePlaylist' import useUserPlaylists from '@/web/api/hooks/useUserPlaylists' import player from '@/web/states/player' import { sample, chunk, sampleSize } from 'lodash-es' import { css, cx } from '@emotion/css' import { useState, useEffect, useMemo, useCallback, memo } from 'react' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' import Icon from '@/web/components/Icon' import { lyricParser } from '@/web/utils/lyric' import Image from '@/web/components/Image' import { resizeImage } from '@/web/utils/common' import { breakpoint as bp } from '@/web/utils/const' import useUser from '@/web/api/hooks/useUser' import { useTranslation } from 'react-i18next' const Lyrics = ({ tracksIDs }: { tracksIDs: number[] }) => { const { t } = useTranslation() const [id, setId] = useState(0) const { data: user } = useUser() useEffect(() => { if (id === 0) { setId(sample(tracksIDs) || 0) } }, [id, tracksIDs]) const { data: lyric } = useLyric({ id }) const lyricLines = useMemo(() => { if (!lyric?.lrc?.lyric) return [] const parsedLyrics = lyricParser(lyric) const lines = parsedLyrics.lyric.map(line => line.content) return sample(chunk(lines, 4)) ?? [] }, [lyric]) return (
{t('my.xxxs-liked-tracks', { nickname: user?.profile?.nickname })}
{lyricLines.map((line, index) => (
{line}
))}
) } const Covers = memo(({ tracks }: { tracks: Track[] }) => { return (
{tracks.map(track => ( ))}
) }) Covers.displayName = 'Covers' const PlayLikedSongsCard = () => { const { t } = useTranslation() const navigate = useNavigate() const { data: playlists } = useUserPlaylists() const { data: likedSongsPlaylist } = usePlaylist({ id: playlists?.playlist?.[0].id ?? 0, }) const handlePlay = useCallback( (e: React.MouseEvent) => { e.stopPropagation() player.playPlaylist(likedSongsPlaylist?.playlist.id) }, [likedSongsPlaylist?.playlist.id] ) const [sampledTracks, setSampledTracks] = useState([]) useEffect(() => { const tracks = likedSongsPlaylist?.playlist?.tracks if (!sampledTracks.length && tracks?.length) { setSampledTracks(sampleSize(tracks, 3)) } }, [likedSongsPlaylist?.playlist?.tracks, sampledTracks]) return (
{/* Lyrics and Covers */}
t.id)} />
{/* Buttons */}
) } export default PlayLikedSongsCard