import { useEffect, useMemo, useState } from 'react'; import { featuredGifs, getRecentGifs, type GifResult, rememberRecentGif, searchGifs, } from '../lib/tenor'; import { SpinnerIcon, XIcon } from './icons'; interface Props { open: boolean; onClose: () => void; onPick: (gif: GifResult) => void; } type Tab = 'trending' | 'search' | 'recent'; export function GifPicker({ open, onClose, onPick }: Props) { const [tab, setTab] = useState('trending'); const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const recent = useMemo(() => getRecentGifs(), [open]); useEffect(() => { if (!open) return; let cancelled = false; setLoading(true); setError(null); const run = async () => { try { const gifs = tab === 'search' && query.trim().length > 0 ? await searchGifs(query) : tab === 'trending' ? await featuredGifs() : []; if (!cancelled) setResults(gifs); } catch (err) { if (!cancelled) setError(err instanceof Error ? err.message : 'GIFs gerade nicht verfügbar'); } finally { if (!cancelled) setLoading(false); } }; void run(); return () => { cancelled = true; }; }, [open, tab, query]); if (!open) return null; const visible = tab === 'recent' ? recent : results; return (
{(['trending', 'search', 'recent'] as Tab[]).map((t) => ( ))}
{tab === 'search' && (
setQuery(e.target.value)} placeholder="GIFs suchen…" className="w-full rounded-md border border-line bg-surface-3 px-2 py-1.5 text-sm text-fg placeholder-fg-muted focus:border-accent focus:outline-none focus:ring-1 focus:ring-accent/40" />
)}
{loading && (
)} {error && (

{error === 'giphy_api_key_missing' ? 'GIFs sind nicht konfiguriert (VITE_GIPHY_API_KEY fehlt).' : 'GIFs gerade nicht verfügbar.'}

)} {!loading && !error && visible.length === 0 && (

{tab === 'recent' ? 'Noch keine zuletzt verwendeten GIFs.' : 'Keine Treffer.'}

)} {!loading && !error && visible.map((g) => ( ))}
); }