'use client' import { useState } from 'react' import { useTranslations } from 'next-intl' import type { AccountRow } from '@/lib/admin-users' export function AdminUsersManager() { const t = useTranslations('Admin') const [q, setQ] = useState('') const [accounts, setAccounts] = useState([]) const [busy, setBusy] = useState(false) const [searched, setSearched] = useState(false) async function search(e: React.FormEvent) { e.preventDefault() if (q.trim().length < 2) return setBusy(true) try { const res = await fetch(`/api/admin/users?q=${encodeURIComponent(q.trim())}`, { credentials: 'same-origin' }) const data: { success?: boolean; accounts?: AccountRow[] } = await res.json() setAccounts(data.accounts ?? []) setSearched(true) } finally { setBusy(false) } } async function act(acc: AccountRow, action: 'ban' | 'unban') { let reason = '' let days = 0 if (action === 'ban') { reason = prompt(t('banReasonPrompt'), '') ?? '' if (reason === null) return const d = prompt(t('banDaysPrompt'), '0') if (d === null) return days = Number(d) || 0 } else if (!confirm(t('confirmUnban', { name: acc.username }))) { return } const res = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin', body: JSON.stringify({ accountId: acc.id, action, reason, days }), }) if ((await res.json()).success) { setAccounts((list) => list.map((a) => a.id === acc.id ? { ...a, banned: action === 'ban', ban_reason: action === 'ban' ? reason : null, ban_until: null } : a, ), ) } } return (
setQ(e.target.value)} placeholder={t('userSearchPlaceholder')} />{' '}
{searched && accounts.length === 0 ? (

{t('noUsers')}

) : ( {accounts.map((a) => ( ))}
{a.username}{' '} {a.gmlevel > 0 && [GM {a.gmlevel}]}{' '} {a.online && ● {t('online')}}{' '} {a.banned && ⛔ {t('banned')}}

#{a.id} {a.email && ` · ${a.email}`} {a.last_login && ` · ${t('lastLogin')}: ${new Date(a.last_login).toLocaleDateString()}`} {a.banned && a.ban_reason && ` · ${a.ban_reason}`} {a.banned && a.ban_until && ` (${new Date(a.ban_until).toLocaleDateString()})`}

{a.banned ? ( ) : ( )}
)}
) }