Adds track information to player
This commit is contained in:
parent
1b67be3a8f
commit
321f6082a4
@ -1,5 +1,6 @@
|
|||||||
import {useState} from "react";
|
import {useEffect, useState} from "react";
|
||||||
import hostName from "./Config.ts";
|
import hostName from "./Config.ts";
|
||||||
|
import {TrackInfo} from "./TrackInfo.tsx";
|
||||||
|
|
||||||
interface AlbumPlayerProps {
|
interface AlbumPlayerProps {
|
||||||
albumHash: string
|
albumHash: string
|
||||||
@ -7,9 +8,36 @@ interface AlbumPlayerProps {
|
|||||||
|
|
||||||
export default function AlbumPlayer(props: Readonly<AlbumPlayerProps>) {
|
export default function AlbumPlayer(props: Readonly<AlbumPlayerProps>) {
|
||||||
const [trackNum, setTrackNum] = useState(1)
|
const [trackNum, setTrackNum] = useState(1)
|
||||||
|
const [trackInfo, setTrackInfo] = useState<TrackInfo>()
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (props.albumHash) {
|
||||||
|
let fetched = fetch(`${hostName}/track/${props.albumHash}/${trackNum}`)
|
||||||
|
fetched.then(response => {
|
||||||
|
if (response.ok) {
|
||||||
|
response.json().then(body => {
|
||||||
|
setTrackInfo(body)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, [props.albumHash, trackNum])
|
||||||
|
|
||||||
function handleNextTrack() {
|
function handleNextTrack() {
|
||||||
setTrackNum(trackNum+1)
|
setTrackNum(trackNum+1)
|
||||||
}
|
}
|
||||||
return <div className={"player-position"}><audio controls={true} autoPlay={true} src={`${hostName}/music/album/${props.albumHash}/${trackNum}`} onEnded={handleNextTrack}/></div>
|
|
||||||
|
if(props.albumHash) {
|
||||||
|
return (
|
||||||
|
<div className={"player"}>
|
||||||
|
<div>{trackInfo?.artist ?? ""} - {trackInfo?.trackTitle ?? ""}</div>
|
||||||
|
<audio title={trackInfo?.trackTitle} controls={true} autoPlay={true} preload={"metadata"}
|
||||||
|
src={`${hostName}/music/album/${props.albumHash}/${trackNum}`}
|
||||||
|
onEnded={handleNextTrack} />
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return <div className={"player"}></div>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -26,7 +26,8 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.player-position {
|
.player {
|
||||||
|
background: rgba(0,0,0,0.5);
|
||||||
position: -webkit-sticky;
|
position: -webkit-sticky;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|||||||
@ -23,7 +23,6 @@ function App() {
|
|||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
function handleAlbumClick(event: React.MouseEvent<HTMLElement>) {
|
function handleAlbumClick(event: React.MouseEvent<HTMLElement>) {
|
||||||
console.log(event.currentTarget.id)
|
|
||||||
setSelectedAlbum(event.currentTarget.id)
|
setSelectedAlbum(event.currentTarget.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
src/TrackInfo.tsx
Normal file
5
src/TrackInfo.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export interface TrackInfo {
|
||||||
|
albumTitle: string,
|
||||||
|
artist: string,
|
||||||
|
trackTitle: string
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user