import { Music2 } from "lucide-react"; import { useEffect, useState } from "react"; import { Button } from "../ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"; import { Input } from "../ui/input"; interface MusicPlayerProps { loading: boolean; volume: number; onVolumeChange: (volume: number) => void; onQueue: (source: string) => void; onSkip: () => void; onStop: () => void; } export function MusicPlayer({ loading, volume, onVolumeChange, onQueue, onSkip, onStop, }: MusicPlayerProps) { const [source, setSource] = useState(""); const safeVolume = Number.isFinite(volume) ? Math.max(0, Math.min(1, volume)) : 1; const [draftVolume, setDraftVolume] = useState(Math.round(safeVolume * 100)); useEffect(() => { setDraftVolume(Math.round(safeVolume * 100)); }, [safeVolume]); useEffect(() => { const normalized = draftVolume / 100; if (Math.abs(normalized - safeVolume) < 0.001) return; const timer = window.setTimeout(() => { onVolumeChange(normalized); }, 150); return () => window.clearTimeout(timer); }, [draftVolume, onVolumeChange, safeVolume]); const submit = () => { const trimmed = source.trim(); if (!trimmed) return; onQueue(trimmed); setSource(""); }; return ( Music Player Play YouTube, Spotify tracks, search terms, or local files as audio. setSource(event.target.value)} onKeyDown={(event) => event.key === "Enter" && submit()} placeholder="YouTube URL, Spotify track, or search terms" />
Volume {draftVolume}%
setDraftVolume(Number(event.target.value))} className="h-2 w-full cursor-pointer accent-primary" />
); }