'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[] } const EMPTY_FORM = { email: '', name: '', phone: '', role: 'reporter' as UserRole, site_id: '', password: '' } export function UserManager({ users, sites }: Props) { const router = useRouter() const [busyId, setBusyId] = useState(null) const [error, setError] = useState(null) const [form, setForm] = useState(EMPTY_FORM) const [submitting, setSubmitting] = useState(false) const [confirmDeleteId, setConfirmDeleteId] = useState(null) 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 deleteUser = async (id: string) => { setBusyId(id) setError(null) const res = await fetch(`/api/admin/users?id=${encodeURIComponent(id)}`, { method: 'DELETE' }) setBusyId(null) setConfirmDeleteId(null) if (!res.ok) { const data = await res.json().catch(() => ({})) setError(data.error ?? 'Delete failed') return } router.refresh() } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setSubmitting(true) setError(null) const res = await fetch('/ims/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: form.email, name: form.name || undefined, phone: form.phone || undefined, role: form.role, site_id: form.site_id || undefined, password: form.password, }), }) setSubmitting(false) if (!res.ok) { const data = await res.json().catch(() => ({})) setError(data.error ?? 'Add failed') return } setForm(EMPTY_FORM) router.refresh() } return (

Users

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

{error}

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