import React from "react" import { Tag, Button } from "antd" import classnames from "classnames" import Marquee from "react-fast-marquee" import useHideOnMouseStop from "@hooks/useHideOnMouseStop" import { Icons } from "@components/Icons" import Controls from "@components/Player/Controls" import { usePlayerStateContext } from "@contexts/WithPlayerContext" function isOverflown(element) { if (!element) { return false } return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth; } const PlayerController = React.forwardRef((props, ref) => { const [playerState] = usePlayerStateContext() const titleRef = React.useRef() const [hide, onMouseEnter, onMouseLeave] = useHideOnMouseStop({ delay: 3000, hideCursor: true }) const [titleIsOverflown, setTitleIsOverflown] = React.useState(false) const [currentTime, setCurrentTime] = React.useState(0) const [trackDuration, setTrackDuration] = React.useState(0) const [draggingTime, setDraggingTime] = React.useState(false) const [currentDragWidth, setCurrentDragWidth] = React.useState(0) const [syncInterval, setSyncInterval] = React.useState(null) async function onDragEnd(seekTime) { setDraggingTime(false) app.cores.player.controls.seek(seekTime) syncPlayback() } async function syncPlayback() { if (!playerState.track_manifest) { return false } const currentTrackTime = app.cores.player.controls.seek() setCurrentTime(currentTrackTime) } //* Handle when playback status change React.useEffect(() => { if (playerState.playback_status === "playing") { setSyncInterval(setInterval(syncPlayback, 1000)) } else { if (syncInterval) { clearInterval(syncInterval) } } }, [playerState.playback_status]) React.useEffect(() => { setTitleIsOverflown(isOverflown(titleRef.current)) setTrackDuration(app.cores.player.controls.duration()) }, [playerState.track_manifest]) React.useEffect(() => { syncPlayback() }, []) const isStopped = playerState.playback_status === "stopped" return
{

{ playerState.playback_status === "stopped" ? "Nothing is playing" : <> {playerState.track_manifest?.title ?? "Nothing is playing"} }

} { titleIsOverflown &&

{ isStopped ? "Nothing is playing" : <> {playerState.track_manifest?.title ?? "Untitled"} }

}
{playerState.track_manifest?.artistStr}
{ setDraggingTime(true) }} onMouseUp={(e) => { const rect = e.currentTarget.getBoundingClientRect() const seekTime = trackDuration * (e.clientX - rect.left) / rect.width onDragEnd(seekTime) }} onMouseMove={(e) => { const rect = e.currentTarget.getBoundingClientRect() const atWidth = (e.clientX - rect.left) / rect.width * 100 setCurrentDragWidth(atWidth) }} >
{ playerState.track_manifest?.metadata.lossless && } bordered={false} > Lossless } { playerState.track_manifest?.explicit && Explicit } { props.lyrics?.sync_audio_at && } > Video } { props.lyrics?.available_langs?.length > 1 &&
}) export default PlayerController