import React, { useState, useEffect } from 'react'; import SongTable from './SongTable'; import NowPlaying from './NowPlaying'; import AddSongPanel from './AddSongPanel'; import { API, PlaylistItem } from '../api/player'; const App: React.FC = () => { const [isPlaying, setIsPlaying] = useState(false); const [nowPlayingSong, setNowPlayingSong] = useState(null); const [nowPlayingFileName, setNowPlayingFileName] = useState(null); const [songs, setSongs] = useState([]); const [ws, setWs] = useState(null); const fetchPlaylist = async () => { const playlist = await API.getPlaylist(); setSongs(playlist); }; const fetchNowPlaying = async () => { const nowPlaying = await API.getNowPlaying(); setNowPlayingSong(nowPlaying.nowPlaying); setNowPlayingFileName(nowPlaying.currentFile); setIsPlaying(!nowPlaying.isPaused); }; const handleAddURL = (url: string) => { const urlToAdd = url.trim(); if (urlToAdd) { API.addToPlaylist(urlToAdd); fetchPlaylist(); } }; const handleDelete = (index: number) => { setSongs(songs.filter((_, i) => i !== index)); API.removeFromPlaylist(index); fetchPlaylist(); fetchNowPlaying(); }; const handleSkipTo = async (index: number) => { const song = songs[index]; if (song.playing) { togglePlayPause(); } else { await API.skipTo(index); await API.play(); } fetchNowPlaying(); fetchPlaylist(); }; const togglePlayPause = async () => { if (isPlaying) { await API.pause(); } else { await API.play(); } fetchNowPlaying(); }; const handleSkip = async () => { await API.skip(); fetchNowPlaying(); }; const handlePrevious = async () => { await API.previous(); fetchNowPlaying(); }; const watchForEvents = () => { const ws = API.subscribeToEvents((event) => { switch (event.event) { case 'user_modify': case 'end-file': case 'playback-restart': fetchPlaylist(); fetchNowPlaying(); break; } }); return ws; }; useEffect(() => { fetchPlaylist(); fetchNowPlaying(); setWs(watchForEvents()); return () => { if (ws) { ws.close(); } }; }, []); return (
{songs.length > 0 ? ( ) : (
Playlist is empty
)}
); }; export default App;