import "./PlayerControls.css"; import type { PlayerState } from "../types"; import { type Accessor, createEffect, createSignal, type Setter, Show } from "solid-js"; import { NextTrackSVG, PauseSVG, PlaySVG, PreviousTrackSVG, RepeatSVG, ShuffleSVG, VolumeSVG } from "./SVG"; import { formatTime } from "../utils"; interface PlayerControlsProps { playerState: Accessor; setPlayerState: Setter; togglePlay: () => void; playPrevious: () => void; playNext: () => void; isShuffled: Accessor; setShuffled: Setter; isRepeated: Accessor; setRepeated: Setter; audioElement: HTMLAudioElement; } export default function PlayerControls(props: PlayerControlsProps) { const [controlsDisabled, setControlsDisabled] = createSignal(false); createEffect(() => { setControlsDisabled(!props.playerState().currentTrack); }); // Set volume function setVolume(e: Event) { const input = e.target as HTMLInputElement; const volume = Number.parseFloat(input.value); props.setPlayerState({ ...props.playerState(), volume, }); if (props.audioElement) { props.audioElement.volume = volume; } } // Seek to position function seekTo(e: MouseEvent) { const playerState = props.playerState(); if (!props.audioElement || !playerState.currentTrack) return; const progressBar = e.currentTarget as HTMLDivElement; const rect = progressBar.getBoundingClientRect(); const pos = (e.clientX - rect.left) / rect.width; const duration = playerState.currentTrack.duration; props.audioElement.currentTime = Math.min(pos * duration, playerState.buffered - 1); props.setPlayerState({ ...playerState, currentTime: pos * duration, }); } return (
{props.playerState().currentTrack?.name || "No track selected"}
{formatTime(props.playerState().currentTime)}/ {formatTime(props.playerState().currentTrack?.duration || 0)}
); }