'use client' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { className, classColor, raceName } from '@/lib/wow-data' type Char = { guid: number; name: string; race: number; gender: number; class: number; level: number } const RACE_SLUG: Record = { 1: 'human', 2: 'orc', 3: 'dwarf', 4: 'nightelf', 5: 'scourge', 6: 'tauren', 7: 'gnome', 8: 'troll', 9: 'goblin', 10: 'bloodelf', 11: 'draenei', 22: 'worgen', } const raceIcon = (r: number, g: number) => `https://wow.zamimg.com/images/wow/icons/large/race_${RACE_SLUG[r] || 'human'}_${g === 1 ? 'female' : 'male'}.jpg` export function ForumCharacterPicker({ locale, initialChars, initialCurrent, labels, }: { locale: string initialChars: Char[] initialCurrent: number | null labels: { postingAs: string; change: string; title: string; filter: string; empty: string; auto: string } }) { const router = useRouter() const [open, setOpen] = useState(false) const [chars] = useState(initialChars) const [current, setCurrent] = useState(initialCurrent) const [q, setQ] = useState('') const [saving, setSaving] = useState(false) useEffect(() => { if (!open) return const onKey = (e: KeyboardEvent) => e.key === 'Escape' && setOpen(false) window.addEventListener('keydown', onKey) return () => window.removeEventListener('keydown', onKey) }, [open]) if (chars.length === 0) return null const currentChar = chars.find((c) => c.guid === current) const shown = q.trim() ? chars.filter((c) => c.name.toLowerCase().includes(q.trim().toLowerCase())) : chars const pick = async (guid: number) => { if (saving) return setSaving(true) try { const res = await fetch('/api/forum/character', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ guid }), }) if (res.ok) { setCurrent(guid) setOpen(false) router.refresh() } } finally { setSaving(false) } } return (
{labels.postingAs}{' '} {currentChar ? ( {currentChar.name} ) : ( {labels.auto} )} {open && (
setOpen(false)}>
e.stopPropagation()}>

{labels.title}

setQ(e.target.value)} placeholder={labels.filter} autoFocus />
{shown.length === 0 ? (

{labels.empty}

) : ( shown.map((c) => ( )) )}
)}
) }