import { useState } from 'react' import { de } from '../strings/de' import { ApiError, errorCode } from '../api/client' import { NAMEGEN_USAGES, suggestNames, type NamegenUsageCode, type NameSuggestion } from '../api/names' import './NameSuggestPanel.css' interface NameSuggestPanelProps { gender: string onPick: (name: string) => void onClose: () => void } const ALL_CODES = NAMEGEN_USAGES.map((u) => u.code) as NamegenUsageCode[] export default function NameSuggestPanel({ gender, onPick, onClose }: NameSuggestPanelProps) { const t = de.namegen const [letter, setLetter] = useState('') const [usages, setUsages] = useState>(new Set(ALL_CODES)) const [loading, setLoading] = useState(false) const [keyMissing, setKeyMissing] = useState(false) const [error, setError] = useState(null) const [suggestions, setSuggestions] = useState([]) const [fetched, setFetched] = useState(false) function toggleUsage(code: NamegenUsageCode) { setUsages((prev) => { const next = new Set(prev) if (next.has(code)) next.delete(code) else next.add(code) return next }) } async function load() { setLoading(true) setError(null) setKeyMissing(false) setSuggestions([]) try { const result = await suggestNames({ letter: letter.trim() || undefined, gender: gender || undefined, usages: [...usages] as NamegenUsageCode[], count: 6, }) setSuggestions(result) setFetched(true) } catch (err) { if (errorCode(err) === 'NamesKeyMissing') { setKeyMissing(true) } else { setError(err instanceof ApiError ? err.message : de.api.errors.unknown) } } finally { setLoading(false) } } return (
{t.panelTitle}
setLetter(e.target.value)} placeholder={t.letterPlaceholder} maxLength={1} />
{t.usagesLabel}
{NAMEGEN_USAGES.map(({ code, label }) => ( ))}
{keyMissing &&

{t.keyMissing}

} {error &&

{error}

} {fetched && !loading && !keyMissing && !error && suggestions.length === 0 && (

{t.empty}

)} {suggestions.length > 0 && (
    {suggestions.map((s, i) => (
  • {s.meaning} {s.origin}
  • ))}
)}
) }