import ArtistInline from './ArtistsInline' import IconButton from './IconButton' import Slider from './Slider' import SvgIcon from './SvgIcon' import useUserLikedTracksIDs, { useMutationLikeATrack, } from '@/web/hooks/useUserLikedTracksIDs' import { player, state } from '@/web/store' import { resizeImage } from '@/web/utils/common' import { State as PlayerState, Mode as PlayerMode, } from '@/web/utils/player' import { RepeatMode as PlayerRepeatMode } from '@/shared/playerDataTypes' import cx from 'classnames' import { useSnapshot } from 'valtio' import { useMemo } from 'react' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' const PlayingTrack = () => { const navigate = useNavigate() const snappedPlayer = useSnapshot(player) const track = useMemo(() => snappedPlayer.track, [snappedPlayer.track]) const trackListSource = useMemo( () => snappedPlayer.trackListSource, [snappedPlayer.trackListSource] ) // Liked songs ids const { data: userLikedSongs } = useUserLikedTracksIDs() const mutationLikeATrack = useMutationLikeATrack() const hasTrackListSource = snappedPlayer.mode !== PlayerMode.FM && trackListSource?.type const toAlbum = () => { const id = track?.al?.id if (id) navigate(`/album/${id}`) } const toTrackListSource = () => { if (hasTrackListSource) navigate(`/${trackListSource.type}/${trackListSource.id}`) } return ( <> {track && (
{track?.al?.picUrl && ( )} {!track?.al?.picUrl && (
)}
{track?.name}
track?.id && mutationLikeATrack.mutate(track.id)} >
)} {!track &&
} ) } const MediaControls = () => { const playerSnapshot = useSnapshot(player) const state = useMemo(() => playerSnapshot.state, [playerSnapshot.state]) const track = useMemo(() => playerSnapshot.track, [playerSnapshot.track]) const mode = useMemo(() => playerSnapshot.mode, [playerSnapshot.mode]) return (
{mode === PlayerMode.TrackList && ( track && player.prevTrack()} disabled={!track} > )} {mode === PlayerMode.FM && ( player.fmTrash()}> )} track && player.playOrPause()} disabled={!track} className='after:rounded-xl' > track && player.nextTrack()} disabled={!track}>
) } const Others = () => { const playerSnapshot = useSnapshot(player) const switchRepeatMode = () => { if (playerSnapshot.repeatMode === PlayerRepeatMode.Off) { player.repeatMode = PlayerRepeatMode.On } else if (playerSnapshot.repeatMode === PlayerRepeatMode.On) { player.repeatMode = PlayerRepeatMode.One } else { player.repeatMode = PlayerRepeatMode.Off } } return (
toast('Work in progress')} disabled={playerSnapshot.mode === PlayerMode.FM} > toast('施工中...')} disabled={playerSnapshot.mode === PlayerMode.FM} > toast('施工中...')}> {/* Lyric */} (state.uiStates.showLyricPanel = true)}>
) } const Progress = () => { const playerSnapshot = useSnapshot(player) const progress = useMemo( () => playerSnapshot.progress, [playerSnapshot.progress] ) const state = useMemo(() => playerSnapshot.state, [playerSnapshot.state]) const track = useMemo(() => playerSnapshot.track, [playerSnapshot.track]) return (
{track && ( { player.progress = value }} onlyCallOnChangeAfterDragEnded={true} /> )} {!track && (
)}
) } const Player = () => { return (
) } export default Player