import React, { useState, useEffect } from 'react'; import { Card } from '../ui/card'; import { Button } from '../ui/button'; import { Play, Heart, TrendingUp, Sparkles, Calendar, ArrowRight, Disc, Loader2 } from 'lucide-react'; import { Track } from '../../types'; import { useAudio } from '../../context/AudioContext'; import { trackService } from '../../services/trackService'; import { useToast } from '../../context/ToastContext'; import { logger } from '@/utils/logger'; const GENRES = [ { name: 'Synthwave', color: 'from-pink-500 to-purple-600' }, { name: 'Techno', color: 'from-gray-700 to-black' }, { name: 'Ambient', color: 'from-blue-400 to-teal-500' }, { name: 'Lo-Fi', color: 'from-orange-300 to-red-400' }, { name: 'Drum & Bass', color: 'from-yellow-400 to-orange-600' }, { name: 'House', color: 'from-indigo-500 to-blue-600' }, ]; export const DiscoverView: React.FC = () => { const { playTrack } = useAudio(); const { addToast } = useToast(); const [hoveredTrack, setHoveredTrack] = useState(null); const [trending, setTrending] = useState([]); const [newReleases, setNewReleases] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchData = async () => { try { setLoading(true); const [trendingRes, newRes] = await Promise.all([ trackService.list({ sort_by: 'trending', limit: 5 }), trackService.list({ sort_by: 'created_at', limit: 4 }) ]); setTrending(trendingRes.tracks); setNewReleases(newRes.tracks); } catch (e) { logger.error('Failed to load discovery data', { error: e instanceof Error ? e.message : String(e), stack: e instanceof Error ? e.stack : undefined, }); // Mock fallback setTrending([ { id: 't1', title: 'Midnight City', artist: 'M83', coverUrl: 'https://picsum.photos/id/10/300/300', duration: '4:03', durationSec: 243, play_count: 500000, like_count: 20000 } as unknown as Track, { id: 't2', title: 'Nightcall', artist: 'Kavinsky', coverUrl: 'https://picsum.photos/id/20/300/300', duration: '4:18', durationSec: 258, play_count: 450000, like_count: 18000 } as unknown as Track, ]); } finally { setLoading(false); } }; fetchData(); }, []); const handlePlay = (track: Track) => { playTrack(track, trending); }; if (loading) { return (
); } return (
{/* Hero / For You */}

For You

addToast("Playing Discovery Weekly")}>
Weekly Mix

Discover Weekly

Fresh tracks curated based on your listening history.

New Arrivals

Best of the week

UPDATED
{/* Trending Now */}

Trending Now

{trending.map((track, i) => (
setHoveredTrack(track.id)} onMouseLeave={() => setHoveredTrack(null)} onClick={() => handlePlay(track)} >
{i + 1}
{track.title}
{track.artist}
{track.play_count.toLocaleString()} plays
{track.duration}
))}
{/* New Releases */}

New Releases

{newReleases.map(release => (
handlePlay(release)}>

{release.title}

{release.artist}

))}
{/* Popular Genres */}

Browse by Genre

{GENRES.map(genre => (
addToast(`Browsing ${genre.name}`)} > {genre.name}
))}
); };