'use client' import { useState } from 'react' import { useRouter } from 'next/navigation' import { ALL_ROLES, type UserRole } from '@/lib/auth/roles' export type AdminUser = { id: string name: string email: string role: string department: string | null site_id: string | null active: boolean } export type SiteOption = { id: string; name: string } interface Props { users: AdminUser[] sites: SiteOption[] } export function UserManager({ users, sites }: Props) { const router = useRouter() const [busyId, setBusyId] = useState(null) const [error, setError] = useState(null) const [invite, setInvite] = useState({ email: '', name: '', role: 'reporter' as UserRole, site_id: '' }) const [inviting, setInviting] = useState(false) const patchUser = async (id: string, update: Record) => { setBusyId(id) setError(null) const res = await fetch('/ims/api/admin/users', { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id, ...update }), }) setBusyId(null) if (!res.ok) { const data = await res.json().catch(() => ({})) setError(data.error ?? 'Update failed') return } router.refresh() } const sendInvite = async (e: React.FormEvent) => { e.preventDefault() setInviting(true) setError(null) const res = await fetch('/ims/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...invite, site_id: invite.site_id || undefined }), }) setInviting(false) if (!res.ok) { const data = await res.json().catch(() => ({})) setError(data.error ?? 'Invite failed') return } setInvite({ email: '', name: '', role: 'reporter', site_id: '' }) router.refresh() } return (

Users

setInvite(v => ({ ...v, email: e.target.value }))} className="border border-gray-300 rounded-lg px-3 py-2 text-sm w-52" /> setInvite(v => ({ ...v, name: e.target.value }))} className="border border-gray-300 rounded-lg px-3 py-2 text-sm w-40" />
{error &&

{error}

}
{users.map(u => ( ))}
Name Email Role Site Status
{u.name || '—'} {u.email}
) }