'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')} className="nw-input flex-1" />
{searched && accounts.length === 0 ? (

{t('noUsers')}

) : ( )}
) }