webapp/src/components/Article/AudioPlayer.tsx

67 lines
2.1 KiB
TypeScript
Raw Normal View History

2022-11-14 09:30:20 +00:00
import { createEffect, createMemo, createSignal, onMount } from 'solid-js'
2022-11-14 06:28:46 +00:00
import { For } from 'solid-js/web'
import type { Shout } from '../../graphql/types.gen'
2022-11-14 09:30:20 +00:00
import { Soundwave } from './Soundwave'
2022-11-14 06:28:46 +00:00
type MediaItem = any
export default (props: { shout: Shout }) => {
const media = createMemo<any[]>(() => {
if (props.shout.media) {
console.debug(props.shout.media)
return [...JSON.parse(props.shout.media)]
}
return []
})
2022-11-14 09:30:20 +00:00
let audioRef: HTMLAudioElement
2022-11-14 06:28:46 +00:00
const [currentTrack, setCurrentTrack] = createSignal(media()[0])
const [paused, setPaused] = createSignal(true)
const togglePlayPause = () => setPaused(!paused())
2022-11-14 09:30:20 +00:00
const playMedia = (m: MediaItem) => {
audioRef.src = m.get('src')
audioRef.play()
}
2022-11-14 06:28:46 +00:00
const [audioContext, setAudioContext] = createSignal<AudioContext>()
2022-11-14 09:30:20 +00:00
onMount(() => setAudioContext(new AudioContext()))
createEffect(() => (paused() ? audioRef.play : audioRef.pause)())
2022-11-14 06:28:46 +00:00
return (
<div class="audio-container">
<div class="audio-img">
<img
class="ligthbox-img lazyload zoom-in"
width="320"
height="320"
alt={props.shout.title}
title={props.shout.title}
src={props.shout.cover}
/>
</div>
<div class="audio-player-list">
2022-11-14 09:30:20 +00:00
<div class="player current-track">
<div class="player-title">{currentTrack().title}</div>
<i class="fas fa-pause fa-3x fa-fw" onClick={togglePlayPause}></i>
2022-11-14 06:28:46 +00:00
<div class="player-progress">
2022-11-14 09:30:20 +00:00
<Soundwave context={audioContext()} url={currentTrack().src} />
<span class="track-position">{`${audioRef.currentTime} / ${audioRef.duration}`}</span>
2022-11-14 06:28:46 +00:00
</div>
2022-11-14 09:30:20 +00:00
<audio ref={audioRef} />
2022-11-14 06:28:46 +00:00
</div>
2022-11-14 09:30:20 +00:00
<ul class="all-tracks">
2022-11-14 06:28:46 +00:00
<For each={media()}>
{(m: MediaItem) => (
2022-11-14 09:30:20 +00:00
<li>
2022-11-14 06:28:46 +00:00
<div class="player-status">
2022-11-14 09:30:20 +00:00
<i class="fas fa-play fa-fw" onClick={() => playMedia(m)}></i>
2022-11-14 06:28:46 +00:00
</div>
2022-11-14 09:30:20 +00:00
<span class="track-title">{m.title}</span>
2022-11-14 06:28:46 +00:00
</li>
)}
</For>
</ul>
</div>
</div>
)
}