import player from '@/web/states/player' import { css, cx } from '@emotion/css' import { useSnapshot } from 'valtio' import Image from '@/web/components/Image' import Icon from '@/web/components/Icon' import useCoverColor from '@/web/hooks/useCoverColor' import { resizeImage } from '@/web/utils/common' import { motion, PanInfo } from 'framer-motion' import { useLockBodyScroll } from 'react-use' import { useState } from 'react' import useUserLikedTracksIDs, { useMutationLikeATrack, } from '@/web/api/hooks/useUserLikedTracksIDs' import uiStates from '@/web/states/uiStates' import { ease } from '@/web/utils/const' const LikeButton = () => { const { track } = useSnapshot(player) const { data: likedIDs } = useUserLikedTracksIDs() const isLiked = !!likedIDs?.ids?.find(id => id === track?.id) const likeATrack = useMutationLikeATrack() return ( ) } const PlayerMobile = () => { const { track, state } = useSnapshot(player) const bgColor = useCoverColor(track?.al?.picUrl ?? '') const [locked, setLocked] = useState(false) useLockBodyScroll(locked) const { mobileShowPlayingNext } = useSnapshot(uiStates) const onDragEnd = ( event: MouseEvent | TouchEvent | PointerEvent, info: PanInfo ) => { console.log(JSON.stringify(info)) const { x, y } = info.offset const offset = 100 if (y > -100) { if (x > offset) player.prevTrack() if (x < -offset) player.nextTrack() } setLocked(false) } return (
{/* Handler */} {!mobileShowPlayingNext && ( { uiStates.mobileShowPlayingNext = true }} className={cx( 'absolute right-0 left-0 flex justify-center', css` --height: 20px; height: var(--height); top: calc(var(--height) * -1); ` )} initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }} transition={{ ease, duration: 0.2 }} > )} {/* Cover */}
{/* Track info */}
setLocked(true)} onDragEnd={onDragEnd} dragDirectionLock={true} className='flex h-full flex-grow items-center ' >
{track?.name}
{track?.ar?.map(a => a.name).join(', ')}
{/* Like */} {/* Play or pause */}
) } export default PlayerMobile