"use client"; import { useState } from "react"; import { useSnap } from "@/lib/client"; import { Dialog, ErrorLine, Field } from "@/components/ui"; import type { UserRec } from "@/lib/compute"; /** Add a user, or edit one (role, name, new password, deactivate). */ export default function UserDialog({ user, onClose }: { user: UserRec | null; onClose: () => void }) { const { s, mutate } = useSnap(); const [f, setF] = useState({ first: user?.first || "", last: user?.last || "", title: user?.title || "", email: user?.email || "", role: user?.role || "ISSUER", password: "" }); const [err, setErr] = useState(""); const invalid = !f.first.trim() || !f.last.trim() || (!user && (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(f.email) || f.password.length < 8)) || (!!user && f.password !== "" && f.password.length < 8); async function save() { if (invalid) return; const r = user ? await mutate("users.update", { id: user.id, first: f.first, last: f.last, title: f.title, role: f.role, password: f.password }) : await mutate("users.add", f); if (!r.ok) { setErr(r.error); return; } onClose(); } async function remove() { if (!user || !confirm(`Deactivate ${user.first} ${user.last}'s login? They can be reactivated later.`)) return; const r = await mutate("users.remove", { id: user.id }); if (!r.ok) { setErr(r.error); return; } onClose(); } return (
{(c) => setF({ ...f, first: e.target.value })} />} {(c) => setF({ ...f, last: e.target.value })} />} {(c) => setF({ ...f, title: e.target.value })} placeholder="e.g. Linen Room Assistant" />} {(c) => } {(c) => setF({ ...f, email: e.target.value })} disabled={!!user} />} {(c) => setF({ ...f, password: e.target.value })} />}
{user && user.id !== s.session.userId && }
); }