import { useState, useEffect } from 'react' import { Lightbulb, Loader2, Sparkles } from 'lucide-react' import { analyzeSong, type AnalyzeResponse } from '../lib/api' import RecommendationCard from '../components/RecommendationCard' import { toggleSaveRecommendation, dislikeRecommendation } from '../lib/api' export default function Analyze() { const [artist, setArtist] = useState('') const [title, setTitle] = useState('') const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [result, setResult] = useState(() => { try { const saved = sessionStorage.getItem('vynl_analyze_results') return saved ? JSON.parse(saved) : null } catch { return null } }) const [savingIds, setSavingIds] = useState>(new Set()) const [dislikingIds, setDislikingIds] = useState>(new Set()) useEffect(() => { if (result) { sessionStorage.setItem('vynl_analyze_results', JSON.stringify(result)) } }, [result]) const handleAnalyze = async () => { if (!artist.trim() || !title.trim()) return setLoading(true) setError('') setResult(null) try { const data = await analyzeSong(artist.trim(), title.trim()) setResult(data) } catch (err: any) { const msg = err.response?.data?.detail || err.message || 'Unknown error' setError(`Error: ${msg}`) } finally { setLoading(false) } } const handleToggleSave = async (id: string) => { const sid = String(id) setSavingIds((prev) => new Set(prev).add(sid)) try { const { saved } = await toggleSaveRecommendation(sid) setResult((prev) => prev ? { ...prev, recommendations: prev.recommendations.map((r) => String(r.id) === sid ? { ...r, saved } : r ), } : prev ) } catch { // silent } finally { setSavingIds((prev) => { const next = new Set(prev) next.delete(sid) return next }) } } const handleDislike = async (id: string) => { const sid = String(id) setDislikingIds((prev) => new Set(prev).add(sid)) try { const { disliked } = await dislikeRecommendation(sid) setResult((prev) => prev ? { ...prev, recommendations: prev.recommendations.map((r) => String(r.id) === sid ? { ...r, disliked } : r ), } : prev ) } catch { // silent } finally { setDislikingIds((prev) => { const next = new Set(prev) next.delete(sid) return next }) } } return (

Why Do I Like This?

Paste a song and discover what draws you to it, plus find similar music

{/* Input Form */}
setArtist(e.target.value)} placeholder="e.g., Radiohead" className="w-full px-4 py-3 bg-cream/50 border border-purple-100 rounded-xl text-charcoal placeholder:text-charcoal-muted/40 focus:outline-none focus:ring-2 focus:ring-purple/30 focus:border-purple transition-colors text-sm" />
setTitle(e.target.value)} placeholder="e.g., Everything In Its Right Place" className="w-full px-4 py-3 bg-cream/50 border border-purple-100 rounded-xl text-charcoal placeholder:text-charcoal-muted/40 focus:outline-none focus:ring-2 focus:ring-purple/30 focus:border-purple transition-colors text-sm" />
{error && (
{error}
)}
{/* Results */} {result && (
{/* Analysis Card */}

Why You Love This

{result.analysis}

{/* Qualities */} {result.qualities.length > 0 && (

Key Qualities

{result.qualities.map((quality, i) => ( {quality} ))}
)} {/* Similar Recommendations */} {result.recommendations.length > 0 && (

Songs With the Same Qualities

{result.recommendations.map((rec) => ( ))}
)}
)}
) }