import { useState, useEffect } from 'react' import { ListMusic, Loader2, Save, Copy, Check, ExternalLink } from 'lucide-react' import { generatePlaylist, type GeneratedPlaylistResponse } from '../lib/api' const COUNT_OPTIONS = [15, 20, 25, 30] export default function PlaylistGenerator() { const [theme, setTheme] = useState('') const [count, setCount] = useState(25) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [result, setResult] = useState(() => { try { const saved = sessionStorage.getItem('vynl_playlist_gen_results') return saved ? JSON.parse(saved) : null } catch { return null } }) const [saving, setSaving] = useState(false) const [saved, setSaved] = useState(false) const [copied, setCopied] = useState(false) useEffect(() => { if (result) { sessionStorage.setItem('vynl_playlist_gen_results', JSON.stringify(result)) } }, [result]) const handleGenerate = async () => { if (!theme.trim()) return setLoading(true) setError('') setResult(null) setSaved(false) try { const data = await generatePlaylist(theme.trim(), count) setResult(data) } catch (err: any) { const msg = err.response?.data?.detail || err.message || 'Unknown error' setError(`Error: ${msg}`) } finally { setLoading(false) } } const handleSave = async () => { if (!theme.trim() || saving || saved) return setSaving(true) try { const data = await generatePlaylist(theme.trim(), count, true) setResult(data) setSaved(true) } catch (err: any) { setError('Failed to save playlist') } finally { setSaving(false) } } const handleCopyText = () => { if (!result) return const text = result.tracks .map((t, i) => `${i + 1}. ${t.artist} - ${t.title}`) .join('\n') navigator.clipboard.writeText(`${result.name}\n\n${text}`) setCopied(true) setTimeout(() => setCopied(false), 2000) } return (
{/* Header */}

Playlist Generator

Describe a vibe and get a full playlist

{/* Input Section */}
setTheme(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && !loading && handleGenerate()} placeholder="Road trip through the desert, Rainy day reading, 90s nostalgia party..." className="w-full px-4 py-3 rounded-xl border border-purple-200 focus:border-purple focus:ring-2 focus:ring-purple/20 outline-none text-charcoal placeholder:text-charcoal-muted/50 bg-cream/30" /> {/* Count Selector */}
{COUNT_OPTIONS.map((n) => ( ))}
{/* Generate Button */}
{/* Error */} {error && (

{error}

)} {/* Results */} {result && (
{/* Playlist Header */}

{result.name}

{result.description}

{result.tracks.length} tracks

{/* Actions */}
{/* Track List */}
{result.tracks.map((track, index) => (
{index + 1}
{track.title} {track.artist} {track.youtube_url && ( )}

{track.reason}

))}
)}
) }