import React, { useState, useEffect } from 'react'; import { X, Download, CheckCircle, AlertCircle, Clock, Music, Loader } from 'lucide-react'; import { useSocket } from '../hooks/useSocket'; import './DownloadProgressModal.css'; interface DownloadItem { id: string; name: string; status: string; progress: number; timestamp: string; type: string; spotify_id?: string; track_name?: string; artist_name?: string; album_name?: string; track_number?: number; error?: string; } interface DownloadProgressModalProps { isOpen: boolean; onClose: () => void; } const DownloadProgressModal: React.FC = ({ isOpen, onClose }) => { const [downloads, setDownloads] = useState([]); const [activeDownloads, setActiveDownloads] = useState([]); const [completedDownloads, setCompletedDownloads] = useState([]); const [queuedDownloads, setQueuedDownloads] = useState([]); const { socket } = useSocket(); useEffect(() => { if (!socket || !isOpen) return; const handleDownloadUpdate = (data: any) => { console.log('📥 Download Progress Modal - Update received:', data); if (data.history && Array.isArray(data.history)) { const allDownloads = data.history.map((item: any) => ({ id: item.id || `download_${Date.now()}`, name: item.name || `${item.track_name || 'Unknown'} by ${item.artist_name || 'Unknown'}`, status: item.status || 'Unknown', progress: item.progress || 0, timestamp: item.timestamp || new Date().toISOString(), type: item.type || 'Track', spotify_id: item.spotify_id, track_name: item.track_name, artist_name: item.artist_name, album_name: item.album_name, track_number: item.track_number, error: item.error })); setDownloads(allDownloads); // Categorize downloads const active = allDownloads.filter((d: DownloadItem) => d.status === 'Downloading' || d.status === 'Processing' || d.status === 'Converting' ); const queued = allDownloads.filter((d: DownloadItem) => d.status === 'Queued' || d.status === 'Waiting' ); const completed = allDownloads.filter((d: DownloadItem) => d.status === 'Complete' || d.status === 'Downloaded' ); setActiveDownloads(active); setQueuedDownloads(queued); setCompletedDownloads(completed); } }; const handleDownloadStarted = (data: any) => { console.log('🚀 Download started:', data); }; const handleDownloadError = (data: any) => { console.log('❌ Download error:', data); }; const handleAlbumDownloadStarted = (data: any) => { console.log('🎵 Album download started:', data); }; socket.on('update_status', handleDownloadUpdate); socket.on('download_started', handleDownloadStarted); socket.on('download_error', handleDownloadError); socket.on('album_download_started', handleAlbumDownloadStarted); // Request current status when modal opens socket.emit('get_download_status'); return () => { socket.off('update_status', handleDownloadUpdate); socket.off('download_started', handleDownloadStarted); socket.off('download_error', handleDownloadError); socket.off('album_download_started', handleAlbumDownloadStarted); }; }, [socket, isOpen]); const getStatusIcon = (status: string) => { switch (status.toLowerCase()) { case 'downloading': case 'processing': case 'converting': return ; case 'queued': case 'waiting': return ; case 'complete': case 'downloaded': return ; case 'error': case 'failed': return ; default: return ; } }; const getStatusColor = (status: string) => { switch (status.toLowerCase()) { case 'downloading': case 'processing': case 'converting': return 'text-blue-500'; case 'queued': case 'waiting': return 'text-yellow-500'; case 'complete': case 'downloaded': return 'text-green-500'; case 'error': case 'failed': return 'text-red-500'; default: return 'text-gray-500'; } }; const formatTimestamp = (timestamp: string) => { try { return new Date(timestamp).toLocaleTimeString(); } catch { return 'Unknown time'; } }; if (!isOpen) return null; return (

Download Progress

{/* Active Downloads */} {activeDownloads.length > 0 && (

Active Downloads ({activeDownloads.length})

{activeDownloads.map((download) => (
{getStatusIcon(download.status)}
{download.name}
{download.status} {formatTimestamp(download.timestamp)} {download.album_name && ( Album: {download.album_name} )}
{download.progress}%
))}
)} {/* Queued Downloads */} {queuedDownloads.length > 0 && (

Queue ({queuedDownloads.length})

{queuedDownloads.map((download, index) => (
{getStatusIcon(download.status)}
{download.name}
Position #{index + 1} {formatTimestamp(download.timestamp)} {download.album_name && ( Album: {download.album_name} )}
))}
)} {/* Recent Completed Downloads */} {completedDownloads.length > 0 && (

Recently Completed ({completedDownloads.slice(0, 10).length})

{completedDownloads.slice(0, 10).map((download) => (
{getStatusIcon(download.status)}
{download.name}
{download.status} {formatTimestamp(download.timestamp)} {download.album_name && ( Album: {download.album_name} )}
))}
)} {/* Empty State */} {downloads.length === 0 && (

No Downloads

Your downloads will appear here with real-time progress updates.

)}
); }; export default DownloadProgressModal;