import { useState, useEffect } from 'react' import { Loader2, Clock, Heart, Sparkles, Download } from 'lucide-react' import { useAuth } from '../lib/auth' import { getRecommendationHistory, getSavedRecommendations, toggleSaveRecommendation, exportSaved, type RecommendationItem } from '../lib/api' import RecommendationCard from '../components/RecommendationCard' type Tab = 'saved' | 'history' export default function Recommendations() { const { user } = useAuth() const [tab, setTab] = useState('saved') const [saved, setSaved] = useState([]) const [history, setHistory] = useState([]) const [loading, setLoading] = useState(true) const [savingIds, setSavingIds] = useState>(new Set()) useEffect(() => { const load = async () => { try { const [savedData, historyData] = await Promise.all([ getSavedRecommendations(), getRecommendationHistory(), ]) setSaved(savedData) setHistory(historyData) } catch { // silent } finally { setLoading(false) } } load() }, []) const handleToggleSave = async (id: string) => { setSavingIds((prev) => new Set(prev).add(id)) try { const { saved: isSaved } = await toggleSaveRecommendation(id) const updater = (items: RecommendationItem[]) => items.map((r) => (r.id === id ? { ...r, saved: isSaved } : r)) setSaved(updater) setHistory(updater) // If unsaved, remove from saved tab if (!isSaved) { setSaved((prev) => prev.filter((r) => r.id !== id)) } // If saved, add to saved tab if not already there if (isSaved) { const item = history.find((r) => r.id === id) if (item) { setSaved((prev) => prev.some((r) => r.id === id) ? prev : [...prev, { ...item, saved: true }] ) } } } catch { // silent } finally { setSavingIds((prev) => { const next = new Set(prev) next.delete(id) return next }) } } const items = tab === 'saved' ? saved : history if (loading) { return (
) } return (

Recommendations

Your discovered music

{/* Daily remaining */} {!user?.is_pro && (
{user?.daily_recommendations_remaining ?? 0} recommendations remaining today (free tier)
)} {/* Export + Tabs */}
{tab === 'saved' && saved.length > 0 && ( )}
{/* List */} {items.length === 0 ? (
{tab === 'saved' ? ( ) : ( )}

{tab === 'saved' ? 'No saved recommendations' : 'No recommendations yet'}

{tab === 'saved' ? 'Tap the heart icon on recommendations to save them here' : 'Head to the Discover page to get your first recommendations'}

) : (
{items.map((rec) => ( ))}
)}
) }