'use client'; import { formatErrorBanner } from '@/lib/api/toast-error'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Switch } from '@/components/ui/switch'; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetFooter } from '@/components/ui/sheet'; import { apiFetch } from '@/lib/api/client'; interface Role { id: string; name: string; } interface UserFormProps { open: boolean; onOpenChange: (open: boolean) => void; user?: { userId: string; displayName: string; email: string; phone: string | null; isActive: boolean; role: { id: string; name: string }; residentialAccess?: boolean; } | null; onSuccess: () => void; } export function UserForm({ open, onOpenChange, user, onSuccess }: UserFormProps) { const [roles, setRoles] = useState([]); const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [displayName, setDisplayName] = useState(''); const [phone, setPhone] = useState(''); const [roleId, setRoleId] = useState(''); const [isActive, setIsActive] = useState(true); const [residentialAccess, setResidentialAccess] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const isEdit = !!user; useEffect(() => { if (open) { void apiFetch<{ data: Role[] }>('/api/v1/admin/roles').then((res) => setRoles(res.data)); } }, [open]); useEffect(() => { if (open) { if (user) { setName(user.displayName); setEmail(user.email); setDisplayName(user.displayName); setPhone(user.phone ?? ''); setRoleId(user.role.id); setIsActive(user.isActive); setResidentialAccess(user.residentialAccess ?? false); setPassword(''); } else { setName(''); setEmail(''); setDisplayName(''); setPhone(''); setRoleId(''); setIsActive(true); setResidentialAccess(false); setPassword(''); } setError(null); } }, [open, user]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); setLoading(true); try { if (isEdit) { await apiFetch(`/api/v1/admin/users/${user.userId}`, { method: 'PATCH', body: { displayName, phone: phone || null, roleId, isActive, residentialAccess, }, }); } else { await apiFetch('/api/v1/admin/users', { method: 'POST', body: { name: name || displayName, email, password, displayName, phone: phone || undefined, roleId, residentialAccess, }, }); } onSuccess(); onOpenChange(false); } catch (err: unknown) { const message = formatErrorBanner(err); setError(message); } finally { setLoading(false); } } return ( {isEdit ? 'Edit User' : 'New User'}
{!isEdit && ( <>
setEmail(e.target.value)} placeholder="user@example.com" required />
setPassword(e.target.value)} placeholder="Min 12 characters" minLength={12} required />
)}
setDisplayName(e.target.value)} placeholder="John Smith" required />
setPhone(e.target.value)} placeholder="+1 555-0123" />

Grant this user access to residential clients and interests in addition to their primary role.

{isEdit && (

Disabled users cannot sign in

)} {error &&

{error}

}
); }